386 Stimmen

Wie kann ich auf das Skript-Tag verweisen, das das aktuell ausgeführte Skript geladen hat?

Wie kann ich auf das Skript-Element verweisen, das das gerade laufende Javascript geladen hat?

Die Situation ist wie folgt. Ich habe ein "Master"-Skript, das ganz 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>

Es gibt ein Skript in der Datei "scripts.js", das in der Lage sein muss, andere Skripte auf Abruf zu laden. Die normale Methode funktioniert für mich nicht ganz, weil ich neue Skripte hinzufügen muss, ohne auf das HEAD-Tag zu verweisen, weil das HEAD-Element noch nicht fertig gerendert ist:

document.getElementsByTagName('head')[0].appendChild(v);

Ich möchte auf das Skriptelement verweisen, das das aktuelle Skript geladen hat, so dass 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>

838voto

brice Punkte 22973

So erhalten Sie das aktuelle Skriptelement:

1. Verwenden Sie document.currentScript

document.currentScript gibt die <script> Element, dessen Skript gerade bearbeitet wird.

<script>
var me = document.currentScript;
</script>

Vorteile

  • Einfach und eindeutig. Zuverlässig.
  • Sie brauchen das Skript-Tag nicht zu ändern
  • Arbeitet mit asynchronen Skripten ( defer & async )
  • Arbeitet mit dynamisch eingefügten Skripten

Probleme

  • Funktioniert nicht in älteren Browsern und IE.
  • Funktioniert nicht mit Modulen <script type="module">

2. Skript nach ID auswählen

Wenn Sie dem Skript ein id-Attribut zuweisen, können Sie es leicht über die id aus der Anwendung heraus auswählen document.getElementById() .

<script id="myscript">
var me = document.getElementById('myscript');
</script>

Vorteile

  • Einfach und eindeutig. Zuverlässig.
  • Nahezu universell unterstützt
  • Arbeitet mit asynchronen Skripten ( defer & async )
  • Arbeitet mit dynamisch eingefügten Skripten

Probleme

  • Erfordert das Hinzufügen eines benutzerdefinierten Attributs zum Skript-Tag
  • id Attribut kann in einigen Browsern in einigen Randfällen ein seltsames Verhalten für Skripte verursachen

3. Wählen Sie das Skript mit einem data-* Attribut

Geben Sie dem Skript eine data-* können Sie es leicht von innen heraus auswählen.

<script data-name="myscript">
var me = document.querySelector('script[data-name="myscript"]');
</script>

Dies hat nur wenige Vorteile gegenüber der vorherigen Option.

Vorteile

  • Einfach und eindeutig.
  • Arbeitet mit asynchronen Skripten ( defer & async )
  • Arbeitet mit dynamisch eingefügten Skripten

Probleme

  • Erfordert das Hinzufügen eines benutzerdefinierten Attributs zum Skript-Tag
  • HTML5, und querySelector() nicht mit allen Browsern kompatibel
  • Weniger weit verbreitet als die Verwendung des id Attribut
  • Wird sich herumsprechen <script> avec id Grenzfälle.
  • Es kann zu Verwechslungen kommen, wenn ein anderes Element auf der Seite das gleiche Datenattribut und den gleichen Wert hat.

4. Wählen Sie das Skript nach src

Anstatt die Datenattribute zu verwenden, können Sie den Selektor verwenden, um das Skript nach Quelle auszuwählen:

<script src="//example.com/embed.js"></script>

In embed.js:

var me = document.querySelector('script[src="//example.com/embed.js"]');

Vorteile

  • Zuverlässig
  • Arbeitet mit asynchronen Skripten ( defer & async )
  • Arbeitet mit dynamisch eingefügten Skripten
  • Keine benutzerdefinierten Attribute oder id erforderlich

Probleme

  • Hat pas Arbeit für lokale Skripte
  • Verursacht Probleme in verschiedenen Umgebungen, wie Entwicklung und Produktion
  • Statisch und zerbrechlich. Wenn Sie den Speicherort der Skriptdatei ändern, müssen Sie das Skript modifizieren
  • Weniger weit verbreitet als die Verwendung des id Attribut
  • Führt zu Problemen, wenn Sie das gleiche Skript zweimal laden

5. Schleife über alle Skripte, um das gewünschte zu finden

Wir können auch jedes Skriptelement in einer Schleife durchlaufen und jedes einzelne überprüfen, um das gewünschte Element auszuwählen:

<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>

So können wir beide Techniken auch in älteren Browsern verwenden, die keine Unterstützung für querySelector() gut mit Attributen. Zum Beispiel:

function isMe(scriptElem){
    return scriptElem.getAttribute('src') === "//example.com/embed.js";
}

Sie übernimmt die Vorteile und Probleme des jeweiligen Ansatzes, verlässt sich aber nicht auf querySelector() funktioniert also auch in älteren Browsern.

6. Abrufen des zuletzt ausgeführten Skripts

Da die Skripte nacheinander ausgeführt werden, ist das letzte Skriptelement sehr oft das aktuell laufende Skript:

<script>
var scripts = document.getElementsByTagName( 'script' );
var me = scripts[ scripts.length - 1 ];
</script>

Vorteile

  • Einfach.
  • Nahezu universell unterstützt
  • Keine benutzerdefinierten Attribute oder id erforderlich

Probleme

  • Hat pas mit asynchronen Skripten arbeiten ( defer & async )
  • Hat pas Arbeit mit dynamisch eingefügten Skripten

90voto

Coffee Bite Punkte 4666

Da Skripte sequentiell ausgeführt werden, ist das aktuell ausgeführte Skript-Tag immer das letzte Skript-Tag auf der Seite bis dahin. Um das Skript-Tag zu erhalten, können Sie also Folgendes tun:

var scripts = document.getElementsByTagName( 'script' );
var thisScriptTag = scripts[ scripts.length - 1 ];

17voto

Greg Punkte 306033

Am einfachsten wäre es wohl, wenn Sie Ihrem Gutschein ein id Attribut.

12voto

Diego Perini Punkte 7613

Skripte werden nur dann sequentiell 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. Beide Vorschläge von Greg und Justin sind also richtig.

Es gibt bereits einen Vorschlag für eine document.currentScript auf den WHATWG-Listen.

エディトリアル : Firefox > 4 implementiert diese sehr nützliche Eigenschaft bereits, aber sie ist nicht im IE11 verfügbar, als ich das letzte Mal nachgesehen habe, und nur in Chrome 29 und Safari 8.

エディトリアル : Niemand hat die "document.scripts"-Sammlung erwähnt, aber ich glaube, dass das Folgende eine gute browserübergreifende Alternative sein könnte, um das aktuell laufende Skript zu erhalten:

var me = document.scripts[document.scripts.length -1];

12voto

Art Lawry Punkte 121

Hier ist ein kleiner Teil eines Polyfills, der die document.CurrentScript wenn es existiert, und greift auf die Suche nach dem Skript anhand der ID zurück.

<script id="uniqueScriptId">
    (function () {
        var thisScript = document.CurrentScript || document.getElementByID('uniqueScriptId');

        // your code referencing thisScript here
    ());
</script>

Wenn Sie dies am Anfang jedes Skript-Tags einfügen, werden Sie in der Lage sein, immer zu wissen, welches Skript-Tag abgefeuert wird, und Sie werden auch in der Lage sein, das Skript-Tag im Kontext eines asynchronen Rückrufs zu referenzieren.

Ungetestet, also hinterlassen Sie eine Rückmeldung für andere, wenn Sie es ausprobieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X