Comment puis-je référencer l'élément de script qui a chargé le javascript en cours d'exécution?
Voici la situation. J'ai un script "maître" chargé en haut de la page, la première chose 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 y a un script dans "scripts.js" qui doit être capable de charger à la demande d'autres scripts. La méthode normale ne fonctionne pas tout à fait pour moi car j'ai besoin d'ajouter de nouveaux scripts sans référencer la balise HEAD, car l'élément HEAD n'a pas terminé le rendu:
document.getElementsByTagName('head')[0].appendChild(v);
Ce que je veux faire, c'est référencer l'élément de script qui a chargé le script actuel afin que je puisse ensuite ajouter mes nouvelles balises de 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>
javascript
element
parent
Shog9
la source
la source
Réponses:
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.Avantages
defer
&async
)Problèmes
<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()
.Avantages
defer
&async
)Problèmes
id
l'attribut peut provoquer un comportement étrange pour les scripts dans certains navigateurs pour certains cas marginaux3. Sélectionnez le script à l'aide d'un
data-*
attributAttribuer au script un
data-*
attribut vous permettra de le sélectionner facilement de l'intérieur.Cela présente peu d'avantages par rapport à l'option précédente.
Avantages
defer
&async
)Problèmes
querySelector()
non compatible avec tous les navigateursid
attribut<script>
avec desid
cas de bord.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:
Dans embed.js:
Avantages
defer
&async
)Problèmes
id
attribut5. 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:
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: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:
Avantages
Problèmes
defer
&async
)la source
script
esttemplate
inséré dans un DOM fantômeÉtant donné que les scripts sont exécutés séquentiellement, la balise de script actuellement exécutée est toujours la dernière balise de script sur la page jusque-là. Donc, pour obtenir la balise de script, vous pouvez faire:
la source
La chose la plus simple à faire serait probablement d'attribuer à votre balise de script un
id
attribut.la source
Les scripts ne sont exécutés séquentiellement que s'ils n'ont pas d'attribut "defer" ou "async". La connaissance de l'un des attributs ID / SRC / TITLE possibles de la balise de script pourrait également fonctionner dans ces cas. Les suggestions de Greg et Justin sont donc correctes.
Il y a déjà une proposition pour un
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 la dernière fois que j'ai vérifié et uniquement 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 multi-navigateur pour obtenir le script en cours d'exécution:
la source
Voici un peu d'un polyfill qui tire parti
document.CurrentScript
s'il existe et revient à trouver le script par ID.Si vous l'incluez en haut de chaque balise de script, je pense que vous pourrez toujours savoir quelle balise de script est déclenchée, et vous pourrez également référencer la balise de script dans le contexte d'un rappel asynchrone.
Non testé, alors laissez des commentaires aux autres si vous l'essayez.
la source
id
attribut n'est cependant pas valide dans unscript
élément. Quels types de problèmes cette approche pourrait-elle générer?id
attribut.id
,,class
etslot
sont définis au niveau DOM, pas au niveau HTML. Si vous accédez aux attributs globaux en HTML et faites défiler la liste, vous constaterez que «la norme DOM définit les exigences de l'agent utilisateur pour les attributs de classe, id et slot pour tout élément dans n'importe quel espace de noms». suivi de "Les attributs class, id et slot peuvent être spécifiés sur tous les éléments HTML." La spécification DOM le couvre ici .Il doit fonctionner au chargement de la page et lorsqu'une balise de script est ajoutée avec javascript (ex. Avec ajax)
la source
Suivez ces étapes simples pour obtenir une référence au bloc de script en cours d'exécution:
Exemple (ABCDE345678 est l'ID unique) :
btw, pour votre cas, vous pouvez simplement utiliser la méthode document.write () à l'ancienne 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 le script dans une séquence linéaire (à l'exception de celui différé qui sera rendu plus tard), de sorte que le reste de votre document est toujours "inexistant". Tout ce que vous écrivez via document.write () sera placé juste après le script de l'appelant.
Exemple de page HTML d'origine :
Contenu de script.js :
Après rendu, la structure DOM deviendra:
la source
Une approche pour gérer les scripts asynchrones et différés consiste à utiliser le gestionnaire onload - définissez un gestionnaire onload pour toutes les balises de script et le premier qui s'exécute doit être le vôtre.
la source
Pour obtenir le script, qui a actuellement chargé le script, vous pouvez utiliser
Vous devez conserver une référence au début de votre script, afin que vous puissiez appeler plus tard
la source
Considérez cet algorithme. Lorsque votre script se charge (s'il existe plusieurs scripts identiques), parcourez document.scripts, recherchez le premier script avec l'attribut "src" correct, enregistrez-le et marquez-le comme "visité" avec un attribut de données ou un nom de classe unique.
Lorsque le prochain script se charge, parcourez à nouveau le document.scripts, en passant sur tout script déjà marqué comme visité. Prenez la première instance non visitée de ce script.
Cela suppose que des scripts identiques s'exécuteront probablement dans l'ordre dans lequel ils sont chargés, de la tête au corps, de haut en bas, de synchrone à asynchrone.
Cela va parcourir tout le script pour le premier script correspondant qui n'est pas marqué avec l'attribut spécial.
Ensuite, marquez ce nœud, s'il est trouvé, avec un attribut de données afin que les analyses suivantes ne le choisissent pas. Ceci est similaire aux algorithmes BFS et DFS de traversée de graphe où les nœuds peuvent être marqués comme «visités» pour empêcher une nouvelle visite.
la source
J'ai ceci, qui fonctionne dans FF3, IE6 et 7. Les méthodes dans les scripts chargés à la demande ne sont pas disponibles jusqu'à ce que le chargement de la page soit terminé, mais cela est toujours très utile.
la source
Si vous pouvez assumer le nom de fichier du script, vous pouvez le trouver. Jusqu'à présent, je n'ai vraiment testé que la fonction suivante dans Firefox.
la source
J'ai trouvé que le code suivant était le plus cohérent, le plus performant et le plus simple.
la source