2011-01-22 20 views
1

以下情況是我遇到的問題。我得出了這樣的結論,即在執行Javascript時,通過觀察這種情況,jQuery一定不能做好準備。當jQuery沒有準備好時執行Javascript

場景:

我有注入的Javascript腳本標記到當前加載DOM頁的Java應用程序。以下Java代碼運行內嵌Javascript,其中插入jquery.jsmyCode.jsmyCode.js持有我的Javascript代碼。

browser.executeJavaScript("var head= document.getElementsByTagName('head')[0];" + 
           "var script= document.createElement('script');script.type= 'text/javascript';script.src= 'jquery.js';head.appendChild(script);" + 
           "var script4= document.createElement('script');script4.type= 'text/javascript';script4.src= 'http://myCode.js';head.appendChild(script4);"); 

在這個Java應用程序,我也有一個buttonListener是火災myCode.js的函數的actionPerformed();

executedJS = browser.executeJavaScript("replaceAllLinks()"); 

遇到的問題是單擊按鈕時在上面一行出現nullPointerException異常。適應空情況導致無限循環而沒有任何改變。

while(executedJS == null) browser.executeJavaScript("replaceAllLinks()"); 

該問題的原因被精確定位至當jQuery的功能,方法是本內replaceAllLinks(); javascript函數。當jQuery,方法不存在,沒有問題可以觀察到。沒有一個nullPointerException引發的實例。

唯一可能的潛在問題是,jQuery庫不能完全加載,而replaceAllLinks();正在執行。如果jQuery方法和函數沒有被使用,那沒關係,一切都可以運行。

我的問題是,如何確保jQuery完全加載並可供使用?

+0

您的$(document).ready在哪裏? – jmort253 2011-01-22 08:56:18

回答

1

每個依賴於jQuery的腳本都應該包含在DOM就緒函數中。這種功能一般需要這種形式:

$(document).ready(function() { 
    /* code here */ 
}); 

和快捷方式來達到同樣的事情將是:

$(function() { 
    /* code here */ 
}); 

這裏有現成的方法以獲得更多信息的文檔: http://api.jquery.com/ready/

+0

+1,這是確定jQuery的方式。 – Exelian 2011-01-22 12:29:47

0

聲明一些全局變量at the end jquery.js,例如

window.jQueryIsLoaded=true; 

並在使用jQuery之前檢查此變量。

<edit>忘記這一點,請參閱下面的薩爾曼A的評論,應該是正確的答案。</edit>

+0

Infact,你可以檢查'typeof jQuery!=='undefined'。 – 2011-01-22 10:37:32