1

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

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

我能做些什么?

4

3 回答 3

3

W3C HTML 检查器(验证器)的维护者在这里。

修复:将脚本内容放入单独的文件中,并使用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指示应该如何评估脚本。经典脚本可以指定deferor ,但除非该属性存在async,否则不得指定其中之一。src

于 2017-03-06T10:08:46.553 回答
1

你有两个<script>标签。

  • 一个在 HTML 源代码中
  • 一种使用document.write.

HTML 看起来像这样:

<script defer type="text/javascript">…&lt;/script>

它没有src属性。这就是你得到错误的原因。你不能在defer那里有一个属性。

JavaScript 生成的文件如下所示:

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

它有src属性,没有defer属性。您可以在此处添加defer属性。

它也是 JavaScript,因此无论如何都不会被验证器视为 HTML。

于 2017-03-06T09:49:17.940 回答
-1

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

于 2016-07-10T11:45:53.200 回答