Javascript 延迟脚本和DOM

Javascript 延迟脚本和DOM,javascript,deferred-loading,Javascript,Deferred Loading,我只需要在DOM就绪时运行脚本,因为脚本会重写某些标记的某些属性 目前我在DOMContentLoaded上使用document.addEventListener,或者如果document.attachEvent在onreadystatechange上不可用,则使用窗口.onload功能 我读过关于defer标记的文章,这些脚本应该在解析文档后执行 这是否意味着通过设置defer属性,我可以在DOM就绪时轻松执行脚本 有什么隐藏的东西我可能会错过吗 Opera、WebKit、Firefox和I

我只需要在DOM就绪时运行脚本,因为脚本会重写某些标记的某些属性

目前我在
DOMContentLoaded
上使用
document.addEventListener
,或者如果
document.attachEvent
onreadystatechange
上不可用,则使用
窗口.onload
功能

我读过关于
defer
标记的文章,这些脚本应该在解析文档后执行

  • 这是否意味着通过设置
    defer
    属性,我可以在DOM就绪时轻松执行脚本
  • 有什么隐藏的东西我可能会错过吗
  • Opera、WebKit、Firefox和IE的支持程度如何

编辑:我知道像JQuery这样的库,但我不能使用它们,因为我需要非常小的脚本,所以我需要一个低级解决方案。

如果您愿意使用JQuery(),那么您可以使用:

$(document).ready(
    function(){
    //do something here, the DOM is ready!
    }
);
有关详细信息,请访问

.ready函数将在DOM就绪后加载,我相信(尽管我可能弄错了),JQuery团队已经基本上解决了您(或我)可能错过的任何问题


虽然您可以在不增加JQuery开销的情况下解决这个问题,但根据我(新手)的经验,这种头痛不值得这么麻烦。此外,JQuery还有许多其他漂亮的工具。:)

正确实现
defer
属性将在DOM完成解析后自动运行脚本,因此脚本中的任何代码都不必在加载DOM时执行自己的逻辑。你可以阅读更多细节

但是,并非所有较旧的浏览器都支持
defer
属性,因此您必须决定要支持哪些浏览器,以及对于任何不支持defer的浏览器,您的策略是什么。您可以在中读取浏览器实现的历史记录。在switcheroo中,它首先在IE中实现,然后在Firefox中实现,然后在Safari和Chrome中实现。从那篇文章中的日期/版本来看,除了Opera之外,现在依赖它似乎是相当安全的,但你必须深入到那篇文章中的细节,以确保它满足你的要求

下面的图表显示了浏览器对延迟的支持:


据我所知,
defer
的主要争议在于多个
defer
脚本是否按顺序执行(它们应该按顺序执行),以及它们如何与使用
async
的脚本交互。标准和实现现在已经明确,但并不总是如此。但是,如果您只有一个独立的
defer
脚本,而您只关心在解析DOM后执行该脚本,那么您应该是安全的。

jquery使用的事件侦听与我上面描述的类似。此外,我不希望使用jqery。确保在脚本运行之前加载文档的最简单方法是,只需将
标记放在
的末尾,就在
之前,然后不需要使用延迟加载或等待文档加载。这是一个选项吗?@jfriend00我需要我的脚本能够在任何地方。Opera不支持它(说)。我可以问你为什么要把它放在任何地方吗?谢谢你详细的回答!