4

そのため、ajax を介して一部の html を取得し、それを を使用してページに挿入すると.html(parseHtml(result,true));、結果内の JavaScript が doc.ready に関係なく実行されるようです。

これは、親ページ自体が既に「準備完了」であり、parseHtml を介してページに挿入される HTML フラグメント + スクリプトの準備完了イベントの概念/実装がないためだと推測しています。

私はこれをそのようにテストしました。通常、出力は 1、3、2 であると予想されます。これは、doc の準備完了が最後に発生するためですが、得られる出力は 1、2、3 です。まったくの偶然かもしれませんが。

console.log('1');

$(document).ready(function () {
    console.log('2');
});
console.log('3');

tinyMce エディタを初期化するための doc.ready で一部のコードが正しく動作しませんが、doc.ready の待機を偽装するために 500 ミリ秒の遅延を設定すると問題なく動作します。したがって、新しい html が DOM に統合される前に JavaScript が実行されるのが早すぎるという問題のようです。明らかに、この setTimeout は一貫して機能しないハックです。

だから私の質問は:

.html($.parseHtml は結果内の doc.ready を尊重しますか?新しい html がそのスクリプトを実行するために DOM で準備が整うのを待つという点で?追加された html が dom で「準備完了」になるまで実行を待ちますか?

4

1 に答える 1

1

ドキュメントから

DOM が初期化された後に .ready() が呼び出されると、渡された新しいハンドラーがすぐに実行されます。

これは DOM 全般を指していることに注意してください。後で AJAX を使用して追加の要素を読み込む場合、DOM はまだ初期化された状態であるため、上記が適用されます。

.load()要素を含む HTML を読み込む場合<script>、DOM に他の要素が追加された後にすべてのスクリプトが実行されると思います。したがって$(document).ready()、これらのスクリプトで使用する必要はありませんが、使用しても問題はありません。

于 2013-10-07T21:25:49.963 に答える