关于javascript:Internet Explorer中’script’标签的’onload’处理程序

'onload' handler for 'script' tag in internet explorer

我一直在使用这个函数将onload处理程序附加到一个脚本标记上,这似乎是通过Internet推荐的方法。然而,如果页面已经加载(在IE8中测试),它在InternetExplorer中就不起作用。您可以看到它在普通浏览器中工作(加载脚本时激发警报)。

我错过什么了吗?谢谢你


你应该打电话给jQuery.getScript,这正是你想要的。

编辑:这里是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);