HTML5 〜 フォームを多機能にする新要素を試してみた

http://wbs-newworld.appspot.com/html5studyNewElement.html

今回試したHTML5の新要素は下記3つである。

  • 出力値を表すouput要素
  • 事前定義されたデータのリストdatalist要素
  • 処理の進捗率を表すprogress要素

なお、@ITの「HTML5とかアプリ開発入門」参考にしている。

さて、出力値を表すouput要素だが、例えば下記のように2つのinputタグの数値を合計してテキスト出力することができる。

!-- for属性を用いて、num1とnum2から生成された値であることを明示 -->
<output for="num1 num2" id="result"></output>
<!-- output要素のvalueプロパティに値を指定すると、出力値を書き換えることができる -->
<button onclick="document.getElementById('result').value =
                 parseInt(document.getElementById('num1').value, 10) +
                 parseInt(document.getElementById('num2').value, 10)">
  計算
</button>

ただ、使い方はわかるのだが、これで何が便利になったのかが分からない。
きっとこれまで何かが不便だったから便利にするために、機能追加に至ったはずだが、分からないので今は考えないようにしておこうと思った。

次に、事前定義されたデータのリストdatalist要素であるが、下記コードを書くと、バナナ、りんご、オレンジをリスト表示できる。
また、input要素のlist属性にdatalist要素のIDを指定することで、入力値の候補を表示できる。
この機能は、入力候補を簡単に表示できるので有難味が分かりやすかった。

<!-- datalist要素のIDをlist属性に指定 -->
<input list="suggestions">
<!--
  datalist要素を使用。不可視の要素だが、未対応ブラウザでは要素の
  内容が表示されてしまうので、CSSで非表示にしている
-->
<datalist id="suggestions" style="display: none;">
  <option value="banana">バナナ</option>
  <option value="apple">りんご</option>
  <option value="orange">オレンジ</option>
</datalist><br>

最後に、処理の進捗率を表すprogress要素。
下記のように書くと、静的なプログレスバーが表示されるだけだ。
value属性の値がプログレスのパーセンテージ。50なので半分だ。

<progress value="50" max="100">50%</progress>

結局、動的なプログレスバーにするには、当然だがJavaScriptで処理を書かなければならない。
下記は、「HTML5とかアプリ開発入門」からの引用だが、このようにmax属性の値を動的に変更することで、動的なプログレスバーが作成できる。

<script>
  var progress = document.getElementsByTagName("progress")[0];
  var percentage = document.getElementById("percentage");

  // 500〜1000までの値を最大値とする
  progress.max = Math.random() * 500 + 500;
  progress.value = 0;

  // 定期的に繰り返す
  var timer = setInterval(function() {
    // 100までの値をランダムで進捗率にプラスする
    progress.value += Math.random() * 100;

    // positionの値に100をかけるとパーセンテージが分かる
    var percent = Math.floor(progress.position * 100);

    // 進捗率がマックスに達したら繰り返し処理終了
    if (progress.value >= progress.max) {
      percent = 100; // 強制的に100%と表示する
      clearInterval(timer);
    }
    // プログレスバーの横にパーセント表示
    // progress要素の中身も同時に更新する
    percentage.textContent = progress.textContent = percent + "%";
  }, 500);
</script>