Jak uzyskać ścieżkę do pliku aktualnie wykonującego kod javascript

Próbuję zrobić coś w rodzaju C #include "filename.c", lub PHP include(dirname(__FILE__)."filename.php"), ale w javascript. Wiem, że mogę to zrobić, jeśli Mogę uzyskać adres URL, z którego plik js został załadowany (np. adres URL podany w atrybucie src tagu). Czy jest jakiś sposób, aby javascript to wiedział?

Alternatywnie, czy jest jakiś dobry sposób na dynamiczne ładowanie javascript z tej samej domeny (bez znajomości konkretnej domeny)? Na przykład powiedzmy, że mamy dwa identyczne serwery (QA i produkcja), ale wyraźnie mają różne domeny URL. Czy jest sposób na coś takiego jak include("myLib.js"); gdzie myLib.js załaduje się z domeny ładującego go pliku?

Przepraszam, jeśli to brzmi trochę myląco.
Author: Bart Verkoeijen, 2010-02-13

9 answers

Wewnątrz skryptu:

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

Działa to, ponieważ przeglądarka ładuje i wykonuje skrypty w kolejności, więc podczas wykonywania skryptu dokument, w którym został zawarty, na pewno będzie miał element skryptu jako ostatni na stronie. Ten kod oczywiście musi być 'globalny' do skryptu, więc zapisz 'src' gdzieś, gdzie możesz go użyć później. Unikaj wycieków zmiennych globalnych, owijając je w:

(function() { ... })();
 71
Author: InfinitiesLoop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-06 21:07:43

Wszystkie przeglądarki oprócz Internet Explorera (dowolna wersja) mają document.currentScript, który zawsze działa zawsze (bez względu na to, jak plik został dołączony (async, bookmarklet itp.)).

Jeśli chcesz znać pełny adres URL pliku JS, w którym jesteś teraz:

var script = document.currentScript;
var fullUrl = script.src;
Tadaa.
 26
Author: Rudie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-22 16:36:52

Przyjęta tutaj odpowiedź nie działa, jeśli masz Skrypty wbudowane w dokumencie. Aby tego uniknąć, możesz użyć poniższej opcji, aby kierować tylko znaczniki <script> z atrybutem [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, '' );
}

To skutecznie przechwytuje Ostatnie zewnętrzne .plik js, rozwiązując niektóre problemy, które napotkałem z wbudowanymi szablonami JS.

 15
Author: Kevin Leary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-24 17:40:23

Ostatnio znalazłem dużo czystsze podejście do tego, które może być wykonane w dowolnym momencie, a nie być zmuszony do zrobienia tego synchronicznie, gdy skrypt ładuje.

Użyj stackinfo , aby uzyskać stacktrace w bieżącej lokalizacji i chwyć nazwę info.file z góry stosu.

info = stackinfo()
console.log('This is the url of the script '+info[0].file)
 3
Author: B T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-05 00:28:42

Udoskonalając odpowiedzi znalezione tutaj, wymyśliłem co następuje:

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: używam CommonJS formatowanie modułów i łączenie z webpack.

 3
Author: Stoutie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-09 01:25:13

Właśnie zrobiłem tą małą sztuczkę:

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()())

zrzut ekranu

praca na: Chrome, Firefox, Edge

Smacznego !

 3
Author: Alexandre Daubricourt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-04 10:23:51

Zakodowałem prostą funkcję, która pozwala uzyskać absolutną lokalizację bieżącego pliku javascript, za pomocą metody try / catch.

Możesz go zobaczyć TUTAJ .

 2
Author: Afonso Matos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-09 13:25:38

Może źle zrozumiałem twoje pytanie, ale wydaje się, że powinieneś być w stanie używać ścieżki względnej, o ile serwery produkcyjne i programistyczne używają tej samej struktury ścieżki.

<script language="javascript" src="js/myLib.js" />
 1
Author: johnmdonahue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-12 23:12:41

Niezależnie od tego, czy jest to skrypt, plik html( na przykład ramka), plik css, obraz, cokolwiek, jeśli NIE podaj serwer / domenę ścieżka dokumentu html będzie domyślna, więc możesz zrobić na przykład

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

Lub

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

Jeśli nie podasz serwera/domeny, ścieżka będzie względem ścieżki strony lub skryptu ścieżki głównego dokumentu

 0
Author: Graza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-12 23:06:49