2010-10-24 5 views
0

J'essaie de charger un JavaScript dynamiquement avec jQuery pour initlialize mon application ajax. Je veux appeler une fonction de gestionnaire lorsque le script a été chargé avec succès. Voici à quoi ressemble mon code:Chargement du script avec jQuery - IE échoue

var $script = $('<script type="text/javascript"></script>').appendTo('head'); 
$script.load(function() { ... }); 
$script.error(function() { ... }); 
$script.attr('src', 'foo.js'); 

Cela fonctionne très bien dans FireFox, Opera, Safari et Chromium.
Le gestionnaire onload est toujours appelé après le chargement du script.
Mais l'IE (v8) n'appelle ni le gestionnaire onload ni le gestionnaire onerror. Donc, mon application ajax n'est jamais initialisée ;-)

Est-ce que quelqu'un sait comment résoudre ce problème?

Cordialement, Biggie

EDIT:
Je pense que je l'ai travail:

$.ajax({ 
    type: "GET", 
    url: options.script, 
    data: null, 
    success: function(data, textStatus) { 
     options.onload(); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
     options.onerror(); 
    }, 
    beforeSend: function(xhr) { 
     // Fix for FireFox 3 to prevent "malformed"-message 
     if (xhr.overrideMimeType) { 
      xhr.overrideMimeType("text/plain"); 
     } 
    }, 
    dataType: "script" 
}); 

Le beforeSend est utilisé pour prévenir la malformed -erreur dans FireFox.

Cela semble fonctionner avec FireFox et IE. Les deux appellent le gestionnaire d'erreurs si le script n'existe pas.

+0

comme d'autres ont noté l'événement 'onload' n'est pas déclenché dans IE. Vous devez gérer le onreadystatechange pour que IE fonctionne. – Andreas

+0

@andreas: Cela devrait être fait automatiquement par la fonction 'ajax' si je comprends bien le code jQuery: http://github.com/jquery/jquery/blob/master/src/ajax.js#L294 – Biggie

Répondre

3

jQuery a getScript

jQuery.getScript(url, [ success(data, textStatus) ]) 
+1

Mais getScript n'a pas de gestionnaire onError. Il n'y a donc aucun moyen d'informer l'utilisateur que l'initialisation a échoué. – Biggie

+1

@Biggie "Il n'y a donc aucun moyen d'informer l'utilisateur que l'initialisation a échoué." Que diriez-vous de 'textStatus'? – epascarello

+0

Hm, si le fichier demandé n'existe pas, la fonction de succès n'est pas appelée (FireFox). De plus, le FireFox-log affiche toujours une erreur comme "code mal formé" bien que le code fonctionne sans problèmes. – Biggie

0

@ réponse de epascarello est probablement le moyen le plus pratique d'aller.

Autre que:

onerror ne fonctionne pas pour les éléments de script dans IE. Voir le fond détaillé dans this question.

onload est censé fonctionner selon le MSDN. Si ce n'est pas le cas, une solution de contournement pourrait être d'exécuter la fonction dans le JS qui est incorporé.

0

Près de 1 an plus tard ...

J'ai fait une peu de changement dans le code source de jquery pour supporter correctement l'erreur 404 lors de l'appel d'un script.

Recherche dans la source pour "jQuery.ajaxTransport ("", fonction (s) { script" et dans le corps de la fonction (j'ai ajouté avant l'événement onload) ajouter:

[...] 
// Attach error event handler 
script.onerror = function(){ callback(0, "error"); }; 
[...] 

Cette modification Vous pouvez créer une fonction de repli pour l'erreur 404.

Ceci est une modification sale, mais a parfaitement fonctionné dans la plupart des navigateurs que j'ai testés (FF, Chrome, Webkit, IE7-9)