Est-ce le dernier élément `script` du script actuellement en cours d'exécution?

Est-il sûr de supposer que le dernier élément de script * dans le document lorsque le script s'exécute ** est le script en cours d'exécution?

Par exemple, je veux créer un script qui peut être supprimé n'importe où dans le corps d'une page et afficher un élément au même endroit. Je fais quelque chose comme ça:

 function getCurrentScriptElement() { var scripts = document.getElementsByTagName('script'); return scripts[scripts.length - 1]; } var script = getCurrentScriptElement(); var view = document.createElement('span'); /* Put stuff in our view... */ script.parentNode.insertBefore(view, script); 

En supposant que le script se trouve dans le corps du document, est-ce "sûr"? La fonction getCurrentScriptElement t- getCurrentScriptElement toujours le script en cours d'exécution? Sinon, comment peut-on faire?

Je voudrais le faire sans attacher le script à un attribut d'identification spécifique ou similaire, j'aimerais qu'il soit positionné.


J'ai créé un exemple ici qui tire dans ce script . Une réponse a suggéré que d'autres scripts pourraient créer une condition où un exemple comme celui-ci se romprait. Est-il possible d'ajouter d'autres scripts à cet exemple qui le brise?


Il a été suggéré que d'autres scripts avec des attributs async ou async pourraient rompre cela. Quelqu'un peut-il donner un exemple de la façon dont un tel script pourrait fonctionner?

Si je comprends bien, defer signifie charger le DOM d'abord, puis exécutez le script avec la balise de defer . Comment l'attribut de defer apparaissant sur un autre élément de script affecte-t-il le comportement de getCurrentScriptElement ?

async , si je comprends bien, signifie commencer à récupérer ce script et continuer à analyser les DOM en même temps, n'attendez pas … mais quand il frappe mon script, il doit s'arrêter et attendre, n'est-ce pas?

Je ne vois pas comment l'un ou l'autre pourrait l'affecter, est-ce que quelqu'un peut fournir un exemple?


* Je ne suis intéressé que par des scripts externes aux fins de cette question.

** Pas le dernier élément de script dans l'intégralité du document, mais le dernier élément de script du document au moment où il s'exécute. Le reste du document ne doit pas encore être chargé, n'est-ce pas?

Ce n'est pas une garantie absolue non. Découvrez ce JSFiddle: http://jsfiddle.net/jAsek/

 <!DOCTYPE html> <title>Test case</title> <div> <p>At the start</p> <script id="first"> var scr1 = document.createElement("script"); scr1.setAttribute("id", "early"); document.body.appendChild(scr1); </script> <p>After the first script</p> <script id="second"> function getCurrentScriptElement() { var scripts = document.getElementsByTagName('script'); return scripts[scripts.length - 1]; } alert(getCurrentScriptElement().id); </script> <p>At the end</p> </div> 

Ici, l'alerte indique l'id du script injecté "tôt", pas l'id du script en cours d'exécution "seconde".

Il n'y a pas de différence pratique entre les scripts internes et externes.

Je ne pense pas que ce soit une hypothèse sûre, car les navigateurs exécutent le code javascript différemment selon un certain nombre de choses (comme si vous disposiez d'autres éléments de script dans la tête, s'ils sont externes, etc.).

Vous devriez simplement obliger les gens à utiliser un élément fictif avec un identifiant ou une classe personnalisé. De cette façon, vous pourrez également faire tout ce que vous faites plusieurs fois par page sans avoir à exécuter le script plusieurs fois.

C'est aussi ce qui se fait lors de l'utilisation de widgets, par exemple le bouton +1 de Google.

Une alternative serait d'utiliser document.write pour écrire du contenu supplémentaire pendant que le script est exécuté. Cela ne remplacera pas la balise de script, mais ajoutez simplement quelque chose après cela.