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>

1voto

Ich habe das hier, das in FF3, IE6 und 7 funktioniert. Die Methoden in den auf Abruf geladenen Skripten sind nicht verfügbar, bis die Seite vollständig geladen ist, aber dies ist immer noch sehr nützlich.

//handle on-demand loading of javascripts
makescript = function(url){
    var v = document.createElement('script');
    v.src=url;
    v.type='text/javascript';

    //insertAfter. Get last <script> tag in DOM
    d=document.getElementsByTagName('script')[(document.getElementsByTagName('script').length-1)];
    d.parentNode.insertBefore( v, d.nextSibling );
}

0voto

Justin Love Punkte 4367

Wenn Sie den Dateinamen des Skripts kennen, können Sie es finden. Die folgende Funktion habe ich bisher nur in Firefox getestet.

  function findMe(tag, attr, file) {
    var tags = document.getElementsByTagName(tag);
    var r = new RegExp(file + '$');
    for (var i = 0;i < tags.length;i++) {
      if (r.exec(tags[i][attr])) {
        return tags[i][attr];
      }
    }
  };
  var element = findMe('script', 'src', 'scripts.js');

0voto

Ron Newcomb Punkte 2505

Ich habe eingefügt script Tags dynamisch mit dieser üblichen Alternative zu eval und setzen Sie einfach eine globale Eigenschaft currentComponentScript unmittelbar vor dem Hinzufügen zum DOM.

  const old = el.querySelector("script")[0];
  const replacement = document.createElement("script");
  replacement.setAttribute("type", "module");
  replacement.appendChild(document.createTextNode(old.innerHTML));
  window.currentComponentScript = replacement;
  old.replaceWith(replacement);

Funktioniert allerdings nicht in einer Schleife. Das DOM führt die Skripte erst bei der nächsten Makroaufgabe aus, so dass bei einem Stapel von Skripten nur der zuletzt gesetzte Wert angezeigt wird. Sie müssten setTimeout den ganzen Absatz, und dann setTimeout die nächste, nachdem die vorhergehende beendet ist. D.h. Verkettung der setTimeouts, nicht nur Aufruf setTimeout mehrmals hintereinander in einer Schleife.

-1voto

Travis Tidwell Punkte 5084

Ich habe festgestellt, dass der folgende Code am konsistentesten, leistungsfähigsten und einfachsten ist.

var scripts = document.getElementsByTagName('script');
var thisScript = null;
var i = scripts.length;
while (i--) {
  if (scripts[i].src && (scripts[i].src.indexOf('yourscript.js') !== -1)) {
    thisScript = scripts[i];
    break;
  }
}
console.log(thisScript);

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