51 votes

handler 'onload' pour la balise 'script' dans internet explorer

J'ai utilisé cette fonction pour attacher le gestionnaire de chargement à une balise script, cela semble être la méthode recommandée sur Internet.
Pourtant, cela ne fonctionne pas dans internet explorer, si la page est déjà chargée (testé dans ie 8). Vous pouvez constater que cela fonctionne dans les navigateurs normaux (déclenche une alerte lorsque le script est chargé).

Est-ce que j'ai manqué quelque chose ?
Merci.

88voto

SLaks Points 391154

Vous devez appeler jQuery.getScript qui fait exactement ce que vous recherchez.

EDIT : Voici le code source pertinent de 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 );

10voto

ngChris Points 101

J'ai également eu des problèmes avec script.onload = runFunction ; dans IE8.

J'ai essayé jQuery.getScript et cela a parfaitement fonctionné pour mes besoins. Le seul inconvénient est de devoir attendre que jQuery soit chargé avant d'ajouter le script.

Cependant, étant donné que mes fonctions de rappel utilisent très largement jQuery, je trouve que c'est un inconvénient extrêmement acceptable et très mineur, car cela crée une solution très facile à utiliser et multi-navigateurs.

Mise à jour :

Voici un moyen de le faire sans utiliser jQuery :

(une solution modifiée de : 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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X