【发布时间】:2010-08-14 15:08:22
【问题描述】:
我正在重建我的惰性加载器模块以接受异步请求,但我有一个大问题:
Internet Explorer 不支持 script.onload/onerror!!!
旧脚本对使用 ajax 同步调用读取的目标脚本源进行全局评估, 它工作得很好,它是跨浏览器的,我可以让它异步编辑 1 个变量,但调试起来非常棘手(所有源代码都在一行中执行,浏览器没有提供太多关于错误的信息,将代码除以使用正则表达式是不可能的,因为 js 有无限深度的块,而正则表达式根本不擅长这个)。
这是我用来创建脚本的代码(经典):
var script = document.createElement('script');
script.type = 'text/javascript';
script.src =name;
script.name =name;
script.async = true;
script.onload=<my_onload_code>;
script.onerror=<my_onerror_code>;
它不能在 IE 上运行,因为它不支持脚本的 onload 和 onerror;
下面的代码是一个修复程序,但仅在脚本不是异步的情况下才有效
if(script.onreadystatechange!==undefined)//only IE T_T
script.onreadystatechange = function() {
if (script.readyState == 'loaded')//ERROR LOADING
<my_onerror_code>;
else
if(script.readyState == 'complete')//loaded
<my_onload_code>;
};
我可以每隔 X 毫秒对其进行一次测试,直到脚本被加载,但这是一个丑陋的解决方案,我想避免它。
编辑:这是我尝试每 X 毫秒检查一次脚本是否已加载的代码,它并没有那么糟糕,而且它比 ajax 工作得更好;问题是我不知道是否脚本加载成功或错误(onload 或 onerror)。
var script = document.createElement('script');
script.type = 'text/javascript';
script.src =name;
script.name =name;
script.async = true;
script.onload=function(){Lazy_loader.onload(this);};
script.onerror=function(){Lazy_loader.onerror(this);};
if(script.onreadystatechange!==undefined){//ie fix T_T
script.timer=setInterval(function(){
if (script.readyState == 'loaded' || script.readyState == 'complete')}//ERROR LOADING
if(LOADED???)//loaded
Lazy_loader.onload(script);
else
Lazy_loader.onerror(script);
clearInterval(script.timer);
}
},100);
}
document.getElementsByTagName('head')[0].appendChild(script);
我尝试使用 addEventListener/attachEvent 函数,但它似乎不起作用(即使使用网络上的 addEvent 函数)
总结选项似乎是:
- 使用 AJAX 和全局 eval 加载脚本(调试地狱)
- 仅在 IE 中使用 AJAX 和全局评估(可能是一个解决方案,我不使用 IE)
- 仅当脚本包含错误时才使用 AJAX 和全局评估(我需要检查计时问题,因为即使调用是异步的,我的代码也会“模拟”同步代码)
- 每隔 X 次测试 script.onreadystatechange(仅在 IE 上),直到它被加载(丑陋!!!)
- 使用window.onload : 避免,它需要对所有页面收费,我需要在只启动一个脚本时调用它(详见endpage)
- 在每个脚本的源代码上添加一个代码(避免像最后页所说的那样)
- 修复 IE 的 script.onload(使用 addEventListener/attachEvent?!?)
请注意:
我不想使用window.onload,因为它仅在加载所有页面时触发,我需要在仅加载目标脚本时触发它(我的延迟加载脚本要复杂得多,所以请不要问为什么);
我不想使用任何第三方库(如 jquery、prototype 等),
我什至不想编辑目标脚本源(例如在使用 JSPON 或添加脚本以提醒脚本已加载时)。
希望不要太多! 谢谢。
【问题讨论】:
-
根据msdn,脚本支持onload msdn.microsoft.com/en-us/library/cc197055%28VS.85%29.aspx
-
试试看,不行。这就像试图修改
标签: javascript internet-explorer asynchronous lazy-loading