2012-06-04 127 views
23

我正在使用多个代码块设置document.ready()(jQuery)上的某些行为。有没有办法强制执行一个特定块在其他任何块之前被调用?jQuery:强制执行document.ready()调用的执行顺序

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

+2

错误日志代码块是否真的需要等待DOM准备好? –

+0

@KevinB好点!它甚至可能是值得的,因为它不会等待... – msanford

+0

@KevinB我对JS不是很熟悉。如果我将代码放在任何代码块之外,是否可以保证在执行任何其他代码之前运行代码? –

回答

22

document.ready()回调按其注册的顺序调用。如果您首先注册您的测试回调,它将首先被调用。

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

另一个想法是(仅供测试),你可以与添加一个标志,document.ready()是过去了,设置为true时表示,首先调用该函数或者你可以添加新的方法的jQuery略加修改版本上运行document.readyFirst()那会首先调用你的函数。这将涉及对jQuery中的document.ready()处理代码的轻微更改。

+0

@AnkitSoni - 为什么8个月后删除最佳答案标签?什么改变了? – jfriend00

+1

我的错误,重新加入。相反,我再次指出这仍然有帮助! –

0

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

6

您应该可以使用holdReady来做到这一点。只要它包含在准备好的事件之前,就可以运行自己的代码,然后触发其他准备好的事件。

7

正如@ 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. 
    }); 
}); 
+1

这种方法确实有效,但我可以想象它在某些情况下给出了一些非常奇怪的结果。而且,它的代码味道遍布它,对于未来的开发人员维护代码而言,这非常令人困惑。 – Edwin

+1

@Edwin,但它是一个可行的解决方案。 – Dmitry

+1

非常好的解决方案,甚至可以在jQuery 3中使用。 – ViRuSTriNiTy

0

我试图做同样的事情,我是装了一堆polyfills说有。就绪()函数,但我也有我自己的。就绪()页S上,我需要先执行,尽管polyfills被加载到标题中。

我发现一个很好的解决方法,就是在.ready()很早的时候(在jQuery加载之后)执行数组中的函数。由于它在源代码的早期阶段就是先执行.ready()。更进一步,我可以向该数组添加函数,因此它们都在任何其他.ready()之前执行。

我已经将它包装在一个.beforeReady()函数中,并将它放在GitHub上,作为jQuery-Before-Ready供任何感兴趣的人使用。 https://github.com/aim12340/jQuery-Before-Ready