Wie kann ich auf das Skriptelement verweisen, das das aktuell ausgeführte Javascript geladen hat?
Hier ist die Situation. Ich habe ein "Master" -Skript, das hoch oben auf der Seite geladen wird, als erstes unter dem HEAD-Tag.
<!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>
In "scripts.js" befindet sich ein Skript, das in der Lage sein muss, andere Skripte bei Bedarf zu laden. Die normale Methode funktioniert bei mir nicht ganz, da ich neue Skripte hinzufügen muss, ohne auf das HEAD-Tag zu verweisen, da das HEAD-Element das Rendern noch nicht abgeschlossen hat:
document.getElementsByTagName('head')[0].appendChild(v);
Ich möchte auf das Skriptelement verweisen, das das aktuelle Skript geladen hat, damit ich meine neuen dynamisch geladenen Skript-Tags danach an das DOM anhängen kann.
<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
quelle
quelle
Antworten:
So erhalten Sie das aktuelle Skriptelement:
1. Verwenden Sie
document.currentScript
document.currentScript
gibt das<script>
Element zurück, dessen Skript gerade verarbeitet wird.Leistungen
defer
&async
)Probleme
<script type="module">
2. Wählen Sie das Skript anhand der ID aus
Wenn Sie dem Skript ein ID-Attribut geben, können Sie es einfach anhand der ID von innen auswählen
document.getElementById()
.Leistungen
defer
&async
)Probleme
id
Das Attribut kann in einigen Browsern in einigen Randfällen zu einem merkwürdigen Verhalten von Skripten führen3. Wählen Sie das Skript mit einem
data-*
Attribut ausWenn Sie dem Skript ein
data-*
Attribut geben, können Sie es einfach von innen auswählen.Dies hat gegenüber der vorherigen Option nur wenige Vorteile.
Leistungen
defer
&async
)Probleme
querySelector()
nicht in allen Browsern kompatibelid
Attributs<script>
mitid
Rand Fällen.4. Wählen Sie das Skript von src aus
Anstatt die Datenattribute zu verwenden, können Sie den Skript mithilfe des Selektors nach Quelle auswählen:
In embedded.js:
Leistungen
defer
&async
)Probleme
id
Attributs5. Durchlaufen Sie alle Skripte, um das gewünschte zu finden
Wir können auch jedes Skriptelement durchlaufen und jedes einzeln überprüfen, um das gewünschte auszuwählen:
Auf diese Weise können wir beide vorherigen Techniken in älteren Browsern verwenden, die
querySelector()
Attribute nicht gut unterstützen . Zum Beispiel:Dies erbt die Vorteile und Probleme eines jeden Ansatzes, ist jedoch nicht darauf angewiesen,
querySelector()
dass dies in älteren Browsern funktioniert.6. Holen Sie sich das zuletzt ausgeführte Skript
Da die Skripte nacheinander ausgeführt werden, ist das letzte Skriptelement sehr oft das aktuell ausgeführte Skript:
Leistungen
Probleme
defer
&async
)quelle
script
in einemtemplate
in einem Shadow DOM eingefügtenDa Skripte nacheinander ausgeführt werden, ist das aktuell ausgeführte Skript-Tag bis dahin immer das letzte Skript-Tag auf der Seite. Um das Skript-Tag zu erhalten, haben Sie folgende Möglichkeiten:
quelle
Am einfachsten wäre es wahrscheinlich, Ihrem Scrip-Tag ein
id
Attribut zu geben .quelle
Skripte werden nur nacheinander ausgeführt, wenn sie weder ein "defer" - noch ein "async" -Attribut haben. Die Kenntnis eines der möglichen ID / SRC / TITLE-Attribute des Skript-Tags könnte auch in diesen Fällen funktionieren. Die Vorschläge von Greg und Justin sind also richtig.
Es gibt bereits einen Vorschlag für eine
document.currentScript
auf den WHATWG-Listen.BEARBEITEN : Firefox> 4 implementiert diese sehr nützliche Eigenschaft bereits, ist jedoch in IE11 nicht verfügbar, das ich zuletzt überprüft habe, und nur in Chrome 29 und Safari 8 verfügbar.
BEARBEITEN : Niemand hat die Sammlung "document.scripts" erwähnt, aber ich glaube, dass das Folgende eine gute Cross-Browser-Alternative sein kann, um das aktuell ausgeführte Skript zu erhalten:
quelle
Hier ist eine Art Polyfill, die nutzt,
document.CurrentScript
wenn sie vorhanden ist, und auf das Suchen des Skripts anhand der ID zurückgreift.Wenn Sie dies oben in jedes Skript-Tag einfügen, können Sie meines Erachtens konsistent wissen, welches Skript-Tag ausgelöst wird, und Sie können das Skript-Tag auch im Kontext eines asynchronen Rückrufs referenzieren.
Ungetestet, hinterlassen Sie also Feedback für andere, wenn Sie es versuchen.
quelle
id
Attribut ist jedoch in einemscript
Element ungültig . Welche Probleme könnte dieser Ansatz verursachen?id
Attribut haben.id
,class
Undslot
sind auf der DOM - Ebene, nicht die HTML - Ebene definiert. Wenn Sie zu den globalen Attributen in HTML gehen und über die Liste scrollen, finden Sie "DOM-Standard definiert die Benutzeragentenanforderungen für die Klassen-, ID- und Slot-Attribute für jedes Element in einem beliebigen Namespace." gefolgt von "Die Klassen-, ID- und Slot-Attribute können für alle HTML-Elemente angegeben werden." Die DOM-Spezifikation deckt dies hier ab .Es muss beim Laden der Seite funktionieren und wenn ein Skript-Tag mit Javascript hinzugefügt wird (z. B. mit Ajax).
quelle
Befolgen Sie diese einfachen Schritte, um einen Verweis auf den aktuell ausgeführten Skriptblock zu erhalten:
Beispiel (ABCDE345678 ist die eindeutige ID) :
Übrigens können Sie für Ihren Fall einfach die altmodische document.write () -Methode verwenden, um ein anderes Skript einzuschließen. Wie Sie bereits erwähnt haben, dass DOM noch nicht gerendert wurde, können Sie die Tatsache nutzen, dass der Browser das Skript immer in linearer Reihenfolge ausführt (mit Ausnahme des verzögerten Skripts, das später gerendert wird), sodass der Rest Ihres Dokuments immer noch "nicht vorhanden" ist. Alles, was Sie über document.write () schreiben, wird direkt nach dem Aufruferskript platziert.
Beispiel einer ursprünglichen HTML-Seite :
Inhalt von script.js :
Nach dem Rendern wird die DOM-Struktur zu:
quelle
Ein Ansatz für den Umgang mit asynchronen und verzögerten Skripten besteht darin, den Onload-Handler zu nutzen. Legen Sie einen Onload-Handler für alle Skript-Tags fest, und der erste, der ausgeführt wird, sollte Ihnen gehören.
quelle
Um das Skript zu erhalten, das aktuell das Skript geladen hat, können Sie es verwenden
Sie müssen am Anfang Ihres Skripts eine Referenz aufbewahren, damit Sie später aufrufen können
quelle
Betrachten Sie diesen Algorithmus. Wenn Ihr Skript geladen wird (wenn mehrere identische Skripte vorhanden sind), durchsuchen Sie document.scripts, suchen Sie das erste Skript mit dem richtigen "src" -Attribut, speichern Sie es und markieren Sie es als "besucht" mit einem Datenattribut oder einem eindeutigen Klassennamen.
Wenn das nächste Skript geladen wird, durchsuchen Sie document.scripts erneut und übergeben Sie alle Skripte, die bereits als besucht markiert sind. Nehmen Sie die erste nicht besuchte Instanz dieses Skripts.
Dies setzt voraus, dass identische Skripte wahrscheinlich in der Reihenfolge ausgeführt werden, in der sie geladen werden, von Kopf zu Körper, von oben nach unten, von synchron zu asynchron.
Dadurch wird das gesamte Skript nach dem ersten übereinstimmenden Skript durchsucht, das nicht mit dem speziellen Attribut gekennzeichnet ist.
Markieren Sie dann diesen Knoten, falls gefunden, mit einem Datenattribut, damit nachfolgende Scans ihn nicht auswählen. Dies ähnelt den Graph-Traversal-BFS- und DFS-Algorithmen, bei denen Knoten als "besucht" markiert werden können, um ein erneutes Aufrufen zu verhindern.
quelle
Ich habe dies, das in FF3, IE6 und 7 funktioniert. Die Methoden in den bei Bedarf geladenen Skripten sind erst verfügbar, wenn das Laden der Seite abgeschlossen ist, aber dies ist immer noch sehr nützlich.
quelle
Wenn Sie den Dateinamen des Skripts annehmen können, können Sie ihn finden. Ich habe bisher nur die folgende Funktion in Firefox wirklich getestet.
quelle
Ich habe festgestellt, dass der folgende Code am konsistentesten, performantesten und einfachsten ist.
quelle