来自 W3C 验证程序的错误“元素脚本不得具有属性延迟,除非还指定了属性 src”

Error “Element script must not have attribute defer unless attribute src is also specified” from W3C validator

本文关键字:属性 延迟 src 程序 验证 W3C 错误 脚本 元素 来自      更新时间:2023-09-26

我有一个HTML文档,其源代码有一个具有defer属性的script元素。W3C 验证器说它无效,因为它缺少 src 属性,但实际上源代码中有一个src属性:

<script defer type="text/javascript">if($(window).width()>1024){document.write("<"+"script src='js/jquery.preloader.js'></"+"script>");}</script>

我能做什么?

W3C HTML Checker(验证器)的维护者。

解决方法:将脚本内容放入单独的文件中,并使用 src 属性引用该脚本内容。

检查器会报告问题中代码段的错误,因为 HTML 规范用于明确声明script不能具有 defer 属性,除非它也具有 src 属性。

规范不再明确说明该限制,但我认为这只是由后来的规范更改引起的无意回归(您的问题有助于抓住这一点 - 所以,谢谢!

因此,我将调查并提出规范修复的拉取请求,然后稍后更新此答案。

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属性,否则不得指定。

您有两个<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。

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