我以前也问过类似的问题,但我从来没有把我的观点说得很清楚,或者至少我认为这是一个非常相关的问题,值得提出来看看是否有人能给出一些有见地的想法。
在使用 jQuery 时,我们中的许多人使用该jQuery.ready
函数init
在 DOM 加载时执行。它已成为使用 jQuery 将 DOM 操作程序添加到网页的事实上的标准方式。一些浏览器本身就存在相关事件,但是 jQuery 在其他浏览器中模拟它,例如一些 IE 版本。例子:
<head>
<script>
var init = function() { alert('hello world'); };
$.ready(init);
</script>
现在,我们所有的测试都表明这个事件可能非常缓慢。它并不像 一样慢window.onload
,但在执行之前它仍然经常有大约 100 毫秒的延迟。如果是 FF,它可以达到 200-300 毫秒,尤其是在刷新时。
这是一些非常重要的毫秒,因为这是在进行任何 DOM 操作(例如隐藏下拉菜单)之前显示初始布局的时间量。很多时候,布局“闪烁”主要是由于使用了缓慢的 DOM 就绪事件,迫使程序员使用 CSS 隐藏元素,并可能使其更难访问。
现在,如果我们在关闭 body 标签之前在脚本标签中放置一个 init 函数,它将执行得更快,通常大约是一半时间,但有时甚至更快:
<head>
<script>
var init = function() { alert('hello world'); };
</script>
</head>
<body>
<!-- some HTML -->
<script>init();</script>
</body>
一个证明差异的简单测试页面:http: //jsbin.com/aqifon/10
我的意思是,我们并不是在谈论一些“优化策略”在使用有效选择器时所提倡的几乎不明显的差异。我们正在讨论在加载 DOM 操作时的一些主要延迟。在 FF 中尝试这个示例,domready 有时会慢 100 倍以上(300 毫秒对 2 毫秒)。
现在我的问题是:jQuery.ready
当它明显比其他替代品慢得多时,为什么建议使用它?init
在关闭 BODY 与 using 之前调用 BODY 的缺点是什么jQuery.ready
?可以说使用起来更“安全” domReady
,但在什么情况下它比其他选项更安全?(我在考虑类似document.write
和延迟脚本之类的东西)我们已经BODY
在许多客户网站上使用了近 5 年的方式,我们从未遇到任何问题。它只是快了很多。
我也想知道,既然关于 jsPerf 和每 10000 次执行几毫秒优化选择器的问题太多了,为什么没有太多谈论这个?这基本上是用户面临的第一个延迟,并且在每个页面加载时切片 50-100 毫秒似乎相当简单......