我有一个在Firefox中运行良好的页面,但在IE中引发错误。我正在动态加载jQuery(如果它尚未加载),然后在jQuery(document).ready()块中执行一些操作。但是,IE在遇到jQuery(document).ready()块时会抛出可怕的“Object expected”错误。
您可以在此处查看完整页面代码:http://www.pastie.org/977767
IE正在jQuery(文档).ready()中抛出错误。
关于这里发生了什么的任何想法?同样,这在Firefox中运行得非常好。看起来几乎像IE认为jQuery已经加载了但是当遇到jQuery(document).ready()块时它还没有或者jQuery仍在加载?
答案 0 :(得分: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
函数调用该函数。
答案 1 :(得分: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' );
}
它很漂亮,但它可以工作......它适用于几个文件,在我能想到的每个浏览器中(我关心的)并且意味着你不必弄乱父页面源代码。所以你可以清楚标记。