2

JavaScriptを使用してページ全体を別のページに置き換えることをテストしているところですが、この答えdocument.write. 理由についてdocument.writeは、同じページを使用するスクリプトとスタイルを含む HTML 全体を置き換える必要がありました。

それは私が望むことをしますが、イベントハンドラーとの一貫性がないようです。私のハンドラーはすべて以下をdocument使用することに接続されています:

$(document).delegate(...);

現在、私は奇妙な結果を持っています。私が作ったフィドルでは、ハンドラーをアタッチします。クリックすると、イベントが発生し、ページが書き換えられ、関数が再度実行されますが、ハンドラーはアタッチされません。

ただし、私のプロジェクトでは、同じルーチンを実行しています ( d.w()、次にハンドラーを追加します)。一度再アタッチするとハンドラーは機能しますが、2 番目のルーチンを実行した後 (同じページで)、もうアタッチされません。

だから私の質問は:

  • を使用する場合d.w()、既存のハンドラは から消去されdocumentますか?
  • 後続の s の後windowも同じですか? それとも何らかの形で「更新」されていますかdocumentd.w()
  • 既に解析されたスクリプトはメモリに残り、後続d.w()の の後に実行されますか? それともそれらも消去されますか?
4

2 に答える 2

6

(以下はgoogle chromeの場合)

のみdocumentがクリアされ、メモリ内のスクリプトは同じままです。変数に何かを設定することで簡単にテストでき、 でドキュメントをクリアした後に存在するかどうかを確認できます.open

そのため、古いネイティブ ハンドラーはドキュメントから失われますが、jQuery は依然としてハンドラーが独自のイベント モデルに存在すると見なします。ログを次のように編集することで確認できます。

console.log('patch', JSON.stringify($.cache ));

jQuery はイベントごとに 1 つのネイティブ ハンドラーのみをアタッチするため、 に"click"イベントが登録されている場合、jQuery にアタッチされたdocumentそれ以上のハンドラーは新しいネイティブ ハンドラーをアタッチせず、代わりにハンドラーが jQuery 内部ハンドラー配列にプッシュされます。

ここでdocument.open、ネイティブ ハンドラーを削除しましたが、javascript をクリアしていないため、jQuery はネイティブ ハンドラーが存在すると見なし、さらに.delegatejQuery 内部ハンドラー配列にのみ移動します。ハンドラーを単純な古いものに置き換えると、document.onclickそれが機能し始めることがわかります。

$(document).unbind()の前に(またはより堅牢な$.cache = {};ですが、これは内部的なものであり、変更される可能性があります) を追加すると、jQuery を引き続き使用し.delegateて、jQuery が再び同期されるようにすることもできます。それ以外の場合は、あなたが呼び出したことがわからないため、そうではありませんdocument.open

そう:

  1. はい
  2. それらはまだ同じオブジェクトであり、参照を保存しdocument.open
  3. それらは記憶に残ります。

http://jsfiddle.net/wphzt/4/

于 2012-05-26T14:07:43.520 に答える
0

2回目以降の動作が停止する唯一の理由は、関数に記述したためです

document.write('<span>'+(++i)+'</span>');

その場合、次回ドキュメントにはスパン値をインクリメントするデリゲート関数はありませんが、上で強調表示したコード スニペットに記述した内容のみが含まれます。したがって、あなたが疑問に思ったように、はい、それらも消去されます。お役に立てれば。

于 2012-05-26T14:06:53.720 に答える