2011-05-17 52 views
1

我試圖在jQuery中實現XHR流式彗星技術,但在檢測onreadystatechange事件時遇到了一些麻煩。我使用的是Firefox 4.0.1。我可以使用jQuery前置過濾器來檢測readyState == 3的onreadystatechange事件嗎?

我使用prefilters(自jQuery 1.5開始提供)修改本機XHR對象,特別是爲onreadystatechange事件添加事件處理程序。我在http://jsfiddle.net/Rdx6f/有一個粗略的實現。當觸發onreadystatechange事件時,該代碼附加到文檔XHR對象的readyStateresponseText屬性。奇怪的是,然而,似乎只檢測onreadystatechange事件時readyState是1

換句話說,jQuery的似乎是檢測onreadystatechange事件時的XMLHttpRequest對象處於狀態「開」(readyState的1),但不當XHR對象處於「收到頭文件」(readyState 2),「加載」(readyState 3)或「完成」(readyState 4)狀態時。

奇怪的是,如果我alert()在事件處理程序,然後我看到onreadystatechange處理時readyState爲1,2,3和4見http://jsfiddle.net/Rdx6f/1/。與http://jsfiddle.net/Rdx6f/相同的代碼,只是alert()而不是附加到文檔。

我也可以檢測onreadystatechange事件,當readyState是原生JavaScript中的1,2,3或4時 - 請參閱http://jsfiddle.net/d7vaH/。 (這些代碼幾乎是從Dylan Schiemann在「更快速的網站」一書的第115頁實現的XHR流中逐字記錄的。)

我在這裏只是做了一些錯誤,比如使用jQuery的Ajax預過濾器錯誤或者犯了一個JavaScript錯誤?這可能是jQuery中的一個錯誤?

回答

5

FYI:我看着這個相當深入,事實證明,jQuery的(因爲1.5)使用onreadystatechange事件內部。這樣做的後果是,jQuery將總是將它的內部函數寫入onreadystatechange事件,覆蓋您設置的任何內容。這發生在AJAX調用實際發送時,這意味着您爲onreadystatechange編寫的函數將一直工作到這個時間(這意味着它將工作,直到readyState = 1,但不再更長)。

這是目前所提出的解決方法:http://jsfiddle.net/tBTW2/

目前,我不能看到一個不同的(更好的)解決方法沒有或者不使用jQuery(或回到1.4.4或更低版本,它完美地工作)或編輯jQuery代碼(因爲它現在是他們將總是覆蓋你試圖掛鉤的任何東西)。

但是,在即將發佈的版本中(很可能在1.8版本中),jQuery團隊計劃根據不同的readyState實現對觸發事件的支持。他們會以某種方式使用Deferreds。

這是保持這個即將到來的變化票:

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

+0

謝謝,這是我正在尋找的答案for。 – jqp 2012-03-27 13:20:52

+0

jfiddle完美地工作,幹得好! – 2015-09-15 21:21:22

0

下面是正確完成從jQuery Bugzilla錯誤#8327鏈接預濾,

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

+0

我不會說這是這麼回事。我在http://jsfiddle.net/Rdx6f/鏈接到的代碼是從你引用的jsfiddle派生而來的。但是,鏈接的jsfiddle使用setInterval()輪詢responseText屬性,這看起來效率不高。我正在尋找一種方法將事件處理程序附加到基礎XHR對象的onreadystatechange事件。 – jqp 2011-05-17 20:42:35

+0

@ user461155是的,我知道,鏈接的代碼,不幸的是官方jQuery響應訪問readystate == 3事件。 :([#1172](http://bugs.jquery.com/ticket/1172)是相關的錯誤,你需要插入任何東西。 – Andrew 2011-05-17 20:44:53

相關問題