在jQuery中强制触发domready?

3

由于将JavaScript DOM方法放在HTML页面底部(<body>之后)比使用jQuery的'ready'事件要快得多,我们是否应该通过以下方式强制执行:

$('document').trigger('ready');

在body标签后面添加脚本,这样做可以加快网页加载速度。我自己没有亲测过,但应该是可行的。不知道有没有遗漏什么?


就此而言,ASP.NET AJAX客户端框架通过在关闭的</body>标签之前注入其“ready”代码(<script>Sys.Application.initialize()</script>)来加载它。 - Roatin Marth
3个回答

6

jQuery.ready();


1

ready事件意味着文档已经被解析并且DOM可以被操作。这发生在浏览器完成解析时,你无法让它更快。

你认为这样的事情会怎么样?它会在浏览器的HTML解析器中翻转一个魔法开关,使其比通常运行得更快吗?它会导致计算机的处理器运行更快,以便浏览器更快地解析文档吗?

你无法强制浏览器比它本来要快地解析文档。即使使用jQuery也不行 ;-)


这并不完全正确,是吗?我们在客户端网站底部使用domReady()函数,从未遇到任何问题。事实上,它比使用“ready”状态更快,并且可以操纵DOM而不会出现任何问题,因为它已经加载了。 - David Hellsing
然而,这不是问题的关键。OP问的是如何触发ready事件,但这是不可能的:你可以触发与用户活动相关的事件,例如click来模拟用户点击按钮,但你无法触发依赖于浏览器内部表示DOM已达到给定状态的事件。将问题重新表述为询问$('document').trigger('load');,那么它就毫无意义了。 - NickFitz
当然,您可以触发与任何用户活动无关的事件。我认为您可以使用jQuery.ready();或jQuery(document).triggerHandler("ready");来触发ready事件。 - David Hellsing
@David:你可能能够触发与该事件相关联的函数的执行,但这并不意味着事件已经发生。我可以使用window.onload();来使onload处理程序被执行,但这并不意味着文档已经加载。 - NickFitz
是的,但这正是我的观点。在IE中没有“本地”的DOMContentLoaded事件,jQuery只是使用IE dom ready技巧来模拟它,该技巧在http://javascript.nwbox.com/IEContentLoaded/上有描述。所以我的问题是,如果我在关闭body标签之前添加$.ready(),是否可以自己触发函数,以尽快发生domReady。我的测试结果显示效果相当不错。 - David Hellsing
在这种情况下,你所做的只是通过一种相当复杂的方式调用函数。没有必要进行所有这些“触发”伪事件的操作 - 直接调用函数即可。 - NickFitz

1

我有一个相关的问题,最终在没有发布到SO之前自己找到了答案。由于有相同问题的人可能会来到这里(“jquery force document ready”是谷歌搜索结果的第一名),所以让我提供一些额外的信息。

我的问题是,我正在动态生成一些HTML(使用XSLT),有时将其保存以备后用,但其他时候我只想打开一个新窗口并显示新的HTML,以便用户可以预览它。就像这样:

var html = UseXSLTToGenerateSomeHTML();
var myWindow = window.open('', '', 'width=805,height=493');
myWindow.document.write(html);
myWindow.focus();

问题是,生成的HTML使用了jQuery,但domready事件从未被调用。从David的答案中,应该立即明显如何做到这一点,但微调瞬间逃脱了我的注意力。解决方法是:
var html = UseXSLTToGenerateSomeHTML();
var myWindow = window.open('', '', 'width=805,height=493');
myWindow.document.write(html);
myWindow.focus();
mywindow.jQuery.ready();

请注意,在这种情况下,执行此操作的页面甚至不使用jQuery...只有生成的HTML使用了它。但无论如何,您都可以在其他文档上生成jQuery事件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接