24 votes

Charger dynamiquement un fichier Javascript externe et attendre son chargement - sans utiliser JQuery

Je suis en train d'essayer de charger dynamiquement un fichier .js externe (selon une entrée que je reçois de l'utilisateur). Actuellement, mon code ressemble à ceci :

function createScript(src, id) {
    if (document.getElementById(id) == null) {
        var newScript = document.createElement('script');
        newScript.setAttribute("type", "text/javascript");
        newScript.setAttribute("src", src);
        newScript.setAttribute("id", id);
        document.getElementsByTagName("head")[0].appendChild(newScript);
    }
}

Cela fonctionne. Cela charge le script, mais si j'essaie d'appeler une fonction qui est définie à l'intérieur du nouveau script, cela ne fonctionnera pas. La chose étrange est que si j'attends une seconde (en utilisant un alert("test") ou quelque chose comme ça), le script fonctionne.

Je suppose que c'est parce que le navigateur ajoute immédiatement la balise </code>, mais il lui faut un peu plus de temps pour "lire" le script à l'intérieur du fichier .js. J'ai essayé de jouer avec <code>"typeof testfunction === 'function'"</code> avec quelques variations mais sans succès.</p> <p>Une bonne manière de faire cela ?</p></x-turndown>

1voto

Interrobang Points 7243

Un des meilleurs motifs à utiliser ici est d'utiliser addEventListener pour écouter un événement personnalisé comme "MyScriptLoaded". Ensuite, modifiez votre script inclus pour déclencher cet événement comme dernière action. Cela vous assurera de n'agir qu'après que le nouveau script ait complètement chargé.

1voto

Jake Feasel Points 10341

Si vous avez le contrôle sur la source du javascript qui est chargé, votre meilleure option serait d'avoir ce code exécuter une pseudo-fonction de rappel qui existe dans le contexte de votre page. C'est quelque chose comme la méthode utilisée pour le JSONP. Ainsi, imaginez sur votre page d'appel, vous avez ceci :

function createScript(src, id) {
    if (document.getElementById(id) == null) {
        var newScript = document.createElement('script');
        newScript.setAttribute("type", "text/javascript");
        newScript.setAttribute("src", src);
        newScript.setAttribute("id", id);
        document.getElementsByTagName("head")[0].appendChild(newScript);
    }
}

function callbackFunc()
{
  // utilisez de nouvelles fonctions ici....
}

Et chacun de vos fichiers sources pourrait se terminer par cette ligne :

callbackFunc();

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