Могу ли я использовать предварительные фильтры jQuery для обнаружения событий onreadystatechange, где ReadyState == 3?

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

Вопрос

Я пытаюсь реализовать технику потоковой передачи XHR Comet в jQuery, но у меня возникли проблемы с обнаружением onreadystatechange событие.Я использую Firefox 4.0.1.

я использую предварительные фильтры (доступно начиная с jQuery 1.5) для изменения собственного объекта XHR, в частности для добавления обработчика событий в onreadystatechange событие.У меня есть грубая реализация этого на http://jsfiddle.net/Rdx6f/.Этот код добавляет к документу объект XHR. readyState и responseText атрибуты, когда onreadystatechange событие запускается.Как ни странно, однако, кажется, что он обнаруживает только 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 имеет значение 1, 2, 3 или 4 в собственном JavaScript — см. http://jsfiddle.net/d7vaH/.(Этот код почти дословно взят из реализации потоковой передачи XHR Диланом Шиманом на странице 115 книги «Еще более быстрые веб-сайты».)

Я просто делаю что-то не так, например, неправильно использую предварительные фильтры Ajax jQuery или допускаю ошибку JavaScript?Возможно, это ошибка в jQuery?

Это было полезно?

Решение

К вашему сведению:Я изучил это довольно глубоко, и оказалось, что jQuery (начиная с версии 1.5) использует событие onreadystatechange внутри себя.Следствием этого является то, что jQuery будет всегда запишите внутреннюю функцию в событие onreadystatechange, перезаписав все, что вы для нее установили.Это происходит всякий раз, когда действительно отправляется вызов AJAX, а это означает, что функция, которую вы написали для onreadystatechange, будет работать до этого времени (что означает, что она будет работать до тех пор, пока ReadyState = 1, но не дольше).

На данный момент предлагается обходной путь: http://jsfiddle.net/tBTW2/

На данный момент я не вижу другого (лучшего) обходного пути без использования jQuery (или возврата к версии 1.4.4 или более ранней, где он работает отлично) или редактирования кода jQuery (потому что в данный момент они всегда будут перезапишите все, что вы пытаетесь подключить).

Однако в следующих версиях (скорее всего, в 1.8) команда jQuery планирует реализовать поддержку запуска событий в зависимости от различных состояний ReadyStates.Они каким-то образом будут использовать отсрочки.

Это билет, который сохраняет это предстоящее изменение:

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

Другие советы

Вот правильно выполненная предварительная фильтрация, связанная с ошибкой jQuery bugzilla. #8327,

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top