noscript 要素
4.3.2 noscript 要素
- カテゴリー
- メタデータ・コンテンツ
- フロー・コンテンツ
- フレージング・コンテンツ
- この要素を使うことができるコンテキスト:
- 祖先に
noscript要素がないなら、HTML ドキュメントのhead要素の中。 - 祖先に
noscript要素がないなら、HTML ドキュメントの中でフレージング・コンテンツが期待される場所 - コンテンツ・モデル:
- スクリプティングが無効で、
head要素の中なら: 0個以上のlink要素、0個以上のstyle要素、0個以上のmeta要素。順番は任意。 - スクリプティングが無効で、
head要素の中でないなら:トランスペアレント。しかし、子孫にnoscript要素がないこと。 - そうでなければ:本文に与えられた要件に準拠するテキスト
- コンテンツ属性:
- グローバル属性
- DOMインタフェース:
HTMLElementを使う。
noscript 要素は、スクリプティングが有効であれば、何も表しません。スクリプティングが無効であれば、その子要素を表します。この要素は、ドキュメントのパース方法に作用することによって、スクリプティングをサポートするユーザーエージェントと、サポートしていないユーザーエージェントとで、異なるマークアップを提示するために使われます。
HTML ドキュメント内で使われたとき、利用可能なコンテンツ・モデルは、以下の通りです:
head要素の中で、noscript要素に対してスクリプティングが無効ならhead要素の中で、noscript要素に対してスクリプティングが有効なら-
noscript要素にはテキストしか入れてはいけません。ただし、コンテキスト要素としてのnoscript要素と、入力としてのテキスト・コンテンツを使って HTML フラグメント・パース・アルゴリズムを呼び出した結果が、link,style,meta要素のみから構成されるノードのリストでなければならず、パース・エラーがあってはいけない、という点については除きます。 head要素の外で、noscript要素に対してスクリプティングが無効なら-
noscript要素のコンテンツ・モデルはトランスペアレントです。ただし、そのnoscript要素は祖先にnoscript要素を持ってはいけないという制限が加わります。 head要素の外で、noscript要素に対してスクリプティングが有効なら-
noscript要素にはテキストしか入れてはいけません。ただし、そのテキストは、次のアルゴリズムのを実行したら、noscript要素もscript要素もない準拠ドキュメントとならなければいけないという点と、そのアルゴリズムの中で、HTML パーサーがパース・エラーを引き起こさないようでなければならないという点を除きます:- ドキュメントから、すべての
script要素を削除します。 - ドキュメント内のすべての
noscript要素のリストを作ります。そのリスト内のすべてのnoscript要素に対して、次の手順を実行します:- parent element を、
noscript要素の親要素とします。 - parent element の子のうち、
noscript要素の前にあるすべての子を取り出します。これらの要素を before children と呼びます。 - parent element の子のうち、
noscript要素の後にあるすべての子をを取り出します。これらの要素を after children と呼びます。 - s を、
noscript要素の子のテキストノードを連結したものにします。 - parent element の
innerHTML属性に、s の値をセットします。(これは、副作用として、noscript要素がドキュメントから削除されることになります。) - parent element の最初に、もともとの順番を維持したまま、before children を挿入します。
- parent element の最後に、もともとの順番を維持したまま、after children を挿入します。
- parent element を、
- ドキュメントから、すべての
これらすべての歪みは必要なのです。これは、歴史的な理由から、呼び出し時にスクリプティングが有効だったかそうでなかったかに基づいているHTML パーサーで、noscript 要素の扱いが異なるからです。
noscript 要素は、XML ドキュメントでは使ってはいけません。
noscript 要素は、HTML 構文でのみ効果があります。XHTML 構文ではまったく効果はありません。
noscript 要素には他に要件はありません。特に、noscript 要素の子は、その要素に対してスクリプティングが有効であったとしても、フォーム・サブミッション、スクリプティングなどから除外されるわけではありません。
次の例では、noscript 要素がスクリプトのフォールバックを提供するために使われています。
<form action="calcSquare.php">
<p>
<label for=x>Number</label>:
<input id="x" name="x" type="number">
</p>
<script>
var x = document.getElementById('x');
var output = document.createElement('p');
output.textContent = 'Type a number; it will be squared right then!';
x.form.appendChild(output);
x.form.onsubmit = function () { return false; }
x.oninput = function () {
var v = x.valueAsNumber;
output.textContent = v + ' squared is ' + v * v;
};
</script>
<noscript>
<input type=submit value="Calculate Square">
</noscript>
</form>
スクリプトが無効なとき、サーバー側で計算を行うためにボタンが現れます。スクリプトが有効なときは、その値は動的に計算されます。
noscript 要素は洗練された道具ではありません。スクリプトが有効であるにも関わらず、何らかの理由でページのスクリプトが失敗することもあるでしょう。このため、一般的には noscript の利用は避けた方が良いと言えます。代わりに、次の例のように、スクリプトが動かないページをもとに、スクリプトを使うページへと、動的にページを変更するよう、スクリプトを設計した方が良いと言えます:
<form action="calcSquare.php">
<p>
<label for=x>Number</label>:
<input id="x" name="x" type="number">
</p>
<input id="submit" type=submit value="Calculate Square">
<script>
var x = document.getElementById('x');
var output = document.createElement('p');
output.textContent = 'Type a number; it will be squared right then!';
x.form.appendChild(output);
x.form.onsubmit = function () { return false; }
x.oninput = function () {
var v = x.valueAsNumber;
output.textContent = v + ' squared is ' + v * v;
};
var submit = document.getElementById('submit');
submit.parentNode.removeChild(submit);
</script>
</form>
上記のテクニックは、XHTML でも役に立ちます。なぜなら、XHTML 構文では noscript がサポートされないのですから。
※ 原文:http://www.w3.org/TR/2011/WD-html5-20110525/scripting-1.html#the-noscript-element