我正在使用多个代码块在 document.ready() (jQuery) 上设置一些行为的代码库。有没有办法强制在任何其他块之前调用一个特定块?
背景:我需要在自动化测试环境中检测 JS 错误,因此我需要在执行任何其他 JS 代码之前执行开始记录 JS 错误的代码。
我正在使用多个代码块在 document.ready() (jQuery) 上设置一些行为的代码库。有没有办法强制在任何其他块之前调用一个特定块?
背景:我需要在自动化测试环境中检测 JS 错误,因此我需要在执行任何其他 JS 代码之前执行开始记录 JS 错误的代码。
document.ready()
回调按照它们注册的顺序被调用。如果您先注册您的测试回调,它将首先被调用。
此外,如果您的测试代码实际上不需要操作 DOM,那么您可以在代码被解析时运行它,而不是等到 DOM 准备好后,它会在document.ready()
调用其他回调之前运行。或者,也许您可以立即运行部分测试代码并仅将使用 DOM 的部分推迟到document.ready()
.
另一个想法是(仅用于测试目的)您可以使用稍微修改过的 jQuery 版本运行,该版本document.ready()
在传递时添加一个标志并设置为true
指示首先调用该函数,或者您可以添加一个新方法document.readyFirst()
首先调用您的函数。document.ready()
这将涉及对 jQuery中处理代码的微小更改。
正如@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.
});
});
You should be able to use holdReady to do this. As long as it is included before your ready events, you can run your own code and then trigger the other ready events.
我正在尝试做类似的事情,我正在加载一堆具有 .ready() 函数的 polyfill,但我在页面上也有我自己的 .ready(),我需要首先执行,尽管 polyfill 已加载到标题中.
我找到了一个很好的解决方法,方法是在很早的时候(在 jQuery 加载之后)使用 .ready() 来执行数组中的函数。因为它在源代码中非常早,所以首先执行 .ready()。在页面的下方,我可以将函数添加到数组中,因此它们都在任何其他 .ready() 之前执行。
我将它封装在一个 .beforeReady() 函数中,并将其作为 jQuery-Before-Ready 放在 GitHub 上,供任何感兴趣的人使用。 https://github.com/aim12340/jQuery-Before-Ready
您可以在 DOMReady 中执行日志记录启动代码,并在加载中执行其他初始化。或者您可以创建自己的初始化管理器,它首先调用您的日志记录启动代码,然后是所有其他初始化回调(前提是这些回调是向您的管理器注册而不是 jQuery,除非您想破解 jQuery 并从那里提取它们,我不这样做'建议)。