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



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

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

document.ready()

调按注册顺序调用。 如果先注册测试回调,则会首先调用该回调。

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

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

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

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

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

我找到了一种很好的解决方法,即在很早的时候(在jQuery加载之后)有一个.ready()来执行数组中的函数。 因为它在源代码中很早,所以首先执行 .ready()。 在页面的下方,我可以向数组添加函数,因此它们都在任何其他 .ready() 之前执行。

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

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

最新更新