質問

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 は、それをロードするファイルのドメインからどこにロードされますか?

少し紛らわしい表現になってしまったら申し訳ありません。

役に立ちましたか?

解決

スクリプト内ます:

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

これは、ブラウザの負荷ので動作し、それが含まれた文書はページの最後の一人として、あなたのscript要素を持っていると確信して、あなたのスクリプトが実行されている間ので、順番にスクリプトを実行します。もちろん、このコードは、スクリプトに「グローバル」ことなので、あなたが後でそれを使用することができ、どこかsrcを保存する必要があります。で、それをラップすることにより、グローバル変数が漏れ避けます:

(function() { ... })();

他のヒント

あなたは、ドキュメント内のインラインスクリプトを持っている場合は、

ここでの受け入れ答えは動作しません。これを避けるために、あなたは<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ファイルをキャプチャします。

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

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モジュール形式とバンドル ウェブパック.

私は最近になって、むしろ同期したときにスクリプトをロード、それを行うことを余儀なくされているよりも、いつでも実行することができ、これまでよりクリーンなアプローチを発見しました。

現在の場所でスタックトレースを取得し、の上からinfo.file名をつかむために stackinfo に使用しますスタックます。

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

私は、try /キャッチメソッドを使用して、現在のJavaScriptファイルの絶対位置を取得することができるシンプルな機能をコード化しました。

あなたはここのそれを見ることができます。

私はあなたの質問を誤解することができるが、あなただけのように長く、生産と開発のサーバーが同じパス構造を使用すると、相対パスを使用することができる必要がありそうです。

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

にかかわらず(例えばフレームのため、)そのスクリプト、HTMLファイル、CSSファイル、画像は、何でも、あなたはを場合はいけないは、HTMLドキュメントのパスサーバー/ドメインを指定するかどうかあなたができるので、デフォルトになります、例えば、

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

または

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

は、サーバー/ドメインを提供していない場合は、パスがメイン文書のパスのページのパスやスクリプトのいずれかからの相対になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top