JavaScript – Como obtenho o URL do script sendo chamado?

Eu incluo o myscript.js no arquivo http://site1.com/index.html assim:

  

Dentro de “myscript.js”, desejo acessar o URL ” http://site2.com/myscript.js “. Eu gostaria de ter algo assim:

 function getScriptURL() { // something here return s } alert(getScriptURL()); 

O que alertaria ” http://site2.com/myscript.js ” se chamado a partir do index.html mencionado acima.

De http://feather.elektrum.org/book/src.html :

 var scripts = document.getElementsByTagName('script'); var index = scripts.length - 1; var myScript = scripts[index]; 

A variável myScript agora tem o elemento dom do script. Você pode obter o URL src usando myScript.src .

Observe que isso precisa ser executado como parte da avaliação inicial do script. Se você não quiser poluir o namespace Javascript, você pode fazer algo como:

 var getScriptURL = (function() { var scripts = document.getElementsByTagName('script'); var index = scripts.length - 1; var myScript = scripts[index]; return function() { return myScript.src; }; })(); 

Você pode adicionar o atributo id à sua tag de script (mesmo que esteja dentro de uma tag head):

  

e, em seguida, access ao seu src da seguinte forma:

 document.getElementById("myscripttag").src 

É claro que o valor de id deve ser o mesmo para todos os documentos que incluem seu script, mas não acho que seja um grande inconveniente para você.

Com DOM e um querySelector, você pode pegar um script específico:

 var dir = document.querySelector('script[src$="myscript.js"]').getAttribute('src'); var name = dir.split('/').pop(); dir = dir.replace('/'+name,""); 

Eu escrevi uma class para encontrar o caminho dos scripts que funciona com o carregamento atrasado e tags de scripts asynchronouss.

Eu tinha alguns arquivos de modelo que eram relativos aos meus scripts, então, em vez de codificá-los, criei a class para criar os caminhos automaticamente. A fonte completa está aqui no github.

Há algum tempo, usei arguments.callee para tentar fazer algo semelhante, mas li recentemente no MDN que ele não é permitido no modo estrito .

 function ScriptPath() { var scriptPath = ''; try { //Throw an error to generate a stack trace throw new Error(); } catch(e) { //Split the stack trace into each line var stackLines = e.stack.split('\n'); var callerIndex = 0; //Now walk though each line until we find a path reference for(var i in stackLines){ if(!stackLines[i].match(/http[s]?:\/\//)) continue; //We skipped all the lines with out an http so we now have a script reference //This one is the class constructor, the next is the getScriptPath() call //The one after that is the user code requesting the path info (so offset by 2) callerIndex = Number(i) + 2; break; } //Now parse the string for each section we want to return pathParts = stackLines[callerIndex].match(/((http[s]?:\/\/.+\/)([^\/]+\.js)):/); } this.fullPath = function() { return pathParts[1]; }; this.path = function() { return pathParts[2]; }; this.file = function() { return pathParts[3]; }; this.fileNoExt = function() { var parts = this.file().split('.'); parts.length = parts.length != 1 ? parts.length - 1 : 1; return parts.join('.'); }; } 

Se você tiver a chance de usar o jQuery, o código ficaria assim:

 $('script[src$="/myscript.js"]').attr('src'); 

Tudo, exceto o IE, suporta

 document.currentScript 

Solução simples e direta que funciona muito bem:

Se não for IE, você pode usar o document.currentScript
Para o IE você pode fazer o document.querySelector('script[src*=myscript.js]')
assim :

 getScriptURL(){ var script = document.currentScript || document.querySelector('script[src*=myscript.js]') return script.src } 

O código a seguir permite encontrar o elemento de script com nome próprio

 var scripts = document.getElementsByTagName( 'script' ); var len = scripts.length for(var i =0; i < len; i++) { if(scripts[i].src.search(" 0 && scripts[i].src.lastIndexOf("/") >= 0) { absoluteAddr = scripts[i].src.substring(0, scripts[i].src.lastIndexOf("/") + 1); break; } } 

Você não pode usar location.href ou location.host e, em seguida, append o nome do script?