2010-11-04 78 views
10

我已經將多個函數的多個函數附加到$(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() {}); 

功能的需要做的第一不相干的順序,但只被調用上幾頁。我不能保證b或c的順序,所以我不能在b或c的開頭觸發自定義事件來觸發a。

所以我想要一個通用的解決方案,我可以用它在jQuery的內部readyList或hook的開始處強制放置jQuery的ready函數,並安全地進行編輯,以便在readyList中的任何其他函數之前調用它。

[進一步編輯]

如果可能的話,我寧願不用重新設計JavaScript代碼的執行順序或必須從功能分開觸摸任何其他代碼()。我知道重組,讓我來解決這個問題,但我寧願只寫這樣

$.beforeReady(function a() {}); 
+0

當你需要beforeReady函數之前添加運行代碼,你會做什麼?你會添加一個beforeBeforeReady嗎?有時你只需要咬緊牙關,做需要做的事情並修復代碼,這樣纔有意義。 – 2010-11-04 16:19:53

+0

@賈尼你可能有一個有效的觀點。不過我寧願創建一個beforeReady,然後用.bind(「loaded」)替換所有發生的.ready,並用.bind(「setup」)替換beforeReady。 – Raynos 2010-11-04 16:25:14

+0

這個問題應該在下一個版本的jQuery中修復:https:// github.com/jquery/jquery/pull/80 – Mottie 2010-11-04 17:32:22

回答

15

單一功能這將是一個時間,你的所有其他文件在那裏我會觸發自定義事件將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'): 
}); 
+0

「/ /安裝的東西」是可選的,只能做幾頁,「//代碼在這裏」是在每一頁上完成。我不想在每個頁面上包含$(window).trigger(「someCustomEvent」) – Raynos 2010-11-04 15:59:49

+0

@Raynos,然後你可以觸發另一個自定義事件來完成設置。 – 2010-11-04 16:01:53

+0

如果我在文檔準備好了多個函數不能保證順序,也不是選擇一個函數來觸發設置,因爲我不能保證任何ready函數是第一個被jQuery – Raynos 2010-11-04 16:08:19

0

$(document).ready()或簡單地$(function(){})只是一個.addEventListener的實現(很不完全,但很接近),這意味着你可以在前後添加監聽器。

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

等等,它不是很難夾心功能。 有沒有必要破解.ready() IMO。

+0

我寧願不必擔心隨處使用包含的代碼的確切順序,而是需要在代碼中設置順序。 – Raynos 2010-11-04 15:58:42

+0

嗯,也許你應該停止粘貼.ready()到處都是。我通常只使用一個.ready()函數,在其中初始化所有插件並將其保存在一個文件中,其中沒有其他內容(雙關語意)。 ;) – BGerrissen 2010-11-04 16:02:06

+2

如果我有時間編輯整個遺留項目,就像我那樣工作。暫時我堅持逐步改進。 – Raynos 2010-11-04 16:09:51

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> 
相關問題