1

かなり大きく、多くのインクルードを含む Web サイトで誰かを支援しているときに、バグに遭遇し、それを理解できませんでした。こんな感じでした

<script src=...></script>
<div ...
<script>
alert('myscript');
</script>

このページは、html のそのセクションを使用し、jquery を使用してコンテンツを ajax するまで問題なく動作しました。コードが壊れましたが、その理由がわかりません。アラートを見ました。スクリプトがブラウザのネットワーク ログ経由でアクセスされていることがわかります。最初のスクリプト タグの結果の一部が表示されますが、壊れています。

なぜ順序が重要なのですか?私は、DOM の準備ができてスクリプトが実行されている限り、すべてがうまくいくはずだと考えました。しかし、この場合、アヤックスされていると壊れます。あまり時間をかけることはできませんでしたが、何かがタイミングに依存しているのを見るのは興味深いものでした。

--edit--
また、コンテンツ内で ajaxing しているページにスクリプトが既に含まれている場合は、正常に実行されることに気付きました

コンテンツの ajaxing が壊れる理由を知っている人はいますか? その罰金にajaxedされていない場合。

4

1 に答える 1

1

あなたの言うことに基づいて、私は次の評価をします:

40% の可能性 -- スクリプトの負荷に関する問題です。ajax されたスクリプト内の他のスクリプトへの依存関係、ページで定義した変数、または読み込まれると思われる DOM コンテンツでさえ、スクリプトが ajax されて実行されるときに読み込まれない可能性があります。ページ上のスクリプト タグの順序を変更したり、ドキュメントreadyイベント ハンドラ内にスクリプトのロードを配置したり、setTimeout を使用してスクリプトの実行を遅らせたり、またはdefer="defer"本当にクールな場合は、すべてのスクリプトが確実にロードされるようにするブート ローダーを作成してみてください。指定した正確な順序で実行されます。つまり、依存関係のない同時ロードのセットを依存ロードのシーケンスに連鎖させることによって実行されます。

Script1 <---- 依存 --- (Script 2.1, Script 2.2, Script 2.3 ) <--- 依存 --- Script3.

したがって、最初に 1 をロードし、次に 2. すべてのスクリプトをロードし、次に 3.

可能性は 40% -- セキュリティ モデルに関するものです。あなたがそれを ajax しているウェブサイト、それはどこですか? ページが存在するドメインとの関係は? これをテストしていlocalhostますか?そうであれば、さらに制限があります。実際のサーバーではどうですか?ajax 応答で Access-Control-Allow-Origin ヘッダーが適切に設定されていますか?

20% の可能性があります -- これは、スクリプトと DOM の間の循環依存です。要素 X のイベ​​ント ハンドラーが、要素 X を参照するスコープで閉じるとします。その場合、X への参照内に X への参照が存在するため、両方をガベージ コレクションすることはできません。そのため、X が持続し、メモリ リークが発生し、コードを壊す可能性のある使用できない参照を作成する可能性があります。

- 編集 -

あなたのコメントに基づいて、.html(...)スクリプトを実行するための .html または .load は面倒すぎて、まったく機能しない可能性があると思います。ajax でスクリプトをロードする良い方法については、.load() がスクリプトをロードしないを参照してください。または、できjQuery.getScript(...)ます。

また、ajax を使用してプレーン HTML から html ノードをロードしても問題が発生したことを覚えているようです。私には面倒すぎるようです。構造化された情報を ajax 経由で転送する場合は、JSON を使用してから、JavaScript と HTML を使用してその情報を側に提示します。したがって、データ全体とプレゼンテーションを取得するのではなく、データのみを取得してから、独自のプレゼンテーションを作成してください。それははるかにきれいです。

于 2013-01-26T23:42:31.290 に答える