2009-06-12 10 views
31

Gibt es eine einfache und zuverlässige Möglichkeit, die URL der aktuell ausgeführten JavaScript-Datei (innerhalb einer Webseite) zu bestimmen?Was ist meine Skript-URL?

Mein einziger Gedanke hier ist das Scannen des DOM für alle Attribute des Skripts src, um zu finden, wie die aktuelle Datei referenziert wurde, und dann die absolute URL herauszufinden, indem man sie auf document.location anwendet. Hat jemand andere Ideen, gibt es eine super-einfache Methode, die ich komplett übersehen habe?

UPDATE: Skriptelemente, auf die über das DOM zugegriffen wird, verfügen bereits über eine src-Eigenschaft, die die vollständige URL enthält. Ich weiß nicht, wie ubiquitär/Standard das ist, aber alternativ können Sie getAttribute("src") verwenden, die jeden beliebigen Attributwert im [X] HTML zurückgibt.

+0

möglich Duplikat [Wie kann ich den Skript Dateinamen erhält aus diesem Skript?] (Http://stackoverflow.com/questions/710957/how-might-i-get-the -script-filename-from-in-that-script) – Bergi

Antwort

40

Setzen Sie dies in die JS-Datei, die ihre eigene URL kennen muss.

Fully Qualified (zB http://www.example.com/js/main.js):

var scriptSource = (function(scripts) { 
    var scripts = document.getElementsByTagName('script'), 
     script = scripts[scripts.length - 1]; 

    if (script.getAttribute.length !== undefined) { 
     return script.src 
    } 

    return script.getAttribute('src', -1) 
}()); 

Oder Wie es in der Quelle erscheint (zB /js/main.js):

var scriptSource = (function() { 
    var scripts = document.getElementsByTagName('script'), 
     script = scripts[scripts.length - 1]; 

    if (script.getAttribute.length !== undefined) { 
     return script.getAttribute('src') 
    } 

    return script.getAttribute('src', 2) 
}()); 

Siehe http://www.glennjones.net/Post/809/getAttributehrefbug.htm zur Erläuterung des getAttribute Parameter ist verwendet (es ist ein IE-Fehler).

+0

Spiegeln GREAT! Vielen Dank! –

+1

Für die voll qualifizierten können Sie nicht einfach script.src verwenden? Warum verwenden Sie script.getAttribute ('src', -1) ??? –

+9

Große Antwort. Ein Vorbehalt - das Skript ist faul geladen (wird von einem anderen Skript in das DOM eingefügt), es ist nicht das letzte Skript im DOM, daher funktioniert dieses genaue Snippet nicht. – ripper234

0

Wenn dies eine reine Client-Lösung ist, klingt Ihre ziemlich gut.

Wenn Sie Code auf dem Server schreiben, könnten Sie wahrscheinlich einfach ein div/verstecktes Feld/(fügen Sie hier Ihr Lieblings - HTML - Element ein) mit der vollständig aufgelösten URL zum Skript füllen und dieses mit Ihrem Javascript auf dem Klientenseite.

+0

Server-Seite, er könnte nur die js Trog asp/php/jsp/cgi dienen und die URL in Javascript von dort ausgeben. – ZJR

+0

@ZJR - Ich genieße gerade die Idee einer "JS-Trog", aber es ist serviert;) – simon

0

Vielleicht möchten Sie einen Blick auf https://addons.mozilla.org/en-US/firefox/addon/10345 werfen, wenn Sie erfahren möchten, welche Funktionen (und damit welche Datei) auf einer Seite ausgeführt werden, die Sie nicht steuern.

Wenn Sie herausfinden möchten, welche von Ihre Skripte ausgeführt wird, dann gibt es eine Reihe von Möglichkeiten. Mit Firebug könntest du die Informationen console.log() eingeben. Auch wenn Sie Ihren Code nur mit Alert-Anweisungen versehen (was lästig ist), können Sie auf eine Low-Tech-Art debuggen. Sie könnten auch Fehler auslösen und abfangen und dann die Fehlereigenschaften verarbeiten (siehe: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error).

Warum sollte dies jedoch wichtig sein? Wenn das Skript bereits Fehler verursacht, ist es einfach genug festzustellen, wo der Fehler auftritt. Wenn es überhaupt nicht um Fehler geht, was ist dann der Vorteil, wenn man weiß, welche Datei davon kommt?

+0

In meinem aktuellen Projekt sind die JavaScript-Ressourcen-Dateien in einem bestimmten Unterverzeichnis festgelegt. Wenn ich die absolute URL des Skripts herausfinde, kann ich sagen, was das lokale Basisverzeichnis ist, also kann ich es abziehen, um den "Schlüssel" des Dokuments zu erhalten (wie auf der Serverseite bekannt). Es wird zum Generieren von Formularen, asynchronen Anfragen usw. und nicht zum Debuggen verwendet. –

+0

In diesem Fall ist das, was Sie oben vorgeschlagen haben, die einzig wirklich verfügbare Lösung. –

6

Wie es in Quelle erscheint (z.B. /js/main.js), ist dies Quer Browser:

var scriptSource = (function() 
{ 
    var scripts = document.getElementsByTagName('script'), 
     script = scripts[scripts.length - 1]; 

    //No need to perform the same test we do for the Fully Qualified 
    return script.getAttribute('src', 2); //this works in all browser even in FF/Chrome/Safari 
}()); 

Fully Qualified (z.B.http://www.example.com/js/main.js):

Nach einigen Tests scheint es schwierig zu sein, die voll qualifizierte in einem Browser-Browser zu erhalten. Die solution suggested by Crescent Freshfunktioniert nicht in IE8 den vollständig qualifizierten zu bekommen, auch wenn es in IE7 funktioniert

4

Diese Methode funktioniert mit defer, async und verzögertes Laden Da Sie den Dateinamen des Skripts wissen, und wenn es sein wird,

einzigartige
/* see 
* http://stackoverflow.com/questions/984510/what-is-my-script-src-url/984656#984656 
* http://www.glennjones.net/Post/809/getAttributehrefbug.htm 
* 
* iterate all script to find script with right filename 
* this work with async and defer (but your script MUST have a unique filemane) 
* mozilla support document.currentScript and we use it, if is set 
* 
* this will not work with local script loaded by jQuery.getScript(), 
* since there is no script tag added into the dom. the script is only evaluated in global space. 
* http://api.jquery.com/jQuery.getScript/ 
* 
* to fix this odd, you can add a reference in meta (meta[name=srcipt][content=url]) 
* when you load the script 
*/ 
var scriptFilename = 'jquery.plugins.template.js'; // don't forget to set the filename 
var scriptUrl = (function() { 
    if (document.currentScript) { // support defer & async (mozilla only) 
     return document.currentScript.src; 
    } else { 
     var ls,s; 
     var getSrc = function (ls, attr) { 
      var i, l = ls.length, nf, s; 
      for (i = 0; i < l; i++) { 
       s = null; 
       if (ls[i].getAttribute.length !== undefined) { 
        s = ls[i].getAttribute(attr, 2);      
       }    
       if (!s) continue; // tag with no src 
       nf = s; 
       nf = nf.split('?')[0].split('/').pop(); // get script filename 
       if (nf === scriptFilename) { 
        return s; 
       } 
      } 
     };   
     ls = document.getElementsByTagName('script'); 
     s = getSrc(ls, 'src'); 
     if (!s) { // search reference of script loaded by jQuery.getScript() in meta[name=srcipt][content=url] 
      ls = document.getElementsByTagName('meta');    
      s = getSrc(ls, 'content'); 
     }   
     if (s) return s; 
    } 
    return ''; 
})(); 

var scriptPath = scriptUrl.substring(0, scriptUrl.lastIndexOf('/'))+"/"; 

ein jQuery-Plugin-Vorlage mit ihm: https://github.com/mkdgs/mkdgs-snippet/blob/master/javascript/jquery.plugins.template.js

Anmerkung: dies wird nicht mit lokalen Skript von jQuery.getScript geladen arbeiten(), da es kein Skript-Tag in das dom aufgenommen ist. Das Skript wird nur im globalen Bereich ausgewertet. http://api.jquery.com/jQuery.getScript/

es zu beheben Sie so etwas wie tun:

function loadScript(url,callback) {  

    if ($('[src="'+url+'"]').length) return true; // is already loaded  

    // make a reference of the loaded script 
    if ($('meta[content="'+url+'"]', $("head")).length) return true; // is already loaded 
    var meta = document.createElement('meta'); 
    meta.content = url; 
    meta.name = 'script'; 
    $("head").append(meta); 

    return $.ajax({ 
      cache: true, 
      url: u, 
      dataType: 'script', 
      async: false, 
      success : function (script) {      
       try { 
        if (typeof callback == 'function') callback();  
       } catch (error) { 
        //console.log(error); 
       } 
      } 
    }); 
} 
+0

Interessante Verwendung von 'document.currentScript' hier. Leider sind die Informationen zur Browserunterstützung auf http://caniuse.com nicht verfügbar. Sie können helfen, indem Sie das geöffnete Problem aufheben: http://github.com/Fyrd/caniuse/issues/1099. – Stephan

+0

Ich habe dafür gestimmt, aber caniuse.com ist nicht die einzige Informationsquelle. https://developer.mozilla.org/en-US/docs/Web/API/Document/currentScript – Mkdgs

29

Für neue Browser können Sie document.currentScript verwenden diese Informationen zu erhalten.

var mySource = document.currentScript.src; 

Der Vorteil ist, dass es für Skripte, die asynchron geladen werden, zuverlässiger ist. Der Nachteil ist, dass es nicht, wie ich am besten weiß, universell unterstützt wird. Es sollte auf Chrome> = 29, FireFox> = 4, Opera> = 16 funktionieren. Wie viele nützliche Dinge scheint es in IE nicht zu funktionieren.

Wenn ich einen Skriptpfad abrufen muss, überprüfe ich, ob document.currentScript definiert ist, und wenn nicht, verwende die in der akzeptierten Antwort beschriebene Methode.

if (document.currentScript) { 
    mySource = document.currentScript.src; 
} else { 
    // code omitted for brevity 
} 

https://developer.mozilla.org/en-US/docs/Web/API/document.currentScript

+0

http://caniuse.com überwacht diese Funktion noch nicht. Sie können hier mit einer Verbesserung helfen: http://github.com/Fyrd/caniuse/issues/1099. – Stephan

Verwandte Themen