2009-03-03 8 views
2

私はこれを簡素化することができるコードの断片があります:あなたが期待するよう、これが実行される、IE以外のすべてのブラウザで外部のJavaScriptから関数を呼び出すとIEが失敗しますか?

var s='' ; 

s += "<"+"script type=\"text/javascript\" src=\"http://somehost.com/scripts/FooFunctions.js\">\n"; 
s += "<"+"/script>" ; 
s += "<"+"script type=\"text/javascript\">\n"; 
s += "FooFunction(42, 'i love cats');\n"; 
s += "<"+"/script>" ; 

document.write(s) ; 

を - somehost.com/scripts/FooFunctions.js作業から機能を予想通り。

Internet Explorerでは、これは失敗します。

これを検索するのは難しいようです。私は、同じ問題で時折ポストを見つけましたが、解決策はありません。

(外部ファイルではJavaScriptからこの方法を含める必要がある、とpgaeがそれに挿入さ<script src="http://somehost.com/scripts/FooFunctions.js">を持つことができないということを正当な理由があります。)

明確にし、質問は:どのように私は上記のコードの機能をInternet Explorerで同じように機能させることができますか? FireFox?

答えて

2

はこれを試してみてください、それはIE

スクリプトがロードされる前に、IEが FooFunctionを呼び出しているように見えます

function addJsFile(jsFileLocation){ 
    var script=document.createElement('script'); 
    script.type='text/javascript'; 
    script.src=jsFileLocation; 
    document.getElementsByTagName("head")[0].appendChild(script); 
} 
addJsFile("http://code.jquery.com/jquery-latest.pack.js"); 
setTimeout(function(){alert(jQuery);},1000); 
+0

DOM注入によるスクリプトのインクルード(ここで行っていること)がスクリプトのダウンロードを並列化しないため、おそらくうまくいきます。これらは直列にロードされます。したがって、あなたがalert()に到達したときに利用可能であることが保証されています。 –

+0

私は実際にこの方法を試しましたが、問題を解決するようには見えませんでしたが、もう一度試してみます。 – mozboz

0

で動作します。 setTimeout("FooFunction(42, 'i love cats')", 1000);を使用してこれをテストすることができます.1秒でスクリプトが読み込まれるのに十分な時間だとすると、この呼び出しは成功します。

あなたは時にスクリプトをロードコールバックを提供しますスクリプトを、ロードするためにjQueryのようなフレームワークを使用することができない場合は、あなたがFooFunction

+0

IEでは、スクリプトタグにonreadystatechangeハンドラ(AJAXに似ています)を追加して、ロードされたタイミングを知ることができます。 – some

0

としてのチェック、setIntervalで独自のものをハックすることができるかもしれませんすぐdocument.write呼び出しが完了すると、2番目のscriptタグで関数が実行されます。外部スクリプトがまだ読み込まれているかどうかにかかわらず。これはIEの問題ではなく、すべてのブラウザに影響するはずです。外部スクリプトがキャッシュされているので、他のブラウザに影響していないと確信していますか?キャッシュをクリアして別のブラウザでもう一度お試しになるとどうなりますか?

とにかく、スクリプトタグに.onloadを使用するだけでよいはずですが、IE6のスクリプトタグでonloadに問題がないことを99%確信していますので、代わりにwindow要素のonload。上記のような外部のjsファイルを含むすべてのスクリプトがダウンロードされるまで、このイベントは発生しません。

関連する問題