错误“元素脚本必须没有属性延迟,除非还指定了属性src”来自W3C验证器

时间:2016-07-10 11:44:11

标签: javascript html html5 w3c-validation deferred-loading

我有一个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>

我该怎么办?

3 个答案:

答案 0 :(得分:1)

您有两个<script>代码。

  • HTML源代码中的一个
  • 使用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

  

asyncdefer属性是布尔属性,指示应如何评估脚本。经典脚本可以指定deferasync,但除非存在src属性,否则不得指定。

答案 2 :(得分:-1)

尝试将您的DOCTYPE设置为HTML5。如果不可行,您可能需要写defer=true而不是defer