13

だから私はこのような遅延スクリプトタグを追加しようとします

const script = document.createElement('script');
  script.setAttribute('src', '/script.js');
  script.setAttribute('type', 'text/javascript');
  script.setAttribute('defer', true);//this is the code in question!
  document.getElementsByTagName('body')[0].appendChild(script);

しかし、結果のスクリプトタグがただの代わりにdefer属性のようなものを生成することがわかりました。defer=truedefer

それらは同じですか?defer=trueではなく行う場合の意味は何deferですか?

ありがとう!

4

2 に答える 2

26

私はそれを次のように変更します:

script.setAttribute("defer", "defer");

それらは通常同じように動作します (技術的には、defer などの属性の値は「true」または「false」であってはならないことがドキュメントに記載されています) - または、少なくともブール属性を使用したすべてのブラウザーで。属性deferは通常、次のように実装されます。 script タグに存在する場合に有効になります。その値は無視されます。

そうは言っても、仕様では、ブール属性の値が存在してはならないか、それ以外の場合は、先頭/末尾の空白なしでそれ自体に設定する必要があることを指定しています (大文字と小文字は区別されません)。そのため、動的に設定する場合は、値を属性の名前のままにしておくことをお勧めします。

ブール属性 (HTML5) については、次のドキュメントを参照してください: https://www.w3.org/TR/html5/infrastructure.html#boolean-attribute

そのドキュメントからの引用:

多くの属性はブール属性です。要素にブール属性が存在する場合は真の値を表し、属性が存在しない場合は偽の値を表します。

属性が存在する場合、その値は空の文字列か、大文字と小文字を区別せずに属性の正規名に一致し、先頭または末尾に空白がない値である必要があります。

注:値「true」および「false」は、ブール属性では使用できません。偽の値を表すには、属性を完全に省略する必要があります。

defer 属性に関するこのドキュメント (HTML5): https://www.w3.org/TR/html5/scripting-1.html#attr-script-defer

それは述べています:

async および defer 属性は、スクリプトの実行方法を示すブール属性です。

更新:属性を空の文字列に設定すると、値のない属性が追加されるようです。これもオプションです。

于 2017-03-23T19:36:38.820 に答える