2011-10-18 47 views
6

如何清除設置爲通過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> 

警報發生,無論我試圖繞過它。有沒有辦法做到這一點?

+0

可以設置多個'''''ready'''函數,所以我並不感到驚訝,''''''''''工作。一個拙劣的解決方案是設置一個全局變量,並在''''''''''''''''''''中將''''''''函數包含在''''if'''中來測試該值 - 只需更改該值, ''功能仍然會運行,它的內容不會... – JoLoCo

回答

5

如果您描述了您真正想要解決的問題,您可能會得到最合適的答案。

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來跟蹤它是否已經觸發了就緒處理程序。將它設置爲true會使它認爲它已經解僱了他們,所以它不會再每次都這樣做。

+0

我不控制代碼。我正在創建一個JavaScript代碼片段,可以將其包含到客戶端的網站上,以取代其中的一些內容。不幸的是,他們有回調,期待一些被替換的內容在那裏,因此是一個錯誤。我想,如果我能以某種方式覆蓋他們的文檔,那麼這將解決問題。 –

+0

哇 - 您試圖阻止所有jQuery.ready初始化代碼。我希望你知道你在做什麼,因爲如果你這樣做的話,很多事情都會中斷。那麼需要運行的合法init代碼呢?無論如何,我添加了一個可以完成的選項,而無需修改ready handler中的代碼。在我看來,你應該讓普通的準備好的代碼和普通的頁面內容運行,然後在執行完成之後,替換頁面中的東西。 – jfriend00

+0

是的,我知道這看起來很可怕,但我們有權這樣做。我打算對jQuery進行一些攻擊,但是我們確實有一些其他代碼需要在doc.ready上運行。第二個例子似乎正是我所需要的......儘管它似乎與直覺相反 - 設置爲true將使我認爲我們正在觸發doc.ready ... –

0

$(document).ready()依賴於由瀏覽器觸發的onLoad事件,這意味着您不能防止它發生。如果alert()由某個條件決定,那麼我會使用if/else語句來決定它是否被調用。

+1

事實並非如此。 $(document).ready()是由jQuery生成的,並且有辦法阻止它發生。 – jfriend00

1

這工作:

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

似乎是一個錯誤,我 - jQuery中所有其他事件都能夠被綁定。省略這個是不一致的。

不是直接的答案,遺漏,但這裏是從jQuery docs一些相關信息:

所有這三個如下語法是等價的:

  • $(document).ready(handler)
  • $().ready(handler)(這是不推薦)
  • $(handler)

還有$(document).bind("ready", handler)。這與ready方法類似,但有一個例外:如果ready事件已經被觸發,並且您嘗試執行綁定的處理程序,則不會執行。以這種方式綁定的就緒處理程序在被上述其他三種方法綁定之後執行。

+0

不錯!所以我想知道調用$(document).ready(...)與$(document).bind(「ready」,...)之間的區別是什麼。太糟糕的解除綁定文檔說它隻影響那些通過bind()調用設置的回調。 –

+0

@ShaneN - 不同之處在於''ready'事件已經被觸發時,'.bind(「ready」,handler)'處理程序將不會被調用。在更常見的方式綁定任何處理程序之後,它們也被稱爲最後一個。 – gilly3

+0

從查看源代碼可以看出,$(document).bind(「ready」)處理程序將在其他就緒處理程序之後被調用,並且它們是唯一可以用$(document ).unbind()'。您不能刪除具有解除綁定的'$(document).ready()'處理程序,因爲它們的存儲方式不同。 – jfriend00

0

超級老問題,但遇到了需要這樣做最近以防止代碼的document.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)