93 votes

Injectez une balise de script avec le src distant et attendez qu'il s'exécute

Comment puis-je injecter un <script src="https://remote.com/"></script> dans ma page, attendre qu'il s'exécute, puis utiliser les fonctions qu'il définit ?

Pour info : dans mon cas, le script effectuera un traitement par carte de crédit dans de rares cas, donc je ne veux pas toujours l'inclure. Je souhaite l'inclure rapidement lorsque l'utilisateur ouvre une boîte de dialogue de modification des options de carte de crédit, puis lui envoie les nouvelles options de carte de crédit.

Éditez pour plus de détails : je n'ai pas accès au script distant.

169voto

Pierre Points 5365

Vous pouvez utiliser la méthode de Google Analytics ou de Facebook :

 (function(d, script) {
    script = d.createElement('script');
    script.type = 'text/javascript';
    script.async = true;
    script.onload = function(){
        // remote script has loaded
    };
    script.src = 'http://www.google-analytics.com/ga.js';
    d.getElementsByTagName('head')[0].appendChild(script);
}(document));

METTRE À JOUR:

Vous trouverez ci-dessous la nouvelle méthode Facebook ; il s'appuie sur une balise de script existante au lieu de <head> :

 (function(d, s, id){
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)){ return; }
    js = d.createElement(s); js.id = id;
    js.onload = function(){
        // remote script has loaded
    };
    js.src = "//connect.facebook.net/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
  • Remplacez facebook-jssdk par votre identifiant de script unique pour éviter qu'il ne soit ajouté plus d'une fois.
  • Remplacez l'url du script par la vôtre.

59voto

Frank Gambino Points 599

Même méthode utilisant des écouteurs d'événement et des constructions ES2015 :

 function injectScript(src) {
    return new Promise((resolve, reject) => {
        const script = document.createElement('script');
        script.src = src;
        script.addEventListener('load', resolve);
        script.addEventListener('error', e => reject(e.error));
        document.head.appendChild(script);
    });
}

injectScript('https://example.com/script.js')
    .then(() => {
        console.log('Script loaded!');
    }).catch(error => {
        console.error(error);
    });

6voto

keeganwatkins Points 1246

quelque chose comme ça devrait faire l'affaire :

 (function() {
    // Create a new script node
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.onload = function() {
        // Cleanup onload handler
        script.onload = null;

        // do stuff with the loaded script!

    }

    // Add the script to the DOM
    (document.getElementsByTagName( "head" )[ 0 ]).appendChild( script );

    // Set the `src` to begin transport
    script.src = "https://remote.com/";
})();

J'espère que cela pourra aider! Tchin Tchin.

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