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>

843voto

brice Points 5740

Comment obtenir l'élément script actuel :

1. Utilisez document.currentScript

document.currentScript retournera le <script> dont le script est en cours de traitement.

<script>
var me = document.currentScript;
</script>

Avantages

  • Simple et explicite. Fiable.
  • Il n'est pas nécessaire de modifier la balise script.
  • Fonctionne avec les scripts asynchrones ( defer & async )
  • Fonctionne avec les scripts insérés dynamiquement

Problèmes

  • Ne fonctionnera pas dans les anciens navigateurs et dans IE.
  • Ne fonctionne pas avec les modules <script type="module">

2. Sélectionner script par id

Donner au script un attribut id vous permettra de le sélectionner facilement par id à partir de l'intérieur en utilisant document.getElementById() .

<script id="myscript">
var me = document.getElementById('myscript');
</script>

Avantages

  • Simple et explicite. Fiable.
  • Un soutien quasi universel
  • Fonctionne avec les scripts asynchrones ( defer & async )
  • Fonctionne avec les scripts insérés dynamiquement

Problèmes

  • Nécessite l'ajout d'un attribut personnalisé à la balise script.
  • id peut provoquer un comportement bizarre pour les scripts dans certains navigateurs pour certains cas limites.

3. Sélectionnez le script à l'aide d'une touche data-* attribut

Donner à la script une data-* vous permettra de le sélectionner facilement à l'intérieur.

<script data-name="myscript">
var me = document.querySelector('script[data-name="myscript"]');
</script>

Cette option présente peu d'avantages par rapport à l'option précédente.

Avantages

  • Simple et explicite.
  • Fonctionne avec les scripts asynchrones ( defer & async )
  • Fonctionne avec les scripts insérés dynamiquement

Problèmes

  • Nécessite l'ajout d'un attribut personnalisé à la balise script.
  • HTML5, et querySelector() non compatible avec tous les navigateurs
  • Moins bien supporté que l'utilisation de la id attribut
  • Se déplaceront <script> con id les cas limites.
  • Il peut y avoir confusion si un autre élément possède le même attribut de données et la même valeur sur la page.

4. Sélectionner le script par src

Au lieu d'utiliser les attributs de données, vous pouvez utiliser le sélecteur pour choisir le script par source :

<script src="//example.com/embed.js"></script>

Dans embed.js :

var me = document.querySelector('script[src="//example.com/embed.js"]');

Avantages

  • Fiable
  • Fonctionne avec les scripts asynchrones ( defer & async )
  • Fonctionne avec les scripts insérés dynamiquement
  • Aucun attribut ou identifiant personnalisé n'est nécessaire

Problèmes

  • Fait no travail pour les scripts locaux
  • causera des problèmes dans différents environnements, comme le développement et la production.
  • Statique et fragile. Changer l'emplacement du fichier script nécessitera de modifier le script.
  • Moins bien supporté que l'utilisation de la id attribut
  • Cela causera des problèmes si vous chargez le même script deux fois.

5. Boucle sur tous les scripts pour trouver celui que vous voulez.

Nous pouvons également boucler sur chaque élément script et les vérifier individuellement pour sélectionner celui que nous voulons :

<script>
var me = null;
var scripts = document.getElementsByTagName("script")
for (var i = 0; i < scripts.length; ++i) {
    if( isMe(scripts[i])){
      me = scripts[i];
    }
}
</script>

Cela nous permet d'utiliser les deux techniques précédentes dans les navigateurs plus anciens qui ne prennent pas en charge la fonction querySelector() bien avec les attributs. Par exemple :

function isMe(scriptElem){
    return scriptElem.getAttribute('src') === "//example.com/embed.js";
}

Elle hérite des avantages et des problèmes de l'approche adoptée, quelle qu'elle soit, mais ne s'appuie pas sur querySelector() donc fonctionnera dans les anciens navigateurs.

6. Obtenir le dernier script exécuté.

Comme les scripts sont exécutés séquentiellement, le dernier élément scripts sera très souvent le scripts en cours d'exécution :

<script>
var scripts = document.getElementsByTagName( 'script' );
var me = scripts[ scripts.length - 1 ];
</script>

Avantages

  • Simple.
  • Un soutien quasi universel
  • Aucun attribut ou identifiant personnalisé n'est nécessaire

Problèmes

  • Fait no travailler avec des scripts asynchrones ( defer & async )
  • Fait no travailler avec des scripts insérés dynamiquement

91voto

Coffee Bite Points 1284

Puisque les scripts sont exécutés séquentiellement, la balise scripts actuellement exécutée est toujours la dernière balise scripts de la page jusque-là. Donc, pour obtenir la balise scripts, vous pouvez faire :

var scripts = document.getElementsByTagName( 'script' );
var thisScriptTag = scripts[ scripts.length - 1 ];

17voto

Greg Points 132247

La chose la plus simple à faire est probablement de donner à votre étiquette de certificat d'épargne un id attribut.

12voto

Diego Perini Points 951

Script ne sont exécutées séquentiellement que si elles ne possèdent pas d'attribut "defer" ou "async". Connaître l'un des attributs ID/SRC/TITLE possibles de la balise script pourrait également fonctionner dans ces cas. Les suggestions de Greg et Justin sont donc toutes deux correctes.

Il existe déjà une proposition de document.currentScript sur les listes WHATWG.

EDIT : Firefox > 4 implémente déjà cette propriété très utile mais elle n'est pas disponible dans IE11 aux dernières nouvelles et seulement disponible dans Chrome 29 et Safari 8.

EDIT : Personne n'a mentionné la collection "document.scripts" mais je pense que ce qui suit peut être une bonne alternative inter-facteurs pour obtenir le scripts en cours d'exécution :

var me = document.scripts[document.scripts.length -1];

12voto

Art Lawry Points 31

Voici un extrait d'un polyfill qui exploite document.CurrentScript s'il existe et se rabat sur la recherche du script par ID.

<script id="uniqueScriptId">
    (function () {
        var thisScript = document.CurrentScript || document.getElementByID('uniqueScriptId');

        // your code referencing thisScript here
    ());
</script>

Si vous incluez ceci en haut de chaque balise script, je pense que vous serez en mesure de savoir systématiquement quelle balise script est déclenchée, et vous serez également en mesure de référencer la balise script dans le contexte d'un callback asynchrone.

Non testé, donc laissez des commentaires pour les autres si vous l'essayez.

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