0

私はいくつかの機能を含むプロジェクトに取り組んでいるので、必要に応じてコードをロードできるように、個別の JavaScript ファイルで各機能を整理しようとしています。ロードと実行のプロセスを標準化したいので、JavaScript ファイルがメモリに存在しない場合はロードして実行するか、既にロードされている場合は単に実行できる関数を開発しようとしています。1 つの方法は、ファイル名とエントリ ポイント関数の名前の 2 つのパラメータを必要とする関数を作成し、スクリプトが既にロードされているかどうか、エントリ ポイント関数を実行するだけの場合、またはそうでない場合は、それを確認することです。スクリプトをロードし、onload イベントでエントリ ポイント関数を実行します。このアプローチは正常に機能しますが、メイン モジュールがすべてのエントリ ポイント関数名を認識している必要があります。不注意なプログラマーがうっかり関数名を複製する可能性があるため、将来的には首の痛みになる可能性があります。よりクリーンで安全なアプローチは、すべてのエントリ ポイント関数に「main」という名前を付け、最初の実行時にその「main」をそのスクリプト DOM オブジェクトに関連付けることです...多かれ少なかれ次のようになります。

ロードされたモジュール:

function(){
   function main(){
      .
      . some code here
      .
   }
   Install(getThisFileName(),main);
}();

メインモジュール:

function Load(fn){
var el,ff,i
   el = document.getElementsByTagName("script");
   ff = "http://"+window.location.host+fn;
   for(i=el.length-1;i>=0;i--){
      if(el[i] && el[i].src==ff){
         el[i].Main();
         return;
      }
    }
    el = document.createElement("script");
    el.type = "text/javascript";
    el.src = ff; 
}

function Install(ff,ep){
var el,i;
   el = document.getElementsByTagName("script");
   for(i=el.length-1;i>=0;i--){
      if(el[i] && el[i].src==ff){
         el[i].Main = ep;
         ep();
         return;
      }
   }
}

しかし、そのためには、実行中の JavaScript ファイルの名前を知る必要がありますが、それが可能かどうかさえわかりません。何か案は?

4

3 に答える 3

1

最も簡単な方法は、最初に含めることです。

var currentFile;
function getThisFileName() {
  return currentFile;
}

そして、上部の各ファイルの先頭で、次のようにします。

currentFile = 'thisFileName.js';

これは、コードが順次実行される場合にのみ機能します。すべてのファイルがロードされると、 currentFile は常に最後のファイルの名前になります。

また、別の方法はcurrentFile、各ファイルの各関数の開始時に設定することです。したがって、その特定の関数にアクセスしている間に、 yourgetThisFileName()を呼び出すと、最後に実行されたファイル、または現在実行されているファイルが通知されます。

残念ながら、これにはコード自体に多少のオーバーヘッドがあります。

于 2013-08-15T17:46:41.447 に答える
0

以下は、すべてのスクリプトを配列として提供します。

var allScripts = document.getElementsByTagName("script");

現在のファイルは常に最後のファイルになります..allScripts[allScripts.length-1]現在のjavascriptファイルが得られます。srcここから属性にアクセスできます。

編集:これは非同期実装では機能しません。

于 2013-08-15T17:44:36.487 に答える