11

我已将多个文件中的多个函数附加到 $(document).ready 并希望将单个函数附加到它们之前作为 $(document).ready 处理的第一个函数或在 $(document) 之前独立触发.ready 处理程序。

有什么方法可以处理 jQuery 作为 jQuery.fn.ready 的一部分在内部触发的函数的顺序,或者挂钩在 jQuery.fn.ready 之前调用的函数。

在第 3 方脚本中编辑 jQuery.fn.ready 是安全的吗,还是会在其他第 3 方插件中造成可怕的连锁反应(除了自己编辑 jQuery.fn.ready 的插件)

[编辑]:

举个例子

$(document).ready(function b() {});
....
$(document).ready(function a() {/* optional setup*/});
....
$(document).ready(function c() {});

函数 a 需要首先发生,与顺序无关,但只在几页上被调用。我不能保证 b 或 c 的顺序,所以我不能在 b 或 c 的开头触发自定义事件来触发 a。

所以我想要一个通用的解决方案,我可以用它来强制将 a 放在 jQuery 内部 readyList 的开头或挂钩到 jQuery 的 ready 函数并安全地编辑它,以便它在 readyList 中的任何其他函数之前调用 a。

[进一步编辑]

如果可能的话,我宁愿不必重新设计 javascript 代码执行顺序,也不必触及除函数 a() 之外的任何其他代码。我知道重组可以让我解决这个问题,但我宁愿只写一个函数,比如

$.beforeReady(function a() {});
4

3 回答 3

16

这将是我触发所有其他文件都会触发的自定义事件的时候bind,您将只有一个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'):
});
于 2010-11-04T15:54:33.617 回答
0

$(document).ready()或者$(function(){})只是一个.addEventListener实现(不完全是,但很接近),这意味着您可以在之前和之后添加侦听器。

$(document).ready(listener); // goes off first.
$(document).ready(otherListener); // goes off 2nd.

等等,把函数夹起来并不难。没有必要破解.ready()imo。

于 2010-11-04T15:55:50.377 回答
0

我只是遇到了完全相同的问题。我在 GitHub 上放了一个小脚本,添加了一个 $.beforeReady() 函数。有趣的 :)

https://github.com/aim12340/jQuery-Before-Ready

就像在这个例子中一样,在 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>
于 2017-04-21T11:50:37.750 回答