javascript html - Was ist meine Skript-URL?




funktion aufrufen (6)

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

Mein einziger Gedanke dabei ist, das DOM nach allen src Attributen des Skripts zu src , um herauszufinden, 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: Script-Elemente, auf die über das DOM zugegriffen wird, haben bereits eine Eigenschaft src die die vollständige URL enthält. Ich weiß nicht, wie ubiquitär / Standard das ist, aber alternativ können Sie getAttribute("src") das den Wert des getAttribute("src") Attributs im [X] HTML getAttribute("src") .


Answers

Wenn dies eine reine Client-Lösung ist, hört sich das ziemlich gut an.

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 der Client-Seite auswählen.


Diese Methode funktioniert mit Defer, Async und Lazy Loading Da Sie den Dateinamen Ihres Skripts kennen und es eindeutig sein wird

/* see  
 * http://.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 damit: https://github.com/mkdgs/mkdgs-snippet/blob/master/javascript/jquery.plugins.template.js

Hinweis: Dies funktioniert nicht mit lokalem Skript, das von jQuery.getScript () geladen wurde, da dem dom kein Skript-Tag hinzugefügt wurde. Das Skript wird nur im globalen Bereich ausgewertet. http://api.jquery.com/jQuery.getScript/

um es zu beheben, können Sie etwas tun wie:

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);
                }
          }
     });
}

Vielleicht möchten Sie sich https://addons.mozilla.org/en-US/firefox/addon/10345 ansehen, wenn Sie wissen möchten, welche Funktionen (und damit welche Datei) auf einer Seite ausgeführt werden, die Sie nicht verwenden. t Kontrolle.

Wenn Sie herausfinden möchten, welches Ihrer Skripte ausgeführt wird, gibt es mehrere Möglichkeiten. Mit Firebug könntest du die Informationen in console.log() . 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önnen auch Fehler auslösen und abfangen und dann die Eigenschaften des Fehlers verarbeiten (siehe: https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error ).

Warum sollte das wichtig sein? Wenn das Skript bereits Fehler verursacht, ist es einfach genug festzustellen, wo der Fehler auftritt. Wenn es überhaupt keine Fehler gibt, was ist dann der Vorteil, wenn man weiß, aus welcher Datei es stammt?


Für aktuelle Browser können Sie document.currentScript verwenden, um diese Informationen abzurufen.

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


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

Vollqualifiziert (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)
}());

Eine Erläuterung des verwendeten getAttribute Parameters finden Sie unter http://www.glennjones.net/Post/809/getAttributehrefbug.htm (es handelt sich um einen IE-Fehler).


Der Unterschied zwischen diesen Methoden besteht darin, wie Sie die Parameter übergeben möchten.

"A für Array und C für Komma" ist eine praktische Erinnerung.





javascript dom absolute-path src