你可以在HTML脚本标签上同时使用asynchronous和推迟属性吗?

我想使用defer和async加载下面的JavaScript代码:

<script defer async src="/js/somescript.js"></script>

由于Internet Explorer 5.5+支持延迟,因此您可以在CanIUse.com上看到,如果asynchronous不可用,我想优雅地使用延迟。 asynchronous我认为更好的使用时,但它不支持,直到Internet Explorer 10。

我的问题是,因此上面的代码有效的HTML? 如果没有,是否有可能创build这种情况下使用JavaScript的优雅回落使用脚本时asynchronous不可用?

从规范: https : //www.w3.org/TR/html5/scripting-1.html#attr-script-async

即使指定了async属性,也可以指定defer属性,以使传统的仅支持延迟(而不是async)的Web浏览器回退到延迟行为,而不是默认的同步阻止行为。

是的,它的有效的HTML,它会像预期的那样工作。

任何符合W3C标准的浏览器都将识别async属性并正确处理脚本,而传统的IE版本将识别defer属性。

由于这两个属性都是布尔值 ,所以不必分配任何值。

问题是,你期望它做什么? 如果同时存在asyncdefer ,我期望脚本被延迟,并且只在浏览器空闲时才执行DOMContentLoaded,但是如果我正在阅读规范,那么看起来像延迟被忽略,如果设置了async并且加载了脚本asynchronous,所以将尽快执行,这可能会在DOMContentLoaded之前,并可能会阻止其他资源。

有三种可能的模式可以使用这些属性进行select。 如果存在async属性,那么只要脚本可用,脚本就会被asynchronous执行。 如果async属性不存在但是存在defer属性,那么脚本在页面parsing完成时执行。 如果两个属性都不存在,那么在用户代理继续parsing页面之前立即提取并执行脚本。

https://www.w3.org/TR/html5/scripting-1.html#attr-script-async