Comment puis-je trouver l'élément script associé au script actuellement en cours d'exécution ? Je m'intéresse uniquement aux scripts à l'intérieur du corps du document, pas dans l'en-tête (ou ailleurs).
Voici ce que j'ai jusqu'à présent, cela semble fonctionner correctement. Y a-t-il des pièges possibles auxquels je ne pense pas ?
function getCurrentScriptElement() {
var placeholderId = 'placeholder-' + Math.random(),
script, placeholder;
document.write('');
placeholder = document.getElementById(placeholderId);
script = placeholder.previousSibling;
placeholder.parentNode.removeChild(placeholder);
return script;
}
Le cas d'utilisation que j'ai en tête pour cela implique des scripts qui ont besoin d'injecter du contenu au même endroit dans le document où la balise script apparaît, donc le chargement différé ne posera pas de problème. En d'autres termes, je n'appellerai cette fonction que dans des endroits où c'est approprié, elle ne sera pas exposée en tant que partie d'une API ou quoi que ce soit d'autre.
Je suis également conscient du problème avec document.write
et XHTML, et je ne m'en fais pas dans ce cas (jusqu'à présent).
Ma tentative précédente ressemblait à ceci :
function getCurrentScriptElement() {
var scripts = document.getElementsByTagName('script');
return scripts[scripts.length - 1];
}
Mais, comme nous le voyons dans cette question, cela pourrait facilement échouer si un autre script a été injecté dans le document.
J'ai également trouvé document.currentScript
dans ce spec du WHATWG. Il ne semble pas largement pris en charge pour le moment. Il y a un shim intéressant pour document.currentScript
qui prend un autre chemin... Le script déclenche une erreur, l'attrape, inspecte la pile d'appels pour trouver l'URL du script, puis trouve l'élément script avec l'attribut src
correspondant.
C'est une astucieuse solution, mais apparemment elle ne fonctionnera pas dans IE, et elle se casserait si plusieurs scripts utilisent des URL identiques.
Idéalement, j'aimerais trouver une solution qui donne le même résultat que l'exemple de code en haut (pas de nouvelles exigences), mais qui ne repose pas sur document.write
. Est-ce possible ? Sinon, ce code est-il assez sûr en supposant qu'il est utilisé correctement (uniquement pendant le chargement de la page, pas en XHTML) ?
Édition : Voir cette réponse pour un autre cas d'utilisation potentiel, et des détails sur la raison pour laquelle un élément br
est utilisé pour le placeholder.