Подтвердить что ты не робот

Как получить путь к файлу исполняемого 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 будет загружаться из домена файла, загружающего его?

Извините, если это немного озадачено.

4b9b3361

Ответ 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 основного пути к документу