Comment obtenir l'élément de script actuel:
1. Utilisez document.currentScript
document.currentScript
retournera l' <script>
élément dont le script est en cours de traitement.
<script>
var me = document.currentScript;
</script>
Avantages
- Simple et explicite. Fiable.
- Pas besoin de modifier la balise de script
- Fonctionne avec des scripts asynchrones (
defer
& async
)
- Fonctionne avec des scripts insérés dynamiquement
Problèmes
- Ne fonctionnera pas dans les anciens navigateurs et IE.
- Ne fonctionne pas avec les modules
<script type="module">
2. Sélectionnez le script par id
Attribuer au script un attribut id vous permettra de le sélectionner facilement par id de l'intérieur en utilisant document.getElementById()
.
<script id="myscript">
var me = document.getElementById('myscript');
</script>
Avantages
- Simple et explicite. Fiable.
- Presque universellement pris en charge
- Fonctionne avec des scripts asynchrones (
defer
& async
)
- Fonctionne avec des scripts insérés dynamiquement
Problèmes
- Nécessite l'ajout d'un attribut personnalisé à la balise de script
id
l'attribut peut provoquer un comportement étrange pour les scripts dans certains navigateurs pour certains cas marginaux
3. Sélectionnez le script à l'aide d'un data-*
attribut
Attribuer au script un data-*
attribut vous permettra de le sélectionner facilement de l'intérieur.
<script data-name="myscript">
var me = document.querySelector('script[data-name="myscript"]');
</script>
Cela présente peu d'avantages par rapport à l'option précédente.
Avantages
- Simple et explicite.
- Fonctionne avec des scripts asynchrones (
defer
& async
)
- Fonctionne avec des scripts insérés dynamiquement
Problèmes
- Nécessite l'ajout d'un attribut personnalisé à la balise de script
- HTML5, et
querySelector()
non compatible avec tous les navigateurs
- Moins largement pris en charge que l'utilisation de l'
id
attribut
- Va se déplacer
<script>
avec des id
cas de bord.
- Peut être confondu si un autre élément a le même attribut de données et la même valeur sur la page.
4. Sélectionnez 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 des scripts asynchrones (
defer
& async
)
- Fonctionne avec des scripts insérés dynamiquement
- Aucun attribut ou identifiant personnalisé requis
Problèmes
- Ne fonctionne pas pour les scripts locaux
- Entraînera des problèmes dans différents environnements, comme le développement et la production
- Statique et fragile. Changer l'emplacement du fichier de script nécessitera de modifier le script
- Moins largement pris en charge que l'utilisation de l'
id
attribut
- Cela causera des problèmes si vous chargez deux fois le même script
5. Parcourez tous les scripts pour trouver celui que vous voulez
Nous pouvons également parcourir tous les éléments de 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 anciens navigateurs qui ne prennent pas querySelector()
bien en charge les attributs. Par exemple:
function isMe(scriptElem){
return scriptElem.getAttribute('src') === "//example.com/embed.js";
}
Cela hérite des avantages et des problèmes de toute approche adoptée, mais ne dépend pas de querySelector()
ce qui fonctionnera dans les navigateurs plus anciens.
6. Obtenez le dernier script exécuté
Comme les scripts sont exécutés séquentiellement, le dernier élément de script sera très souvent le script en cours d'exécution:
<script>
var scripts = document.getElementsByTagName( 'script' );
var me = scripts[ scripts.length - 1 ];
</script>
Avantages
- Facile.
- Presque universellement pris en charge
- Aucun attribut ou identifiant personnalisé requis
Problèmes
- Ne fonctionne pas avec les scripts asynchrones (
defer
& async
)
- Ne fonctionne pas avec les scripts insérés dynamiquement