jQuery:强制执行 document.ready() 调用的顺序
Posted
技术标签:
【中文标题】jQuery:强制执行 document.ready() 调用的顺序【英文标题】:jQuery: Enforce order of execution of document.ready() calls 【发布时间】:2012-06-08 16:08:36 【问题描述】:我正在使用多个代码块在 document.ready() (jQuery) 上设置一些行为的代码库。有没有办法强制在任何其他块之前调用一个特定块?
背景: 我需要在自动化测试环境中检测 JS 错误,因此我需要在执行任何其他 JS 代码之前执行开始记录 JS 错误的代码。
【问题讨论】:
错误记录代码块真的需要等待DOM准备好吗? @KevinB 好点!它甚至可能不等待是值得的...... @KevinB 我对 JS 不是很熟悉。如果我将代码放在任何块之外,是否可以保证在执行任何其他代码之前运行? 它运行在你在 DOM 中的确切位置。如果它是您页面中的第一个脚本标记(例如在 html 顶部head
),它将首先运行。
@AnkitSoni 假设它被放置在 html 标签中并且所有其他代码块都依赖于 DOMReady,它将在 DOMReady 块中的任何代码之前运行。
【参考方案1】:
document.ready()
回调按照它们注册的顺序被调用。如果你先注册你的测试回调,它将首先被调用。
此外,如果您的测试代码实际上不需要操作 DOM,那么您可以在代码被解析时运行它,而不是等到 DOM 准备好后,它会在调用其他 document.ready()
回调之前运行.或者,也许您可以立即运行部分测试代码,只将使用 DOM 的部分推迟到document.ready()
。
另一个想法是(仅用于测试目的)您可以使用稍微修改过的 jQuery 版本运行,该版本向 document.ready()
添加了一个标志,当传递并设置为 true
时表示首先调用该函数,或者您可以添加一个新方法 document.readyFirst()
将首先调用您的函数。这将涉及对 jQuery 中的document.ready()
处理代码的微小更改。
【讨论】:
@AnkitSoni - 为什么在 8 个月后删除了最佳答案标签?发生了什么变化? 我的错误,重新添加。相反,我再次提到它仍然有帮助!【参考方案2】:正如@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.
);
);
【讨论】:
这个方法确实有效,但我可以想象它在某些情况下会给出一些非常奇怪的结果。此外,它到处都有代码气味,这对于未来维护代码的开发人员来说非常混乱。 可以确认它有效,但确实感觉很奇怪。如果您要订购多个电话,可能会非常混乱。【参考方案3】:您应该可以使用holdReady 来执行此操作。只要包含在你的就绪事件之前,你就可以运行自己的代码,然后触发其他的就绪事件。
【讨论】:
【参考方案4】:我正在尝试做类似的事情,我正在加载一堆具有 .ready() 函数的 polyfill,但我在页面上也有我自己的 .ready()s,我需要先执行,尽管 polyfill 已加载在标题中。
我找到了一个很好的解决方法,即在很早的时候(在 jQuery 加载之后)使用 .ready() 来执行数组中的函数。因为它在源代码中非常早,所以首先执行 .ready()。在页面的下方,我可以将函数添加到数组中,因此它们都在任何其他 .ready() 之前执行。
我已将其封装在 .beforeReady() 函数中,并将其作为 jQuery-Before-Ready 放在 GitHub 上,供任何感兴趣的人使用。 https://github.com/aim12340/jQuery-Before-Ready
【讨论】:
【参考方案5】:您可以在 DOMReady 中执行日志记录启动代码,并在加载时执行其他初始化。或者您可以创建自己的初始化管理器,它首先调用您的日志记录启动代码,然后是所有其他初始化回调(前提是这些回调是向您的管理器注册而不是 jQuery,除非您想破解 jQuery 并从那里提取它们,我不这样做' t 建议)。
【讨论】:
以上是关于jQuery:强制执行 document.ready() 调用的顺序的主要内容,如果未能解决你的问题,请参考以下文章
window.onload的加载和$(document).read()