Get the url of currently executing js file when dynamically loaded Get the url of currently executing js file when dynamically loaded ajax ajax

Get the url of currently executing js file when dynamically loaded


When your script gets loaded with jQuery (and I guess other frameworks as well), your script will become indistinguishable from a script that was originally in the HTML document.

jQuery makes a request reaching out for your script and puts back the reply as the text child of a <script> node. Your browser has no way of knowing where it originated from, whether it was modified before inserted, etc. It is just a script node as far as she is concerned.

There can be workarounds, however. In the case of jQuery, you can hook up to the ajax events and exploit the fact that they are called right after your script executes. Basically, this would yield "brilliant.js" in your example:

var handler = function (e, xhr, s) {    alert(s.url);}$(document).ajaxSuccess(handler);

A more elaborate one:

(function ($, undefined) {    /* Let's try to figure out if we are inlined.*/    var scripts = document.getElementsByTagName("script");    if (scripts[scripts.length - 1].src.length === 0) {        // Yes, we are inlined.        // See if we have jQuery loading us with AJAX here.         if ($ !== undefined) {            var initialized = false;            var ajaxHandler = function (e, xhr, s) {                if (!initialized) {                    initialized = true;                    alert("Inlined:" + s.url);                    initmywholejsframework();                }            }            //If it is, our handler will be called right after this file gets loaded.            $(document).ajaxSuccess(ajaxHandler);            //Make sure to remove our handler if we ever yield back.            window.setTimeout(function () {                jQuery(document).unbind("ajaxSuccess", ajaxHandler);                if (!initialized) {                    handleInlinedNonjQuery();                }            }, 0);        }    } else {        //We are included.        alert("Included:" + scripts[scripts.length - 1].src);        initmywholejsframework();    }    //Handle other JS frameworks etc. here, if you will.    function handleInlinedNonjQuery() {        alert("nonJQuery");        initmywholejsframework();    }    //Initialize your lib here    function initmywholejsframework() {        alert("loaded");    }})(jQuery);


B T, sorry if this doesn't help, but I'm curious why you would need to do this? The reason I'm asking is I don't see why you can't just use the relative file paths to load these files? Finding out where you're located could be done with window.location, but why would you? And as for loading them, can't you make an ajax call to the file and then eval them?


This will work in every browser except IE and doesn't depend on assuming what the name of a file is:

var getErrorLocation = function (error) {    var loc, replacer = function (stack, matchedLoc) {        loc = matchedLoc;    };    if ("fileName" in error) {        loc = error.fileName;    } else if ("stacktrace" in error) { // Opera        error.stacktrace.replace(/Line \d+ of .+ script (.*)/gm, replacer);    } else if ("stack" in error) { // WebKit        error.stack.replace(/at (.*)/gm, replacer);        loc = loc.replace(/:\d+:\d+$/, ""); // remove line number    }    return loc;};try {    0();} catch (e) {    var scriptURI = getErrorLocation(e);}alert("THIS IS: " + scriptURI);