所以我尝试添加像这样的延迟脚本标签
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
?
谢谢!
答案 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属性是布尔属性,用于指示>应该执行脚本。
更新:看起来如果将属性设置为空字符串,它将添加没有值的属性。这也是一种选择。