2010-06-10 5 views
19

Hey alle, ich habe versucht, zusammen, um eine generische Funktion zu werfen, die die absolute URL einer Ausführung JavaScript-Datei auf einer Webseite abruft:Erste URL JavaScript-Datei ausführen (IE6-7 Problem meistens)

http://gist.github.com/433486

Grundsätzlich bekommt man so etwas zu nennen:

getScriptName(function(url) { 
    console.log(url); 
    // http://www.example.com/myExternalJsFile.js 
}); 

innerhalb einer externen JavaScript-Datei auf einer Seite und kann dann mit ihm etwas tun (wie finden Sie den <script> Tag, das es zum Beispiel geladen).

Es funktioniert gut in fast allen Browsern, die ich getestet habe (Firefox, Chrome, Safari, Opera v10 mindestens und IE 8).

Es scheint jedoch in IE 6 und 7 zu scheitern. Die Callback-Funktion wird ausgeführt, aber der abgerufene Name ist die URL zur Haupt-HTML-Seite, nicht die JavaScript-Datei. mit dem Beispiel fort, ruft getScriptName den Rückruf mit dem Parameter: http://www.example.com/index.html

Also alles, was ich wirklich frage mich, wenn es eine andere Möglichkeit ist die immer die URL der aktuellen JavaScript-Datei (die könnte IE 6 und 7 spezifische hackery) Danke im Voraus!

EDIT: Auch dies wird in jedem Fall nicht funktionieren, so bitte nicht empfehlen:

var scripts = document.getElementsByTagName("script"); 
return scripts[scripts.length-1].src; 

Ich mag es im Fall von dynamisch erstellten Script-Tags arbeiten (möglicherweise nicht zuletzt auf der Seite platziert), aka lazy-loading.

+1

Netter Code und Frage. Obwohl ich keine Antwort darauf weiß, möchte ich Ihnen nur ein paar Optimierungen geben: Sie können jedes 'obj ['prop']' in 'obj ändern.prop 'und als' typeof' gibt immer einen String zurück, man muss nicht auf Identität prüfen ('==='); Das Testen auf Gleichheit ('==') ist gut genug. Diese funktionieren etwas besser als die Dinge in Ihrem Code. –

+0

Danke. Ja, ich weiß, dass ich obj ['prop'] zu obj.prop ersetzen kann, ich hatte es gerade so in Vorbereitung, um die Funktion an den Google Closure Compiler zu senden, der diese Variablennamen verfehlen würde. Ich werde die === zu a == obwohl, danke! – TooTallNate

+0

Ich habe gerade den Zugriff auf 'obj ['prop']' gegen 'obj.prop' getestet, aber im Gegensatz zu dem, was ich dachte, war der Unterschied in Firefox vernachlässigbar, während in Chrome der erstere tatsächlich * schneller * war als der letztere . Ich bin wirklich überrascht darüber, es könnte etwas mit der "Zusammenstellung" von JavaScript durch V8 zu tun haben. –

Antwort

1

Eine Menge davon hängt davon ab, auf was Sie zugreifen können. Wenn Sie, wie es aussieht, versuchen, dies vollständig innerhalb des JS-Codes zu tun, glaube ich nicht, dass Sie das aus einigen der oben genannten Gründe tun können. Sie könnten 90% des Weges vielleicht bekommen, aber nicht definitiv sein.

Wenn Sie in einer Dotnet-Umgebung arbeiten (die einzige, die ich kenne), würde ich vorschlagen, ein Modul zu verwenden, das alle JS-Anfragen abfängt und ihnen den Anfrageort oder etwas von dieser Art hinzufügt.

Ich denke, Sie müssen dies von der Server-Seite, nicht die Client-Seite zu adressieren. Ich glaube nicht, dass Sie eine definitive Antwort von der Kundenseite haben werden. Ich denke, Sie werden auch Schwierigkeiten haben, eine Antwort von der Serverseite zu bekommen, aber Sie könnten erfolgreicher sein.

1

Entschuldigung, ich vermute, Sie könnten damit kämpfen. IE älter als Version 8 gibt normalerweise Fehlermeldungen von JavaScript-Fehler in der Form:

line: 342 
char: 3 
error: expected identifier, string or number 
code: 0 
url: http://example.com/path/to/resource 

wo die URL der window.location.href ist, anstatt die URL der externen Javascript-Ressource, die das Problem enthält. Ich schlage vor, dass IE den nicht hilfreichen URL-Wert angibt, da die Skript-URL zu diesem Zeitpunkt für den IE nicht verfügbar ist, und auch nicht für jedes Javascript, das Sie schreiben könnten, um es anzuzeigen.

Ich würde gerne in der Lage sein, zu IE8 Release Notes zu verlinken, die sagen, dass dieser Bug/Feature behoben wurde, daher der Grund, warum ich dies als Community Wiki erstellt habe. Mein MSDN foo ist ziemlich schwach!