Est-il possible d'arrêter une étiquette de script insérée dynamiquement?

Est-il possible d'arrêter une étiquette de script de charger après a été ajouté à la tête d'un document HTML?

J'aimerais avoir quelque chose comme ça:

var script_tag = document.createElement('script'); script_tag.setAttribute('type', 'text/javascript'); script_tag.setAttribute('src', 'http://fail.org/nonexistant.js'); document.getElementsByTagName('head')[0].appendChild(script_tag); // something like this!!! script_tag.abort(); 

Il n'est pas possible de manière croisée. Dès que la balise de script est ajoutée à la tête, elle sera téléchargée et analysée, et même la suppression du noeud ne l'arrêtera pas.

Cela étant dit, Firefox a document.onbeforescriptexecute , ce qui est annulable (où l'action par défaut serait d'exécuter le script cible). Cet événement était à l'origine sur une piste de normes, mais a récemment été retiré de la spécification HTML en raison d'un manque de cas d'utilisation valides.

Non, vous ne pouvez pas le faire de cette façon. Mais vous pouvez, si vous le chargez via XMLHTTPRequest (AJAX). De cette façon, vous pouvez annuler la connexion si cela prend trop de temps.
Par exemple, vous pouvez utiliser l'option timeout si vous utilisez jQuery:

 $.ajax({ url: "a.js", dataType: "script", timeout: 1000}); 

De cette façon, si le script ne se charge pas en 1 seconde (1000 ms), la demande sera annulée. Vous pouvez également utiliser {async:false} pour empêcher l'exécution du code alors que le script est en cours de chargement (si nécessaire).

Consultez http://api.jquery.com/jQuery.ajax/ pour plus d'options.

Microsoft Edge et Internet Explorer vous permettent d'annuler le chargement des scripts:

  • Supprimez le script de la page, par exemple <script id=blah src=...></script> et blah.parentNode.removeChild(blah);

  • Puis faites une window.CollectGarbage && CollectGarbage(); collecte des ordures window.CollectGarbage && CollectGarbage(); (Pas toujours nécessaire car la grande page entraînera un GC de toute façon)

  • N'essayez pas de tester à l'aide du débogueur (il interfère, par exemple GC)

  • Vous avez besoin d'une propriété <script async (ou de report?), Sinon les scripts ultérieurs ne seront pas exécutés sur la page (notez que vos scripts doivent gérer correctement le chargement du script hors-commande en raison de la propriété async ).

  • IE / Edge n'agit que comme si le script était chargé, mais ils ne ferment pas la connexion (pas sûr de ce qu'il fait si le script finit par charger).

  • Cette technique arrête le throbber, rend l'événement de la paellaad ( très important pour jQuery) et redimensionne les événements (sinon ils ne le font pas alors que la page est "en cours de chargement").

  • La technique ne fonctionne pas pour Chrome ou Firefox

  • Un XMLHttpRequest (CORS si nécessaire) est probablement une mise en œuvre bien meilleure puisque vous pouvez contrôler le délai d'attente et annuler ()

  • J'ai seulement testé Internet Explorer 11 et Edge 13