1. Globale Variablen verwenden
Dies ist der einfachste Weg, wie zum Beispiel Google Adsense:
Der Nachteil besteht darin, dass globale Variablen eingeführt werden. Es gibt zwei Varianten, wie Dateien eingeführt werden:
// 变体1:用document.write输出 <script type="text/javascript"> google_ga_id ='g6u7un8646xx'; document.write(unescape('%3Cscript type="text/javascript" src= "http://www.google-analytics.com/ga.js"%3E%3C/script%3E')); </script> // 变体2:用DOM操作append到head里 <script type="text/javascript"> G_BEACON_ATP ='category=&userid=&channel=112ad_id='; document.getElementsByTagName('head')[0].appendChild(document. createElement('script')).src='http://taobao.com/atp.js'; </script> // 注意:上面的代码是根据实际应用虚拟的示范代码
Hinweis: Variante 1 hat viele Anwendungsmöglichkeiten:
<script type="text/javascript"> // 直接转义即可: document.write('<script type="text/javascript" src="test.js"></script>'); // 或者像Yahoo!首页一样: document.write('<scr'+'ipt type="text/javascript" src="test.js"></scr'+'ipt>'); </script>
2. Erhalten und analysieren Sie den Quellcode des Skriptelements
Im Vergleich zu allen Variablen bevorzugen wir die Übergabe von Parametern wie den folgenden:
Das Kernproblem besteht darin, wie man das src-Attribut erhält.
Methode eins besteht darin, das ID-Attribut zum Skript hinzuzufügen, das aktuelle Skript über die ID abzurufen und dann reguläre Ausdrücke zu verwenden, um die Parameter aus src zu extrahieren. Der Nachteil besteht darin, dass das SCRIPT-Element in der HTML 4.01-Spezifikation kein id-Attribut hat. Dieser Mangel ist kein Mangel. Schließlich ist es besser, an Standards zu glauben, als keine Standards zu haben.
Methode 2 besteht darin, den Namen der js-Datei als Hook zu verwenden. Nach der Übergabe von document.getElementsByTagName('script') im js-Code wird die aktuelle js-Datei mit dem regulären Ausdruck abgeglichen. Diese Methode ist sehr orthodox, erfordert jedoch einen eindeutigen Dateinamen. Der Nachteil besteht darin, dass es viel Code gibt, dieser nicht verfeinert ist und einen leichten Einfluss auf die Leistung hat.
Methode drei basiert auf Methode eins. Fügen Sie einfach benutzerdefinierte Attributdaten hinzu:
Rufen Sie in der Datei test.js die eingehenden Parameter über die folgende Zeile ab:
var scriptArgs = document.getElementById('testScript').getAttribute('data'); Die vierte Methode besteht darin, den sequentiellen Ausführungsmechanismus von js zu verwenden (die js-Datei kann synchron oder asynchron geladen werden, aber wenn sie ausgeführt wird). müssen entsprechend sequentiell im Belegfluss ausgeführt werden). Wenn eine js-Datei ausgeführt wird, muss es die letzte unter den „geladenen“ js-Dateien sein:
var scripts = document.getElementsByTagName('script'); var currentScript = scripts[scripts.length - 1];Methode 4 ist cleverer und genialer als Methode 2.
In Bezug auf Codevereinfachung und Leistung ist Methode drei > Methode vier >
Zusammenfassung: Wenn Ihnen Standards am Herzen liegen, empfehlen wir Methode vier; wenn Sie, wie ich, nicht das Bedürfnis verspüren, Standards vollständig einzuhalten, empfehlen wir Methode drei.
Schreiben Sie ein Testprogramm
<!DOCTYPE html> <html> <script src="a2.js"> </script> <script src="a2.js"> </script> <script src="a2.js"> </script> </html>
var scripts = document.getElementsByTagName('script'); var currentScript = scripts.length;alert(currentScript);
Separat ausdrucken
1 2 3
3. Inspirationsplan
Wenn Sie wie ich ein treuer Fan von John Resig sind, erinnern Sie sich vielleicht noch an die „Degrading Script Tags“, die im August letzten Jahres viel diskutiert wurden. John Resig hat uns eine Tür der Fantasie geöffnet. Für das Problem dieses Artikels können wir auch die folgenden „bösen Wege“ nutzen, um es zu lösen:
In js-Datei:
var scripts = document.getElementsByTagName("script"); var scriptArgs = scripts[ scripts.length - 1 ].innerHTML.replace(/[s]/g, '');
Definieren Sie einfach die Funktion in der js-Datei:
TB = {}; TB.SomeFun = function(arg) { //code };
if(window.ActiveXObject) { var scripts = document.getElementsByTagName('script'); eval(scripts[scripts.length - 1].getAttribute('onload')); }