jQuery:强制执行document.ready()调用的执行顺序

时间:2012-06-04 15:21:30

标签: jquery document-ready order-of-execution

我正在开发一个包含多个代码块的代码库,在document.ready()(jQuery)上设置一些行为。有没有办法强制在任何其他块之前调用一个特定的块?

背景: 我需要在自动化测试环境中检测JS错误,因此我需要在任何其他JS代码执行之前开始记录JS错误的代码。

5 个答案:

答案 0 :(得分:26)

document.ready()回调按照注册顺序调用。如果您先注册测试回调,则会先调用它。

此外,如果您的测试代码实际上不需要操作DOM,那么您可以在解析代码时运行它,而不是等到DOM准备就绪,这将在其他document.ready()回调之前运行被叫。或者,也许您可​​以立即运行部分测试代码,并仅将使用DOM的部分推迟到document.ready()

另一个想法是(仅出于测试目的)你可以运行一个略微修改的jQuery版本,它向document.ready()添加一个标志,当传递并设置为true表示首先调用该函数或你可以添加一个可以先调用你的函数的新方法document.readyFirst()。这将涉及jQuery中document.ready()处理代码的微小更改。

答案 1 :(得分:12)

@ jfriend00提到ready callbacks are called in the order they were registered.

所以即使这个代码块在开头调用,你也可以在其中设置另一个回调,这样它就会在最后执行。

jQuery(document).ready(function(){
    jQuery(document).ready(function(){
        // This block will be executed after all ready calls.
    });
});

答案 2 :(得分:7)

您应该可以使用holdReady来执行此操作。只要在准备好的事件之前包含它,您就可以运行自己的代码,然后触发其他就绪事件。

答案 3 :(得分:1)

您可以在DOMReady中执行日志记录启动代码,并在load中执行其他初始化。或者您可以创建自己的初始化管理器,首先调用您的日志记录开始代码,然后调用所有其他初始化回调(前提是那些是向您的经理而不是jQuery注册的,除非您想破解jQuery并从那里提取它们,我不知道建议)。

答案 4 :(得分:1)

我正在尝试做类似的事情,我正在加载一堆具有.ready()函数的polyfill,但我也有我自己的.ready()页面,我需要先执行,尽管polyfill已加载在标题中。

通过在早期(在jQuery加载之后)使用.ready()从数组执行函数,我找到了一个很好的方法。因为它在源代码中很早就会先执行.ready()。在页面的下方,我可以向数组添加函数,因此它们都会在任何其他.ready()之前执行。

我把它包装在一个.beforeReady()函数中,然后把它作为jQuery-Before-Ready放在GitHub上,供有兴趣的人使用。 https://github.com/aim12340/jQuery-Before-Ready