Javascript 在$(document).ready()触发器之前运行函数
我已将多个文件中的多个函数附加到$(document).ready,并希望附加一个函数,作为$(document).ready处理程序的第一个函数或在$(document).ready处理程序之前独立触发 有没有办法处理jQuery作为jQuery.fn.ready的一部分在内部触发的函数顺序,或者挂接在jQuery.fn.ready之前调用的函数 在第三方脚本中编辑jQuery.fn.ready安全吗?还是会在其他第三方插件(除了编辑jQuery.fn.ready的插件本身)中造成可怕的连锁反应 [编辑]: 例如Javascript 在$(document).ready()触发器之前运行函数,javascript,jquery,events,document-ready,Javascript,Jquery,Events,Document Ready,我已将多个文件中的多个函数附加到$(document).ready,并希望附加一个函数,作为$(document).ready处理程序的第一个函数或在$(document).ready处理程序之前独立触发 有没有办法处理jQuery作为jQuery.fn.ready的一部分在内部触发的函数顺序,或者挂接在jQuery.fn.ready之前调用的函数 在第三方脚本中编辑jQuery.fn.ready安全吗?还是会在其他第三方插件(除了编辑jQuery.fn.ready的插件本身)中造成可怕的连锁反
$(document).ready(function b() {});
....
$(document).ready(function a() {/* optional setup*/});
....
$(document).ready(function c() {});
函数a需要按照顺序先执行,但只能在几页上调用。我无法保证b或c的顺序,因此我无法在b或c开头触发自定义事件以触发a
所以我想要一个通用的解决方案,我可以使用它在jQuery的内部readyList的开始处强制放置一个,或者挂接到jQuery的ready函数中,并安全地编辑它,以便它在readyList中的任何其他函数之前调用一个
[进一步编辑]
如果可能的话,我宁愿不必重新设计javascript代码的执行顺序,也不必接触函数a()之外的任何其他代码。我知道重构将允许我绕过这个问题,但我宁愿只编写一个函数,如
$.beforeReady(function a() {});
在这个时候,我将触发一个自定义事件,您的所有其他文件都将绑定到该事件,您将只有一个
ready
处理程序,它将执行一些操作,然后触发自定义事件
因此,在代码的其他地方,不要使用$(document).ready
,而是使用
$(window).bind('setup', function() {
//code here...
});
和/或
$(window).bind('loaded', function() {
//some other code here...
});
在您唯一的ready
处理程序中,您可以执行以下操作:
$(document).ready(function() {
$(window).trigger('setup');
$(window).trigger('loaded'):
});
$(document).ready()
或干脆$(function(){})
只是一个.addEventListener
实现(不完全正确,但关闭),这意味着您可以在前后添加侦听器
$(document).ready(listener); // goes off first.
$(document).ready(otherListener); // goes off 2nd.
诸如此类,夹心函数并不难。
没有必要破解
.ready()
imo.我也遇到了同样的问题。我在GitHub上放了一个小脚本,它添加了一个$.beforeReady()函数。有趣:)
只需在jQuery之后加载脚本,如本例所示:
<html>
<head>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="jquery-before-ready.js"></script>
</head>
<body>
<script>
$(document).ready({
alert("This function is declared first!")
})
</script>
<script>
$.beforeReady(function(){
alert("This function is declared second but executes first!")
})
</script>
</body>
</html>
$(文件)。准备好了吗({
警报(“首先声明此函数!”)
})
$.beforeReady(函数(){
警报(“此函数是第二个声明的,但首先执行!”)
})
includes everywhere不必担心代码的确切顺序,而是在代码中设置顺序。嗯,也许你应该停止到处粘贴.ready()。我通常只使用一个.ready()来初始化我的所有插件,并将其保存在一个文件中,不包含任何其他内容(双关语)如果我有时间编辑整个遗留项目,让它像那样工作,我会的。目前,我一直在逐步改进,“//do setup”是可选的,只需要几页就可以完成。每一页上都有“/”代码。所以这样做会让人感觉很倒退。我不想将$(window.trigger(“someCustomEvent”)包含在每个page@Raynos,您可以触发另一个自定义事件来执行设置。如果我在document ready上有多个函数,我不能保证顺序,也不能选择要触发设置的函数,因为我不能保证任何就绪函数都是第一个被调用的函数jQuery@Raynos,页面上包含的顺序决定了这一点。我不想改变使用。在我的所有页面中都准备好了。也许我只是太挑剔了。如果我不能直接连接到它,我会研究它的内部工作方式并使用您的解决方案,谢谢。当您需要添加在beforeReady函数之前运行的代码时,您会怎么做?你能在准备好之前添加一个吗?有时候你只需要咬紧牙关,做需要做的事情,修复代码,这样代码才有意义。@Jani你可能有一个正确的观点。尽管如此,我还是希望创建一个beforeReady,然后将所有发生的.ready替换为.bind(“加载”),并将beforeReady替换为.bind(“设置”)这个问题应该在jQuery的下一个版本中得到解决:@fudgey您指的是他声明ready系统将使用1.5进行大修的事实吗?我不知道内核大修的实际时间表,或者是否会添加具体的更改。我想和大家分享的是,这是一个已知的问题,将在未来的版本中修复。对不起=(