我有一个HTML文档,其源代码的script
元素具有defer
属性。 W3C验证器表示它无效,因为它缺少src
属性,但实际上源中有src
属性:
<script defer type="text/javascript">if($(window).width()>1024){document.write("<"+"script src='js/jquery.preloader.js'></"+"script>");}</script>
我该怎么办?
答案 0 :(得分:1)
您有两个<script>
代码。
document.write
生成的一个。HTML一个看起来像这样:
<script defer type="text/javascript">…</script>
它没有src
属性。这就是你得到错误的原因。您不能拥有defer
属性。
JavaScript生成的内容如下所示:
if ($(window).width()>1024){
document.write("<"+"script src='js/jquery.preloader.js'></"+"script>");
}
它具有src
属性,并且没有defer
属性。您可以在此处添加defer
属性。
它也是JavaScript,因此无论如何都不会被验证者视为HTML。
答案 1 :(得分:1)
W3C HTML Checker(验证器)的维护者。
修复方法是将脚本内容放入单独的文件中,并使用src
属性来引用它。
检查器报告问题中标记片段的错误,因为HTML规范用于明确声明script
不能具有defer
属性,除非它还有src
} attribute。
规范似乎不再明确说明这种限制,但我认为这只是一个unintentional regression caused by a later spec change(你的问题有助于捕捉 - 所以,谢谢!)。
因此,我将调查并提出针对规范修复的拉取请求,然后稍后更新此答案。
2018-05-05更新
对于此处的记录,我最终提交了一个带有HTML规范补丁的拉取请求:
https://github.com/whatwg/html/pull/2509
...并且已合并到HTML规范源:
https://github.com/whatwg/html/commit/3c5180a08f90a375c64f8191f32f8c7ddfec0ba3
...现在,当前的HTML规范再次声明了限制:
https://html.spec.whatwg.org/multipage/scripting.html#attr-script-defer
async
和defer
属性是布尔属性,指示应如何评估脚本。经典脚本可以指定defer
或async
,但除非存在src
属性,否则不得指定。
答案 2 :(得分:-1)
尝试将您的DOCTYPE设置为HTML5。如果不可行,您可能需要写defer=true
而不是defer
。