1

XHRストリーミングCometテクニックをjQueryに実装しようとしていますが、onreadystatechangeイベントの検出に問題があります。Firefox4.0.1を使用しています。

プレフィルター(jQuery 1.5以降で使用可能)を使用して、ネイティブXHRオブジェクトを変更します。具体的には、イベントハンドラーをイベントに追加しonreadystatechangeます。私はhttp://jsfiddle.net/Rdx6f/でそれの大まかな実装を持っています。このコードは、イベントが発生したときにXHRオブジェクトreadyStateresponseText属性をドキュメントに追加します。onreadystatechangeただし、奇妙なことに、が1のonreadystatechange場合にのみイベントを検出するようreadyStateです。

つまり、jQueryはonreadystatechange、XMLHttpRequestオブジェクトが「opened」(readyState 1)の状態にあるときにイベントを検出しているように見えますが、XHRオブジェクトが「headersreceived」(readyState 2)、「loading」(readyState 3)の状態にあるときは検出していません。 )、または「完了」(readyState 4)。

奇妙なことに、私alert()がイベントハンドラーにいる場合、readyStateが1、2、3、および4のときの処理が表示されます。http://jsfiddle.net/Rdx6f/1/を参照くださいhttp://jsfiddle.net/Rdx6f/と同じコードですが、ドキュメントに追加する代わりにingするだけです。onreadystatechangealert()

ネイティブJavaScriptでが1、2、3、または4のonreadystatechange場合のイベントも検出できます。http://jsfiddle.net/d7vaH/を参照してください。(このコードは、本「Even FasterWebsites」の115ページにあるDylanSchiemannによるXHRストリーミングの実装からほぼ逐語的に引用されています。)readyState

jQueryのAjaxプレフィルターを間違って使用したり、JavaScriptを間違えたりするなど、ここで何か間違ったことをしているだけですか?これはおそらくjQueryのバグですか?

4

2 に答える 2

5

参考までに: これをかなり詳しく調べたところ、jQuery (1.5 以降) が onreadystatechange イベントを内部で使用していることがわかりました。この結果、jQuery は常にその内部関数を onreadystatechange イベントに書き込み、設定したものを上書きします。これは、AJAX 呼び出しが実際に送信されるたびに発生します。つまり、onreadystatechange 用に記述した関数はその時点まで機能します (つまり、readyState = 1 までは機能しますが、それ以上は機能しません)。

これは現時点で提案されている回避策です: http://jsfiddle.net/tBTW2/

現時点では、jQuery を使用しない (または完全に機能する 1.4.4 以前のバージョンに戻す) か、jQuery コードを編集する (現在のように常にフックしようとするものは何でも上書きします)。

ただし、今後のバージョン (おそらく 1.8) では、jQuery チームはさまざまな readyStates に応じてイベントをトリガーするためのサポートを実装することを計画しています。彼らは何らかの方法で Deferred を使用します。

これは、この今後の変更を保持するチケットです。

http://bugs.jquery.com/ticket/9883

于 2012-03-06T00:46:11.227 に答える
0

これは、jQuery bugzilla バグ#8327から正しくリンクされた事前フィルタリングです。

http://jsfiddle.net/d8ckU/1/

于 2011-05-17T20:35:05.760 に答える