1

いくつかの js ライブラリを非同期に取得し$(window).loadて IEで実行する際に深刻な問題が発生しています。

もちろん、すべて他のブラウザでも動作します

問題は、私が次のようなことをしていることです

 <script type="text/javascript">
 var scr1 = document.createElement('script'); 
 scr1.type = 'text/javascript'; 
 scr1.src = 'some_lib.js'; 
 $('BODY').prepend(scr1); 
</script>

その直前に、その上の html のメソッド</body>を使用$(window).loadして のいくつかのプラグインを操作しますがsome_lib.js、IE ではすべてが高速になります。

メソッドを変更する可能性はある$(window).loadので、すべてのブラウザで同じ方法で使用できますか?

4

2 に答える 2

1

呼び出しに含まれるすべてのコードは、関数 (この例ではwindow.load()呼び出されます) に配置する必要があります。onLoad

動的にロードするスクリプトがあるたびに、カウンターをインクリメントします。また、そのカウンターを減少させるものを含めます...

src1.onload = function() { counter--; onLoad(); }

次に、「onLoad」に最初の行があります...

if (counter > 0) return;

つまり、スクリプトがロードされるonLoadたびwindow.loadに実行されますが、スクリプトがすべてロードされたときにのみ実行されます。

面倒ですが、問題を解決します。

于 2012-09-06T14:55:08.057 に答える
0

これらのライブラリを非同期でロードする必要がある理由については、実際には説明していません。多くの場合、サードパーティのライブラリには、スクリプトがロードされる前に定義できる「スクリプトのロード時」機能があります。コードを実行する前に複数のライブラリをロードする必要がある場合は、1. ライブラリがロードされるたびにいくつかのコードを起動して、必要なすべてのライブラリがロードされているかどうかをテストしてから、コードを起動する必要があります。すべてのライブラリで、jQuery promise/deferred を作成して、そのライブラリがロードされたときに解決されるようにし、promise関数/コードを使用して、特定のセットがロードされるたびにコードをテストおよび実行するか、または 3. RequireJS を使用するように書き直します$.when(これらのライブラリがあなたのコードである場合、ライブラリに起動コードを追加する必要があるかもしれません。RequireJS を学ぶ良い機会かもしれません。 ).done()

もっとお勧めしたいのですが、RequireJS の背後にある基本を学ぶことは、常に私の todo リストにありましたが、まだ完了していません。私はここでそれをうまく使っている人を知っています。それが難しすぎると思われる場合は、オプション 2 のいくつかの変形を検討します。どの jQuery が使用されるかわからない場合は、オプション 1 または 3 で行き詰まっている可能性があります。

編集:

もちろん、jQuery が唯一の promise ライブラリを持っていると言っているわけではありません.

Archer の手法は興味深いように見えますが、それがどれほど信頼できるかはわかりません (かなり信頼できる可能性があります。証明/ドキュメントを確認したいだけです)。これをオプション 2 と組み合わせることもできます。一部の実行を短縮し、他の処理を非同期で処理したい場合や、それらのスクリプトのオンロード メソッドが実際に期待どおりに機能する場合です。

于 2012-09-06T14:57:33.597 に答える