77

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

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

少し紛らわしい表現でしたら申し訳ありません。

4

11 に答える 11

88

スクリプト内:

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

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

(function() { ... })();
于 2010-02-12T23:08:35.030 に答える
63

Internet Explorer (任意のバージョン) を除くすべてのブラウザーにはdocument.currentScript、常に機能する があります (ファイルがどのように含まれていても (非同期、ブックマークレットなど))。

現在使用している JS ファイルの完全な URL を知りたい場合:

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

タダー。

于 2013-10-25T12:09:52.703 に答える
18

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

于 2014-09-24T17:40:23.817 に答える
8

ここで見つかった回答を改良すると、次のことがわかりました。

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;
console.log({log: 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にバンドルしています。

于 2014-12-09T01:25:13.577 に答える
4

私は最近、スクリプトがロードされたときに同期的に実行するのではなく、いつでも実行できる、よりクリーンなアプローチを見つけました。

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

info = stackinfo()
console.log('This is the url of the script '+info[0].file)
于 2014-05-05T00:28:42.767 に答える
3

I've coded a simple function which allows to get the absolute location of the current javascript file, by using a try/catch method.

// Get script file location
// doesn't work for older browsers

var getScriptLocation = function() {
    var fileName    = "fileName";
    var stack       = "stack";
    var stackTrace  = "stacktrace";
    var loc     = null;

    var matcher = function(stack, matchedLoc) { return loc = matchedLoc; };

    try { 

        // Invalid code
        0();

    }  catch (ex) {

        if(fileName in ex) { // Firefox
            loc = ex[fileName];
        } else if(stackTrace in ex) { // Opera
            ex[stackTrace].replace(/called from line \d+, column \d+ in (.*):/gm, matcher);
        } else if(stack in ex) { // WebKit, Blink and IE10
            ex[stack].replace(/at.*?\(?(\S+):\d+:\d+\)?$/g, matcher);
        }

        return loc;
    }

};

You can see it here.

于 2014-10-11T21:35:17.960 に答える
3

ここにある答えを絞り込む:

ちょっとしたトリック

getCurrentScript および getCurrentScriptPath

私は次のことを思いつきました:

//Thanks to https://stackoverflow.com/a/27369985/5175935
var getCurrentScript = function() {

  if (document.currentScript && (document.currentScript.src !== ''))
    return document.currentScript.src;
  var scripts = document.getElementsByTagName('script'),
    str = scripts[scripts.length - 1].src;
  if (str !== '')
    return str ;
  //Thanks to https://stackoverflow.com/a/42594856/5175935
  return new Error().stack.match(/(https?:[^:]*)/)[0];

};

//Thanks to https://stackoverflow.com/a/27369985/5175935
var getCurrentScriptPath = function() {
  var script = getCurrentScript(),
    path = script.substring(0, script.lastIndexOf('/'));
  return path;
};

console.log({path: getCurrentScriptPath()})

于 2020-03-01T01:20:55.437 に答える
1

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

<script language="javascript" src="js/myLib.js" />
于 2010-02-12T23:06:28.680 に答える
1

スクリプト、html ファイル (フレームなど)、css ファイル、画像など、サーバー/ドメインを指定しない場合は、 htmlドキュメントのパスがデフォルトになるため、指定できます。例えば、

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

また

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

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

于 2010-02-12T23:06:49.400 に答える