Frage

Gibt es eine einfache und zuverlässige Art und Weise die URL der aktuell ausführende JavaScript-Datei (innerhalb einer Web-Seite)?

, um zu bestimmen

Mein einziger Gedanke auf diesen ist das DOM für die ganze Skript zu scannen src wie wurde die aktuelle Datei referenziert finden Attribute und dann die absolute URL herauszufinden, indem es auf document.location. Jeder andere Ideen haben, gibt es einige super-einfache Methode, die ich völlig übersehen?

UPDATE: Script-Elemente über das DOM zugegriffen haben bereits eine src Eigenschaft, die die vollständige URL enthält. Ich weiß nicht, wie allgegenwärtig / Standard, der ist, aber alternativ können Sie getAttribute("src") verwenden, das, was roh Attributwert in der [X] HTML zurück.

War es hilfreich?

Lösung

Setzen Sie dieses in der js-Datei, die eine eigene URL wissen 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 verwendet (es ist ein IE-Bug).

Andere Tipps

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 zuverlässiger ist, die asynchron geladen werden. Der Nachteil ist, dass es nicht ist, so gut ich weiß, allgemein unterstützt. Es sollte auf Chrome arbeiten> = 29, FireFox> = 4, Opera> = 16. Wie viele nützliche Dinge, es nicht in IE zu funktionieren scheint.

Wenn ich ein Skript Pfad erhalten müssen, ich überprüfen, um zu sehen, ob document.currentScript definiert ist, und, wenn nicht, die Methode in der akzeptierte Antwort beschrieben verwenden.

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

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

Wie es in Quelle erscheint (z.B. /js/main.js), ist dies Cross-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 http://www.example.com/js/main.js):

Nach einigen Tests scheint es schwer, die zu bekommen vollständig qualifiziert ein in einem Cross-Browser-Weg. Die Lösung von Crescent Frisch vorgeschlagen funktioniert nicht in IE8 den vollständig qualifizierten zu bekommen, auch wenn es funktioniert in IE7

Diese Methode der Arbeit mit defer, async und verzögertes Laden Da kennen Sie die Dateinamen des Skripts, und wenn es wird eindeutig sein

/* 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('/'))+"/";

eine jQuery-Plugin-Vorlage mit ihm: https://github.com/mkdgs/mkdgs -snippet / Blob / Master / javascript / jquery.plugins.template.js

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

es beheben Sie können so etwas 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);
                }
          }
     });
}

Wenn dies eine streng Client-Lösung, bei Sie klingen ziemlich gut.

Wenn Sie Code auf dem Server schreiben, könnten Sie wahrscheinlich füllen nur ein div / verstecktes Feld / (fügen Sie Ihr fave HTML-Element hier) mit der vollständig gelöst URL an das Skript, und dass auf der Clientseite mit Ihrem Javascript abholen .

//addons.mozilla:

Sie können einen Blick auf https haben wollen .org / en-US / firefox / addon / 10345 , wenn Sie beim Lernen interessiert sind, welche Funktionen (und damit die Datei) auf einer Seite ausführen Sie kontrollieren nicht.

Wenn Sie Interesse, herauszufinden, welche von Ihre Skripte ausgeführt wird, dann gibt es eine Reihe von Möglichkeiten. Mit Firebug können Sie die Informationen console.log(). Auch nur darum, wachsam Anweisungen in Ihrem Code (während ärgerlich) debug in einer Low-Tech-Art und Weise helfen kann. Sie könnten auch Fehler erhöhen und sie fangen, dann Prozesseigenschaften des Fehlers (siehe: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error )

Doch warum sollte dies wichtig sein? Wenn die Skriptfehler verursachen bereits dann ist es einfach genug, um zu bestimmen, wo der Fehler auftritt. Wenn es sich nicht um Fehler überhaupt ist, was ist dann der Vorteil ist, zu wissen, die Datei es herkommt?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top