2017-07-05 3 views
0

JavaScriptファイルを動的にロードしようとしていますが、ロードされたらファイル内の関数を実行します。私のメインのHTMLでは、私は基本的に持っている:私は、インターネット上で見つけることができるものから、動的に追加されたスクリプトが解析/ロード/実行されたことを知る方法?

function load_javascript(js_file) 
{ 
    function load_js_callback(example) 
    { 
     console.log("function " + function_in_js_file + " is " + typeof(function_name)); 
     if (typeof(function_in_js_file) == "undefined") 
     { 
      window.setTimeout(load_js_callback(example), 500); 
      return false; 
     } 
     function_in_js_file(example); 
    } 

    var jstag = document.createElement("script"); 
    document.head.appendChild(jstag); 

    // Browsers: 
    jstag.onload=load_js_callback("example"); 
    // Internet Explorer: 
    jstag.onreadystatechange = function() { 
     if (this.readyState == 'complete') { 
      load_js_callback("example"); 
     } 
    } 
    jstag.setAttribute('src',js_file); 
} 

load_javascript("/js/example.js"); 

https://stackoverflow.com/a/3248500https://stackoverflow.com/a/16231055)これは動作するはずですが、jstag.onload実行function_in_js_fileが定義されているので、私がチェックするwindow.setTimeoutを必要とされる前に、関数が定義されるまで再度呼び出します。

理想的には、私はそのタイムアウトを取り除きたいと思います。ファイルのロード/解析/実行が完了したことを知る方法はありますか(私には正しい用語がわからない)、関数が動的ファイルを変更することなく理想的に定義されていますか?私はまたdocument.head.appendChild(jstag);jstag.setAttributeの後に入れてみましたが、同じ結果が出ました。

+0

あなたのためのスクリプトが必要なフレームワークを使用していない場合は、コードが実行されたことを確認するjsメソッドがありません。ちょっとしたカスタムソリューションをしようとすると、ファイルの末尾にvarが付いてしまいました(たとえば、ファイルと同じ名前、または接頭辞/接尾辞が付いています)。私は次に、すべてが実行されていることを保証するために、このvarの存在をテストします – Kaddath

+0

varが存在しない場合、基本的にタイムアウトが必要ですか? – Jonathan

+0

はい、またはsetIntervalではなく私はbrowserifyがどのようにインポートを処理するのかを見なければならないし、もしこのようなチェックがあるなら、私は問題に興味がある、私は何かを見つけたら更新するだろう – Kaddath

答えて

1

理由を使用することを検討して、これは

function loadScript(sScriptSrc, oCallback) { 
    var oHead = document.getElementsByTagName('head')[0]; 
    var oScript = document.createElement('script'); 
    oScript.type = 'text/javascript'; 
    oScript.src = sScriptSrc; 
    // most browsers 
    oScript.onload = oCallback; 
    // IE 6 & 7 
    oScript.onreadystatechange = function() { 
     if (this.readyState == 'complete') { 
      oCallback(); 
     } 
    } 
    oHead.appendChild(oScript); 
} 

、その後は、コールバックを経由してその中にあなたのスクリプトファイルと関数を呼び出すと呼ばれる関数を定義してみてくださいスクリプトがロードされる前に実行されているため、

var jstag = document.createElement("script"); 
document.head.appendChild(jstag); 

// Browsers: 
jstag.onload=load_js_callback("example"); 

load_js_callbackの戻り値をjstag.onloadに割り当てています。 onloadハンドラ関数を望んでいる:

var jstag = document.createElement("script"); 
document.head.appendChild(jstag); 

// Browsers: 
jstag.onload=function() { load_js_callback("example"); }; 

他のコメントで指摘したように、このすべてが保証すると、ブラウザがスクリプトをダウンロードしたということです。

+0

これは間違いなく答えと思われます。戻り値を割り当てることについて指摘してくれてありがとう!しかし、+ Kaddathは、特に大きなファイルの場合にコードが実行されるのを待つかどうか、あるいは言及したようにダウンロードされるとすぐに実行されるかどうかという疑問を提起します。私はこれについての文書をまだ見つけていない。 – Jonathan

+0

これを答えとしてマークします。うまくいけば、誰かが私たちが探している答えを考え出すだろう - ブラウザはonloadを呼び出す前に追加されたスクリプトの実行を待つが、今はこれが問題を解決するようだ。ありがとうございました! :) – Jonathan

0

loadScript("/js/example.js", function() { 
       //call function 
function_in_js_file(example); 
      }); 
+0

あなたはこのメソッドで、ロードされるが、それが実行されたことを確認することはできません – Kaddath

+0

+ Kaddath、ありがとう!それは私が考えていたものでした。だから、私が探している言葉が実行されますか? – Jonathan

+0

あなたは解決策を試しましたか?この時点でファイルを読み込んでインクルードするので、そのファイルをインクルード/ロード/実行した後で実行されます。 –

0

DOMContentLoaded jsのイベントに

document.addEventListener('DOMContentLoader', function() { 
    load_javascript("/js/example.js"); // Or what else you want to do 
    // HERE I'm confident that my webpage is loaded and my js files too. 
}) 
+0

この度はありがとうございました!残念ながら、私はスクリプトを動的に追加することについて話していたので、これは質問に答えません。 – Jonathan

関連する問題