Можно ли использовать префильтры jQuery для обнаружения событий onreadystatechange, где readyState == 3? - PullRequest
1 голос
/ 17 мая 2011

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

Я использую префильтры (доступно с jQuery 1.5) для изменения собственного объекта XHR, в частности, для добавления обработчика события к событию onreadystatechange. У меня есть грубая реализация этого в http://jsfiddle.net/Rdx6f/.. Этот код добавляет к документу атрибуты readyState и responseText объекта XHR при срабатывании события 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?

Ответы [ 2 ]

5 голосов
/ 06 марта 2012

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

Это предложенный обходной путьна данный момент: http://jsfiddle.net/tBTW2/

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

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

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

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

0 голосов
/ 18 мая 2011

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

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

...