J'essaie de faire quelque chose comme un C #include "filename.c"
, Ou PHP include(dirname(__FILE__)."filename.php")
mais en javascript. Je sais que je peux le faire si je peux obtenir le URL à partir de laquelle un fichier js a été chargé (par exemple, l'URL indiquée dans l'attribut src de la balise). Existe-t-il un moyen pour le javascript de le savoir?
Sinon, existe-t-il un bon moyen de charger javascript dynamiquement à partir du même domaine (sans connaître spécifiquement le domaine)? Par exemple, disons que nous avons deux serveurs identiques (QA et production) mais qu'ils ont clairement des domaines URL différents. Existe-t-il un moyen de faire quelque chose comme include("myLib.js");
où myLib.js se chargera à partir du domaine du fichier qui le charge?
Désolé si c'est libellé un peu confus.
Dans le script:
var scripts = document.getElementsByTagName("script"),
src = scripts[scripts.length-1].src;
Cela fonctionne car le navigateur charge et exécute les scripts dans l'ordre, donc pendant que votre script s'exécute, le document dans lequel il était inclus est sûr d'avoir votre élément de script comme dernier sur la page. Ce code doit bien sûr être "global" pour le script, donc enregistrez src
quelque part où vous pourrez l'utiliser plus tard. Évitez les fuites de variables globales en les enveloppant dans:
(function() { ... })();
Tous les navigateurs à l'exception d'Internet Explorer (toute version) ont document.currentScript
, qui fonctionne toujours toujours (peu importe la façon dont le fichier a été inclus (async, bookmarklet, etc.)).
Si vous souhaitez connaître l'URL complète du fichier JS dans lequel vous vous trouvez actuellement:
var script = document.currentScript;
var fullUrl = script.src;
Tadaa.
La réponse acceptée ici ne fonctionne pas si vous avez des scripts en ligne dans votre document. Pour éviter cela, vous pouvez utiliser ce qui suit pour cibler uniquement <script>
balises avec un [src]
attribut.
/**
* Current Script Path
*
* Get the dir path to the currently executing script file
* which is always the last one in the scripts array with
* an [src] attr
*/
var currentScriptPath = function () {
var scripts = document.querySelectorAll( 'script[src]' );
var currentScript = scripts[ scripts.length - 1 ].src;
var currentScriptChunks = currentScript.split( '/' );
var currentScriptFile = currentScriptChunks[ currentScriptChunks.length - 1 ];
return currentScript.replace( currentScriptFile, '' );
}
Cela capture efficacement le dernier fichier .js externe, résolvant certains problèmes rencontrés avec les modèles JS en ligne.
Je viens de faire ce petit truc:
window.getRunningScript = () => {
return () => {
let err = new Error()
let link = err.stack.split('(')
link = link[1]
link = link.split(')')[0]
link = link.split(':')
link.splice(-2, 2)
link = link.join(':')
return link
}
}
console.log('%c Currently running script:', 'color: blue', getRunningScript()())
Travailler sur: Chrome, Firefox, Edge
profitez-en!
En me fondant sur les réponses trouvées ici, j'ai trouvé ce qui suit:
getCurrentScript.js
var getCurrentScript = function () {
if (document.currentScript) {
return document.currentScript.src;
} else {
var scripts = document.getElementsByTagName('script');
return scripts[scripts.length-1].src;
}
};
module.exports = getCurrentScript;
getCurrentScriptPath.js
var getCurrentScript = require('./getCurrentScript');
var getCurrentScriptPath = function () {
var script = getCurrentScript();
var path = script.substring(0, script.lastIndexOf('/'));
return path;
};
module.exports = getCurrentScriptPath;
BTW: J'utilise CommonJS le format du module et le bundle avec webpack .
Plus récemment, j'ai trouvé une approche beaucoup plus propre, qui peut être exécutée à tout moment, plutôt que d'être forcée de le faire de manière synchrone lors du chargement du script.
Utilisez stackinfo pour obtenir une trace de pile à un emplacement actuel, et récupérez le info.file
nom en haut de la pile.
info = stackinfo()
console.log('This is the url of the script '+info[0].file)
J'ai codé une fonction simple qui permet d'obtenir l'emplacement absolu du fichier javascript actuel, en utilisant une méthode try/catch.
Vous pouvez le voir ici .
Je comprends peut-être mal votre question, mais il semble que vous devriez simplement pouvoir utiliser un chemin relatif tant que les serveurs de production et de développement utilisent la même structure de chemin.
<script language = "javascript" src = "js/myLib.js" />
Que ce soit un script, un fichier html (pour un cadre, par exemple), un fichier css, une image, peu importe, si vous dont spécifiez un serveur/domaine, le chemin du document html sera le par défaut, vous pouvez donc faire, par exemple,
<script type=text/javascript src='/dir/jsfile.js'></script>
ou
<script type=text/javascript src='../../scripts/jsfile.js'></script>
Si vous ne fournissez pas le serveur/domaine, le chemin sera relatif au chemin de la page ou au script du chemin du document principal