tags:

views:

192

answers:

4

How can a javascript file know where it is located? For example:

<script type="text/javascript" src="http://mysite.com/scripts/howdy.js"&gt;&lt;/script&gt;

How can the code in howdy.js know about http://mysite.com/scripts/howdy.js?

Edit: Clarification. I cannot rely on searching the DOM for my script tag because I need to know about it before the DOM may be ready.

A: 

Try:

document.scripts[document.scripts.length-1]; // add .src to get href
//or
document.getElementsByTagName("script")[document.getElementsByTagName("script").length-1];
//for (maybe) better compatibility

Which gets the last script in the DOM. If your script is being executed while it is being loaded, this will return the right element.

Save it to a variable for use in functions which will be used later.

var thisScript = document.scripts[document.scripts.length-1];
digitalFresh
A: 

Give this script tag an id, and write:

var src = document.getElementById('scriptID').attributes['src'];
Amr ElGarhy
+6  A: 

In the moment in which the current script is being executed, will be the last script element in the DOM, therefore you can get it by:

var scripts = document.getElementsByTagName('script'),
    currentScriptSrc = scripts[scripts.length-1].src;

Check this example that loads this script.

Edit: Taking in consideration the @kangax's comment, about the async and defer attributes, the only safe way IMO, previously knowing the file name, would be to inspect the script elements on the page, examining its src attribute, some libraries like Scriptaculous.us use this technique, for example:

var scripts = document.getElementsByTagName('script'),
    len = scripts.length,
    re = /howdy\.js$/,
    src, howdyScriptSrc;

while (len--) {
  src = scripts[len].src;
  if (src && src.match(re)) {
    howdyScriptSrc = src;
    break;
  }
}
​
CMS
Cool, didn't know you were guaranteed this information. But it seems consistent on every browser I've tried. Thanks!
Josh Johnson
Consider Kangax's comment which led me here: http://twitter.com/kangax/status/22208127507
zachleat
@zachleat: Thanks!, Yes, I completely forgot the defer and async attributes.
CMS
+1  A: 

Try this:

function getScriptSourceName(name){
    var scripts = document.getElementsByTagName('script');
    for (i=0;i<scripts.length;i++){
        if (scripts[i].src.indexOf(name) > -1)
            return scripts[i].src;
    }
}

getScriptSourceName('howdy.js');
NicolasT