'onload' handler for 'script' tag in internet explorer
我一直在使用这个函数将onload处理程序附加到一个脚本标记上,这似乎是通过Internet推荐的方法。然而,如果页面已经加载(在IE8中测试),它在InternetExplorer中就不起作用。您可以看到它在普通浏览器中工作(加载脚本时激发警报)。
我错过什么了吗?谢谢你
你应该打电话给
编辑:这里是jquery的相关源代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | var head = document.getElementsByTagName("head")[0] || document.documentElement; var script = document.createElement("script"); if ( s.scriptCharset ) { script.charset = s.scriptCharset; } script.src = s.url; // Handle Script loading var done = false; // Attach handlers for all browsers script.onload = script.onreadystatechange = function() { if ( !done && (!this.readyState || this.readyState ==="loaded" || this.readyState ==="complete") ) { done = true; jQuery.handleSuccess( s, xhr, status, data ); jQuery.handleComplete( s, xhr, status, data ); // Handle memory leak in IE script.onload = script.onreadystatechange = null; if ( head && script.parentNode ) { head.removeChild( script ); } } }; // Use insertBefore instead of appendChild to circumvent an IE6 bug. // This arises when a base node is used (#2709 and #4378). head.insertBefore( script, head.firstChild ); |
在IE8中,我还遇到了script.onload=runfunction;的问题。
我试过jquery.getscript,它非常适合我的需要。唯一的缺点是在添加脚本之前必须等待jquery被加载。
然而,由于我的回调函数使用jquery非常频繁,我发现这是一个非常可接受的、非常小的缺点,因为它创建了一个非常易于使用的跨浏览器解决方案。
更新:
以下是不使用jquery的一种方法:
(修改后的解决方案来自:https://stackoverflow.com/a/13031185/1339954)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | var url = 'http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js'; var headID = document.getElementsByTagName("head")[0]; var script = document.createElement('script'); script.type='text/javascript'; script.src=url; //for nonIE browsers script.onload=function(){ addVideo(); } //for IE Browsers ieLoadBugFix(script, function(){ addVideo();} ); function ieLoadBugFix(scriptElement, callback){ if (scriptElement.readyState=='loaded' || scriptElement.readyState=='completed') { callback(); }else { setTimeout(function() {ieLoadBugFix(scriptElement, callback); }, 100); } } headID.appendChild(script); |