388 votes

Comment puis-je faire référence à la balise script qui a chargé le script en cours d'exécution ?

Comment puis-je faire référence à l'élément script qui a chargé le javascript en cours d'exécution ?

Voici la situation. J'ai un script "maître" qui est chargé en haut de la page, en premier lieu sous la balise HEAD.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type="text/javascript" src="scripts.js"></script>

Il existe un script dans "script.js" qui doit pouvoir faire un chargement à la demande d'autres script. La méthode normale ne fonctionne pas tout à fait pour moi parce que je dois ajouter de nouveaux script sans référencer la balise HEAD, parce que l'élément HEAD n'a pas terminé son rendu :

document.getElementsByTagName('head')[0].appendChild(v);

Ce que je veux faire, c'est référencer l'élément script qui a chargé le script actuel afin que je puisse ensuite ajouter mes nouvelles balises script chargées dynamiquement dans le DOM après lui.

<script type="text/javascript" src="scripts.js"></script>
loaded by scripts.js--><script type="text/javascript" src="new_script1.js"></script>
loaded by scripts.js --><script type="text/javascript" src="new_script2.js"></script>

8voto

David Callizaya Points 31

Il doit fonctionner au chargement de la page et lorsqu'une balise script est ajoutée avec javascript (ex. avec ajax).

<script id="currentScript">
var $this = document.getElementById("currentScript");
$this.setAttribute("id","");
//...
</script>

6voto

Pour obtenir le script, qui a actuellement chargé le script vous pouvez utiliser

var thisScript = document.currentScript;

Vous devez garder une référence au début de votre script, de sorte que vous puissiez appeler plus tard

var url = thisScript.src

5voto

Triptych Points 70247

Un mot d'avertissement : modifier le DOM pendant qu'il est encore en train de se charger vous causera un problème de sécurité. un monde de souffrance dans IE6 et IE7 .

Vous feriez mieux d'exécuter ce code après le chargement de la page.

5voto

Pete Blois Points 36

Une approche pour traiter les scripts asynchrones et différés est de tirer parti du gestionnaire onload - définir un gestionnaire onload pour toutes les balises scripts et le premier qui s'exécute devrait être le vôtre.

function getCurrentScript(callback) {
  if (document.currentScript) {
    callback(document.currentScript);
    return;
  }
  var scripts = document.scripts;
  function onLoad() {
    for (var i = 0; i < scripts.length; ++i) {
      scripts[i].removeEventListener('load', onLoad, false);
    }
    callback(event.target);
  }
  for (var i = 0; i < scripts.length; ++i) {
    scripts[i].addEventListener('load', onLoad, false);
  }
}

getCurrentScript(function(currentScript) {
  window.console.log(currentScript.src);
});

4voto

Ferdinand Liu Points 124

Suivez ces étapes simples pour obtenir la référence au bloc script en cours d'exécution :

  1. Placez une chaîne unique aléatoire dans le bloc script (doit être unique / différente dans chaque bloc script).
  2. Interroge le résultat de document.getElementsByTagName('script'), en recherchant la chaîne unique de chacun de leur contenu (obtenu à partir de la propriété innerText/textContent).

Exemple (ABCDE345678 est l'identifiant unique) :

<script type="text/javascript">
var A=document.getElementsByTagName('script'),i=count(A),thi$;
for(;i;thi$=A[--i])
  if((thi$.innerText||thi$.textContent).indexOf('ABCDE345678'))break;
// Now thi$ is refer to current script block
</script>

En fait, dans votre cas, vous pouvez simplement utiliser la bonne vieille méthode document.write() pour inclure un autre script. Comme vous avez mentionné que le DOM n'est pas encore rendu, vous pouvez profiter du fait que le navigateur exécute toujours script en séquence linéaire (sauf pour celui qui est différé et qui sera rendu plus tard), donc le reste de votre document n'existe toujours pas. Tout ce que vous écrirez à travers document.write() sera placé juste après le script appelant.

Exemple de page HTML originale :

<!doctype html>
<html><head>
<script src="script.js"></script>
<script src="otherscript.js"></script>
<body>anything</body></html>

Contenu de script.js :

document.write('<script src="inserted.js"></script>');

Après le rendu, la structure DOM deviendra :

HEAD
  SCRIPT script.js
  SCRIPT inserted.js
  SCRIPT otherscript.js
BODY

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