web-dev-qa-db-ja.com

現在実行中のJavaScriptコードのファイルパスを取得する方法

私はC _#include "filename.c"_、またはPHP include(dirname(__FILE__)."filename.php"))のようなことをしようとしていますが、javascriptで。URLを取得できればこれを行うことができますjsファイルがロードされた(たとえば、タグのsrc属性で指定されたURL)javascriptがそれを知る方法はありますか?

または、同じドメインから動的にjavascriptをロードする良い方法はありますか(ドメインを特に知らなくても)?たとえば、2つの同一のサーバー(QAと本番)がありますが、明らかに異なるURLドメインがあるとします。 myLib.jsがそれをロードするファイルのドメインからロードするinclude("myLib.js");のような何かをする方法はありますか?

それが少しわかりにくい言葉で言ったらごめんなさい。

57
B T

スクリプト内:

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

これは、ブラウザがスクリプトを順番にロードして実行するために機能します。そのため、スクリプトの実行中、スクリプトが含まれていたドキュメントには、ページの最後のスクリプト要素が必ず含まれます。もちろん、このコードはスクリプトに対して「グローバル」でなければならないので、srcを後で使用できる場所に保存してください。グローバル変数を次のようにラップすることで漏らさないようにします。

(function() { ... })();
78
InfinitiesLoop

Internet Explorer(すべてのバージョン)を除くすべてのブラウザーには、 document.currentScript 、これは常に機能します(ファイルがどのようにインクルードされたとしても(非同期、ブックマークレットなど))。

あなたが今いるJSファイルの完全なURLを知りたい場合:

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

タダー。

43
Rudie

文書にインラインスクリプトがある場合、ここで承認された回答は機能しません。これを回避するには、以下を使用して、<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テンプレートで発生したいくつかの問題が解決されます。

16
Kevin Leary

私はこの小さなトリックを作りました:

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

お楽しみください!

ここで見つかった答えを洗練して、次のことを思いつきました。

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 とのバンドルを使用しています。

5
Stoutie

私は最近、スクリプトのロード時に同期的に強制されるのではなく、いつでも実行できる、これに対するはるかにクリーンなアプローチを発見しました。

stackinfo を使用して、現在の場所でスタックトレースを取得し、info.fileスタックの一番上の名前。

info = stackinfo()
console.log('This is the url of the script '+info[0].file)
4
B T

Try/catchメソッドを使用して、現在のJavaScriptファイルの絶対位置を取得できる単純な関数をコーディングしました。

それを見ることができます ここ

2
Afonso Matos

私はあなたの質問を誤解しているかもしれませんが、実動サーバーと開発サーバーが同じパス構造を使用している限り、相対パスを使用できるはずです。

 <script language = "javascript" src = "js/myLib.js" />
1
johnmdonahue

スクリプト、htmlファイル(フレームなど)、cssファイル、イメージなど、どのようなものであっても、dontサーバー/ドメインを指定すると、htmlドキュメントのパスはデフォルトなので、たとえば、

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

または

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

サーバー/ドメインを指定しない場合、パスはページのパスまたはメインドキュメントのパスのスクリプトのいずれかに相対します。

0
Graza