清除jquery document.ready()调用



如何清除通过jQuery document.ready()调用触发的匿名函数?

例如:

<script type="text/javascript">
    //some code sets a doc ready callback
    $(document).ready(function ()
    {
        alert('ready');
    });
    
    //my attempt to prevent the callback from happening
    window.onload = null;
    $(document).unbind("ready");
    
</script>

无论我试图规避它,警报都会发生。有什么办法可以做到吗?

如果你描述了你真正想要解决的问题,你可能会得到最合适的答案。

jQuery没有公开的文档来撤销或阻止document.ready()处理程序。如果你控制代码,你可以使用一个全局变量和一个条件,像这样:

var skipReady = false;
$(document).ready(function ()
{
    if (!skipReady) {
        alert('ready');
    }
});
// skip the document.ready code, if it hasn't already fired
skipReady = true;

或者,如果您想稍微深入jQuery(超出文档中的接口),您可以这样做:

$(document).ready(function() {
    alert("ready");
});
// stop the ready handler
$.isReady = true;

您可以在这里看到最后一个工作:http://jsfiddle.net/jfriend00/ZjH2k/。这是因为jQuery使用属性:$.isReady来跟踪它是否已经触发了ready处理程序。将其设置为true会使它认为它已经触发了它们,这样它就不会再做一次。

这行得通:

$(document).bind("ready", function () { alert("hey!"); });
$(document).unbind("ready");

对我来说似乎是一个bug - jQuery中的所有其他事件都可以解除绑定。省略这个是不一致的。

不是对遗漏的直接回答,但这里有一些来自jQuery文档的相关信息:

以下三种语法都是等价的:

  • $(document).ready(handler)
  • $().ready(handler)(不建议这么做)
  • $(handler)

还有$(document).bind("ready", handler)。这与ready方法类似,但有一个例外:如果ready事件已经触发,并且您尝试执行.bind("ready"),则绑定处理程序将不会被执行。以这种方式绑定的就绪处理程序在上述其他三个方法绑定的任何一个处理程序之后执行。

超级老问题,但最近遇到需要这样做,以防止文档。准备好代码,我没有控制在某些情况下运行。这可以通过代理jQuery的ready函数来实现,就像测试间谍一样。下面的命令可以工作:

var ready = $.prototype.ready;
// proxy the ready function
$.prototype.ready = function ( fn, allowed ) {
    allowed = allowed || false;
    if ( allowed ) {
        ready.call( this, fn );
    }
};

所有对$( document ).ready的调用现在将被忽略。您可以通过传递true作为第二个参数来覆盖此行为:$( document ).ready( fn, true )

$(document).ready()依赖于浏览器触发的onLoad事件,这意味着你无法阻止它的发生。如果alert()是由某些条件决定的,那么我将使用If/else语句来决定是否调用它。

相关内容

最新更新