使用纯javascript正确地将defer属性添加到脚本标记

时间:2017-03-23 19:34:55

标签: javascript setattribute script-tag deferred-loading

所以我尝试添加像这样的延迟脚本标签

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=true

它们是一样的吗?如果我defer而不是defer=true

,这意味着什么?

谢谢!

1 个答案:

答案 0 :(得分:10)

我会将其更改为:

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

它们的行为通常相同(尽管文档在技术上陈述了属性的值,例如defer不应该是" true"或false") - 或者至少在任何浏览器中我都会这样做。已使用布尔属性。属性defer通常用于在脚本标记中生效(如果存在)。它的价值被忽略了。

那就是说,规范指定布尔属性的值不应该存在,否则应该设置为自身,没有前导/尾随空格(情况无关紧要) )。因此,在动态设置时,最好将值保留为属性的名称。

有关布尔属性(HTML5),请参阅此文档:https://www.w3.org/TR/html5/infrastructure.html#boolean-attribute

引用该文档:

  

许多属性是布尔属性。元素上存在布尔属性表示真值,而   缺少属性表示错误值。

     

如果属性存在,则其值必须为空字符串   或者是属性的ASCII不区分大小写的匹配值   规范名称,没有前导或尾随空格。

     
    

注意:值" true"和"假"不允许在布尔属性上。     要表示false值,必须省略该属性     共

  

这个defer属性的文档(HTML5): https://www.w3.org/TR/html5/scripting-1.html#attr-script-defer

它声明:

  

async和defer属性是布尔属性,用于指示>应该执行脚本。

更新:看起来如果将属性设置为空字符串,它将添加没有值的属性。这也是一种选择。