Javascript 在$(document).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,并希望附加一个函数,作为$(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进行大修的事实吗?我不知道内核大修的实际时间表,或者是否会添加具体的更改。我想和大家分享的是,这是一个已知的问题,将在未来的版本中修复。对不起=(