Как получить путь к файлу исполняемого в данный момент кода JavaScript - PullRequest
55 голосов
/ 13 февраля 2010

Я пытаюсь сделать что-то вроде C #include "filename.c" или PHP include(dirname(__FILE__)."filename.php"), но в JavaScript. Я знаю, что могу сделать это, если смогу получить URL-адрес, с которого был загружен файл js (например, URL-адрес, указанный в атрибуте src тега). Есть ли способ узнать это в javascript?

В качестве альтернативы, есть ли какой-нибудь хороший способ динамически загружать javascript из того же домена (без особого знания домена)? Например, допустим, у нас есть два одинаковых сервера (QA и производственный), но они явно имеют разные домены URL. Есть ли способ сделать что-то вроде include("myLib.js");, где myLib.js будет загружать из домена загружающий его файл?

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

Ответы [ 9 ]

78 голосов
/ 13 февраля 2010

Внутри скрипта:

var scripts = document.getElementsByTagName("script"),
    src = scripts[scripts.length-1].src;

Это работает, потому что браузер загружает и выполняет сценарии по порядку, поэтому, пока ваш сценарий выполняется, документ, в который он был включен, обязательно будет иметь ваш элемент script как последний на странице. Этот код, конечно, должен быть «глобальным» для скрипта, поэтому сохраните src где-нибудь, где вы сможете использовать его позже. Избегайте утечки глобальных переменных, заключив их в:

(function() { ... })();
41 голосов
/ 25 октября 2013

Все браузеры, кроме Internet Explorer (любой версии), имеют document.currentScript, который всегда работает всегда (независимо от того, как был включен файл (асинхронный, букмарклет и т. Д.)).

Если вы хотите узнать полный URL-адрес файла JS, в котором вы сейчас находитесь:

var script = document.currentScript;
var fullUrl = script.src;

Tadaa.

16 голосов
/ 24 сентября 2014

Принятый ответ здесь не работает, если в вашем документе есть встроенные сценарии. Чтобы избежать этого, вы можете использовать следующее только для целевых тегов <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.

7 голосов
/ 04 марта 2017

Я только что сделал этот маленький трюк:

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

наслаждайтесь!

5 голосов
/ 09 декабря 2014

Уточняя ответы, найденные здесь, я придумал следующее:

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 .

4 голосов
/ 05 мая 2014

Совсем недавно я нашел гораздо более понятный подход к этому, который можно выполнить в любое время, вместо того, чтобы заставлять делать это синхронно при загрузке скрипта.

Используйте stackinfo , чтобы получить трассировку стека в текущем местоположении, и захватите имя info.file с вершины стека.

info = stackinfo()
console.log('This is the url of the script '+info[0].file)
2 голосов
/ 12 октября 2014

Я написал простую функцию, которая позволяет получить абсолютное местоположение текущего файла JavaScript с помощью метода try / catch.

Вы можете увидеть это здесь .

1 голос
/ 13 февраля 2010

Возможно, я неправильно понимаю ваш вопрос, но, похоже, вы просто сможете использовать относительный путь, если серверы разработки и разработки используют одинаковую структуру пути.

<script language="javascript" src="js/myLib.js" />
0 голосов
/ 13 февраля 2010

Независимо от того, является ли это скриптом, html-файлом (например, для фрейма), css-файлом, изображением, чем угодно, если вы не указываете сервер / домен, путь к html-документу будет по умолчанию, так что вы можете сделать, например,

<script type=text/javascript src='/dir/jsfile.js'></script>

или

<script type=text/javascript src='../../scripts/jsfile.js'></script>

Если вы не предоставите сервер / домен, путь будет указываться относительно пути к странице или сценария пути основного документа

...