2010-05-26 174 views
6

我有一個在Firefox中完美運行的頁面,但是在IE中拋出一個錯誤。我動態加載jQuery(如果它尚未加載),然後在jQuery(document).ready()塊中做一些東西。但是,IE瀏覽器在碰到jQuery(document).ready()塊時會拋出令人畏懼的「Object expected」錯誤。IE7 jQuery(document).ready()問題

你可以在這裏查看完整的頁面代碼:http://www.pastie.org/977767

IE是正確的,在jQuery的(文件)。就緒引發錯誤()。

關於這裏發生了什麼的任何想法?再次,這在Firefox中工作得很好。它看起來幾乎像IE認爲jQuery被加載,但它真的還沒有或當jQuery(document).ready()塊遇到時jQuery仍在加載?

回答

2

當您將腳本附加到文檔時,它將被異步下載。在IE中,以下腳本...

try{ 
jQuery(document).ready(function() { 
    jQuery.getScript("/CalendarViewer/js/utils.js", function(){ 
     jQuery.getScript("/CalendarViewer/js/groupcatselector.js", function(){ 
      jQuery.getScript("/CalendarViewer/js/calendarportlet.js", function(){ 
       jQuery.getScript("/CalendarViewer/js/calendarportletmain.js", function(){ 
        var cpm = calendarportletmain; 
        cpm.doEditDefaults("V_7f208bca412b42a68c19eb104bf46f14", "/CalendarViewer", groupCats_V_7f208bca412b42a68c19eb104bf46f14); 
       }); 
      }); 
     }); 
    }); 
}); 
}catch(err){ 
    alert("error in view.jsp="+err.number+" "+err.description); 
} 

...在IE完成下載和解析jQuery腳本之前被解析並執行。如果Firefox已經對腳本進行了緩存,則Firefox中可能不會出現這種情況,下載並立即進行解析可能不會有任何時間。它可以解析器的工作方式不同,Firefox下載後解析腳本,IE排隊解析,直到線程變爲空閒。

您可以將此代碼移動到setUpJquery函數的末尾,這意味着只有當jQuery對象可用時纔會執行該代碼。或者,您可以將代碼放入其自己的函數中,並從setUpJquery函數中調用該函數。

+0

謝謝,但你看到的代碼實際上包含在幾個不同的文件中。 jQuery加載腳本用於許多不同的頁面,所以我不能在其中放置特定的代碼。有沒有其他方法可以對jQuery(document).ready()進行檢查,並且只有在jQuery實際加載後才處理它? – Zendog74 2010-05-26 12:37:54

+0

@ Zendog74:你可以讓jQuery成爲文檔的同步部分。而不是使用DOM來追加,使用'if(typeof jQuery ==「undefined」)document.write('');'。這可以確保在其他腳本運行之前獲取jQuery。 – 2010-05-26 14:28:44

+0

謝謝......做到了。絕對不是優雅,但它的作品。我希望IE和FFX在加載外部腳本時會表現一致,感嘆。 – Zendog74 2010-05-26 17:20:57

1

我得到了周圍的方式,它是:

$(document).ready(function() { 
    document_init(); 
}); 

function document_init() { 
    try{ 

    checkDivLoaded(); 

    [ ... do more stuff ... ] 

    } catch(err) { 
    setTimeout('document_init()', 200); 
    } 
} 

function checkDivLoaded() { 
    if ($('#targetDiv').length == 0) $jquery.error('not ready'); 
} 

這是不漂亮,但它的工作原理...它工作在多個文件中,在每一個瀏覽器我能想到的(我在乎)和意味着您不必亂用父頁面源代碼。所以你可以保持清晰的標籤。

相關問題