Как получить путь к файлу исполняемого javascript кода
Я пытаюсь сделать что-то вроде C #include "filename.c"
или PHP include(dirname(__FILE__)."filename.php")
, но в javascript. Я знаю, что могу сделать это, если я могу получить URL-адрес, загруженный из js файла (например, URL-адрес, указанный в атрибуте src тега). Есть ли способ для javascript знать это?
В качестве альтернативы, есть ли хороший способ загрузки javascript из динамического домена из одного домена (не зная конкретно домен)? Например, скажем, у нас есть два идентичных сервера (QA и production), но они явно имеют разные URL-адреса. Есть ли способ сделать что-то вроде include("myLib.js");
, где myLib.js будет загружаться из домена файла, загружающего его?
Извините, если это немного озадачено.
Ответы
Ответ 1
Внутри script:
var scripts = document.getElementsByTagName("script"),
src = scripts[scripts.length-1].src;
Это работает, потому что браузер загружает и выполняет сценарии по порядку, поэтому, пока ваш script выполняет, документ, в который он был включен, обязательно будет содержать ваш элемент script как последний на странице. Этот код, конечно, должен быть "глобальным" для script, поэтому сохраните 'src' где-нибудь, где вы можете использовать его позже. Избегайте утечки глобальных переменных путем их переноса в:
(function() { ... })();
Ответ 2
Все браузеры, кроме Internet Explorer (любая версия), имеют document.currentScript
, который всегда работает всегда (независимо от того, как файл был включен ( async, букмарклет и т.д.)).
Если вы хотите узнать полный URL-адрес JS файла, который вы сейчас находитесь:
var script = document.currentScript;
var fullUrl = script.src;
Tadaa.
Ответ 3
Принятый ответ здесь не работает, если у вас есть встроенные скрипты в вашем документе. Чтобы этого избежать, вы можете использовать следующее, чтобы использовать только теги <script>
с атрибутом [src]
.
/**
* 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, '' );
}
Это эффективно захватывает последний внешний .js файл, решая некоторые проблемы, с которыми я столкнулся с встроенными шаблонами JS.
Ответ 4
Недавно я нашел намного более чистый подход к этому, который может быть выполнен в любой момент, а не вынужден делать это синхронно, когда загружается script.
Используйте stackinfo для получения stacktrace в текущем местоположении и захватите имя info.file
в верхней части стека.
info = stackinfo()
console.log('This is the url of the script '+info[0].file)
Ответ 5
Уточнение ответов, найденных здесь, я придумал следующее:
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;
Кстати: я использую CommonJS
модуля и связывание с webpack.
Ответ 6
Я закодировал простую функцию, которая позволяет получить абсолютное местоположение текущего файла javascript с помощью метода try/catch.
Вы можете увидеть здесь.
Ответ 7
Я просто сделал этот маленький трюк:
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()())
![screenshot]()
Работа над: Chrome, Firefox, Edge
наслаждайтесь!
Ответ 8
Возможно, я не понимаю ваш вопрос, но кажется, что вы должны просто использовать относительный путь, если серверы производства и разработки используют одну и ту же структуру пути.
<script language="javascript" src="js/myLib.js" />
Ответ 9
Независимо от того, является ли его a script, html файлом (например, для фрейма), css файлом, изображением, любым, если вы не укажете сервер/домен, путь к html-документу будет по умолчанию, поэтому вы можете сделать, например,
<script type=text/javascript src='/dir/jsfile.js'></script>
или
<script type=text/javascript src='../../scripts/jsfile.js'></script>
Если вы не предоставляете сервер/домен, путь будет относиться либо к пути страницы, либо к script основного пути к документу