ReadyState==3인 onreadystatechange 이벤트를 감지하기 위해 jQuery 사전 필터를 사용할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/6035987

문제

jQuery에서 XHR 스트리밍 Comet 기술을 구현하려고 하는데 onreadystatechange 이벤트.저는 파이어폭스 4.0.1을 사용하고 있습니다.

나는 사용하고있다 사전 필터 (jQuery 1.5부터 사용 가능) 네이티브 XHR 객체를 수정하기 위해, 특히 이벤트 핸들러를 onreadystatechange 이벤트.나는 그것에 대한 대략적인 구현을 가지고 있습니다. http://jsfiddle.net/Rdx6f/.해당 코드는 XHR 객체의 문서에 추가됩니다. readyState 그리고 responseText 때 속성 onreadystatechange 이벤트가 시작됩니다.그러나 이상하게도 그것은 단지 onreadystatechange 이벤트 언제 readyState 1입니다.

즉, jQuery는 다음을 감지하는 것 같습니다. onreadystatechange XMLHttpRequest 객체가 "opened"(readyState 1) 상태일 때 이벤트가 발생하지만 XHR 객체가 "headers received"(readyState 2), "loading"(readyState 3) 또는 "done"(readyState 4) 상태일 때는 이벤트가 발생하지 않습니다. .

이상하게도 만약 내가 alert() 이벤트 핸들러에서 하다 참조 onreadystatechange ReadyState가 1, 2, 3, 4일 때 처리합니다.보다 http://jsfiddle.net/Rdx6f/1/.다음과 같은 코드 http://jsfiddle.net/Rdx6f/, 단지 alert()문서에 추가하는 대신 ing.

나도 감지할 수 있어 onreadystatechange 언제 이벤트 readyState 기본 JavaScript에서는 1, 2, 3 또는 4입니다. -- 참조 http://jsfiddle.net/d7vaH/.(해당 코드는 "Even Faster Websites"라는 책의 115페이지에 있는 Dylan Schiemann의 XHR 스트리밍 구현에서 거의 그대로 따온 것입니다.)

jQuery의 Ajax 사전 필터를 잘못 사용하거나 JavaScript에서 실수를 하는 등 제가 여기서 뭔가 잘못하고 있는 걸까요?아마도 jQuery의 버그일까요?

도움이 되었습니까?

해결책

참고:나는 이것을 꽤 깊이 조사했고 jQuery(1.5부터)는 내부적으로 onreadystatechange 이벤트를 사용한다는 것이 밝혀졌습니다.그 결과 jQuery는 언제나 onreadystatechange 이벤트에 내부 함수를 작성하여 설정한 내용을 덮어씁니다.이는 AJAX 호출이 실제로 전송될 때마다 발생합니다. 이는 onreadystatechange에 대해 작성한 함수가 해당 시간까지 작동한다는 것을 의미합니다(readyState = 1까지 작동하지만 더 이상 작동하지 않음을 의미).

현재 제안된 해결 방법은 다음과 같습니다. http://jsfiddle.net/tBTW2/

현재로서는 jQuery를 사용하지 않거나(또는 완벽하게 작동하는 1.4.4 이하 버전으로 돌아가거나) jQuery 코드를 편집하지 않고는 다른(더 나은) 해결 방법을 볼 수 없습니다. 연결하려는 모든 것을 덮어씁니다).

그러나 향후 버전(대부분 1.8)에서 jQuery 팀은 다양한 ReadyState에 따라 이벤트를 트리거하는 지원을 구현할 계획입니다.그들은 어떤 방식으로든 Deferred를 사용할 것입니다.

다음 변경 사항을 유지하는 티켓은 다음과 같습니다.

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

다른 팁

다음은 jQuery bugzilla 버그에서 올바르게 연결된 사전 필터링입니다. #8327,

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top