web-dev-qa-db-ja.com

Internet Explorerの「script」タグの「onload」ハンドラー

この関数 を使用して、スクリプトタグにonloadハンドラをアタッチしました。これは、インターネット上で推奨される方法のようです。
まだ、ページがすでにロードされている場合(つまり8でテスト済み)、Internet Explorerでは機能しません。通常のブラウザで動作することを確認できます(スクリプトがロードされるとアラートが発生します)。

何か不足していますか?
ありがとうございました

49
Nikita Rybak

jQuery.getScript 、これはまさにあなたが探していることをします。

[〜#〜] edit [〜#〜]:jQueryからの関連するソースコードは次のとおりです。

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 );
87
SLaks

Script.onload = runFunction;にも問題がありました。 IE8で。

JQuery.getScriptを試してみましたが、私のニーズに完全に適合していました。唯一の欠点は、スクリプトに追加する前にjQueryがロードされるのを待たなければならないことです。

しかし、とにかく私のコールバック関数はjQueryを非常に頻繁に使用するため、非常に使いやすいクロスブラウザソリューションを作成するため、これは非常に受け入れやすく非常に小さな欠点であることがわかります。

更新:

JQueryを使用せずに実行する方法を次に示します。

(修正ソリューション: https://stackoverflow.com/a/13031185/1339954

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);
10
ngChris