現在実行中のJavaScriptコードのファイルパスを取得する方法
-
20-09-2019 - |
質問
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() { ... })();
他のヒント
のInternet Explorer(任意のバージョン)を除くすべてのブラウザでは、 document.currentScript
<を持っています/>、いつもいつも働く(ファイルが含まれていたかに関係なく(非同期、ブックマークレットなど))。
あなたはあなたが今にいるJSファイルの完全なURLを知りたい場合は:
var script = document.currentScript;
var fullUrl = script.src;
Tadaaます。
ここでの受け入れ答えは動作しません。これを避けるために、あなたは<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ファイルをキャプチャします。
私はちょうどこの小さなトリックを作っます:
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()())
の上の仕事:クロム、Firefoxの、エッジの
をお楽しみください!の
ここで見つかった答えを改良して、次のことを思いつきました。
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;
私は最近になって、むしろ同期したときにスクリプトをロード、それを行うことを余儀なくされているよりも、いつでも実行することができ、これまでよりクリーンなアプローチを発見しました。
現在の場所でスタックトレースを取得し、の上から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>
は、サーバー/ドメインを提供していない場合は、パスがメイン文書のパスのページのパスやスクリプトのいずれかからの相対になります。