代码之家  ›  专栏  ›  技术社区  ›  Raynos

在$(document).ready()触发器之前运行函数

  •  11
  • Raynos  · 技术社区  · 14 年前

    有什么方法可以处理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放在jQuery的内部readyList的开头,或者钩住jQuery的ready函数并安全地编辑它,以便它在readyList中的任何其他函数之前调用a。

    [进一步编辑]

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

    $.beforeReady(function a() {});
    
    3 回复  |  直到 14 年前
        1
  •  16
  •   Jacob Relkin    14 年前

    在这个时候,我会触发一个自定义事件,而您的所有其他文件都会 bind 到,你只会有一个 ready 处理程序,它将执行某些操作,然后触发自定义事件。

    所以,在代码的其他地方,而不是使用 $(document).ready ,您将使用

    $(window).bind('setup', function() {
       //code here...
    });
    

    和/或

    $(window).bind('loaded', function() {
       //some other code here...
    });
    

    准备好的 汉德勒,你应该这样做:

    $(document).ready(function() {
       $(window).trigger('setup');
       $(window).trigger('loaded'):
    });
    
        2
  •  0
  •   BGerrissen    14 年前

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

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

    不需要黑客 .ready() 国际海事组织。

        3
  •  0
  •   EamonnM    8 年前

    我也有同样的问题。我在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>