1

我只需要在 DOM 准备好时运行脚本,因为脚本会重写某些标签的某些属性。

目前我使用document.addEventListeneronDOMContentLoaded或者如果不可用document.attachEvent ononreadystatechange并且如果两者都没有给出我使用window.onload功能。

我阅读了关于在文档被解析defer应该执行的脚本的标签。

  • 这是否意味着通过设置defer属性我可以在 DOM 准备好时轻松执行我的脚本?
  • 是否有一些我可能会错过的隐藏内容?
  • Opera、WebKit、Firefox、IE 的支持情况如何?

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

4

2 回答 2

2

属性的正确实现defer将在 DOM 完成解析后自动运行脚本,因此脚本中的任何代码都不必在加载 DOM 时执行其自己的逻辑。您可以阅读这篇 Mozilla 文章了解更多详细信息。

但是,defer并非所有旧版浏览器都支持该属性,因此您必须决定要支持哪些浏览器以及对于不支持 defer 的浏览器的策略是什么。您可以在这篇 SO 帖子中阅读浏览器实现的历史。在 switcheroo 中,它首先在 IE 中实现,然后在 Firefox 中,然后在 Safari 和 Chrome 中。从那篇文章中的日期/版本来看,除了 Opera 之外,现在依赖它看起来很安全,但你必须深入研究那篇文章中的细节,以确保它符合你的要求。

下面的图表显示了浏览器对deferhttp://caniuse.com/script-defer支持。

据我所知,主要争议defer是多个defer脚本是否按顺序执行(它们应该按顺序执行)以及它们如何与使用async. 标准和实施现在很清楚,但并非总是如此。但是,如果你只有一个独立的defer脚本,你只关心在解析 DOM 之后执行,你应该是安全的。

于 2013-01-24T22:57:32.227 回答
-4

如果您愿意使用 JQuery ( http://jquery.com/ ),那么您可以使用:

$(document).ready(
    function(){
    //do something here, the DOM is ready!
    }
);

有关完整的详细信息,请访问http://api.jquery.com/ready/

.ready 函数将在 DOM 准备好后加载,我相信(尽管我可能会弄错)JQuery 团队已经在很大程度上处理了您(或我)可能错过的任何事情。

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

于 2013-01-24T14:38:18.170 回答