您需要将事件处理程序附加到 onload 方法(在符合 Web 标准的浏览器中)或 onreadystatechange,在 Internet Explorer 中检查 script.readyState 属性是否等于“已加载”或“完成”。
在您收到脚本已加载的通知之前,您可能正在尝试访问尚未声明或创建的对象、函数和属性。
这是一个示例函数,从我的Javascript 库bezen.org中的模块bezen.dom.js中提取:
var appendScript = function(parent, scriptElt, listener) {
var safelistener = catchError(listener,'script.onload');
if (scriptElt.readyState && scriptElt.onload!==null) {
scriptElt.onreadystatechange = function() {
if ( scriptElt.readyState === "loaded" ||
scriptElt.readyState === "complete" ) {
scriptElt.onreadystatechange = null;
safelistener();
}
};
} else {
scriptElt.onload = safelistener;
}
parent.appendChild( scriptElt );
};
为了适应您的需求,您可以替换对 catchError 的调用,它包装了侦听器以捕获和记录错误,并使用修改后的函数:
var appendScript = function(parent, scriptElt, listener) {
var safelistener = function(){
try {
listener();
} catch(e) {
}
};
if (scriptElt.readyState && scriptElt.onload!==null) {
scriptElt.onreadystatechange = function() {
if ( scriptElt.readyState === "loaded" ||
scriptElt.readyState === "complete" ) {
scriptElt.onreadystatechange = null;
safelistener();
}
};
} else {
scriptElt.onload = safelistener;
}
parent.appendChild( scriptElt );
};