91 votes

JavaScript - Comment obtenir l'URL du script appelé?

J'inclus myscript.js dans le fichier http://site1.com/index.html comme ceci:

 <script src=http://site2.com/myscript.js></script>
 

Dans "myscript.js", je souhaite accéder à l'URL " http://site2.com/myscript.js ". J'aimerais avoir quelque chose comme ça:

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

alert(getScriptURL());
 

Ce qui alerterait " http://site2.com/myscript.js " s'il était appelé à partir du fichier index.html mentionné ci-dessus.

62voto

lambacck Points 4955

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

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

La variable myScript maintenant l'élément de script dom. Vous pouvez obtenir l'URL src en utilisant myScript.src .

Notez que cela doit être exécuté dans le cadre de l'évaluation initiale du script. Si vous ne voulez pas polluer l'espace de noms Javascript, vous pouvez faire quelque chose comme:

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

58voto

tsds Points 1706

vous pouvez ajouter un attribut id à votre balise de script (même s'il se trouve dans une balise head):

 <script id="myscripttag" src="http://site2.com/myscript.js"></script>
 

et ensuite accéder à son src comme suit:

 document.getElementById("myscripttag").src
 

Bien sûr, la valeur de l'identifiant devrait être la même pour tous les documents contenant votre script, mais je ne pense pas que ce soit un inconvénient majeur pour vous.

24voto

3DRobert Points 51

Avec DOM et un querySelector, vous pouvez utiliser un script spécifique:

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

19voto

QueueHammer Points 2492

J'ai écrit une classe à trouver le chemin des scripts qui fonctionne avec retard de chargement et asynchrone des balises de script.

J'ai eu quelques modèles de fichiers qui ont été par rapport à mes scripts ainsi, au lieu de codage en dur je fait créé la classe pour faire créer automatiquement des chemins. La source est ici, sur github.

Il y a un moment j'ai dû utiliser des arguments.appelé à essayer de faire quelque chose de similaire, mais j'ai lu récemment sur le MDN que c'est pas autorisé en mode strict.

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

15voto

Alex Wheat Points 928

Si vous avez une chance d'utiliser jQuery, le code ressemblerait à ceci:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X