Вызов прерван загрузкой страницы - PullRequest
3 голосов
/ 23 февраля 2010

Я новичок в использовании ajax, и я всегда думал, что он полностью асинхронный. Но я обнаружил, что вызов может быть прерван перезагрузкой страницы или изменением страницы (например, нажатием на гиперссылку). У меня сложилось впечатление, что когда запускается вызов ajax, он выполняется независимо от того, что браузер делает потом. Это неправильно?

Теперь перейдем к конкретной проблеме: подумайте об онлайн-тесте, где пользователи отвечают на вопросы (вводя текстовые поля). Когда текстовое поле теряет фокус, вызывается ajax-вызов, который сохраняет значение текстового поля в БД. Это хорошо работает при переключении между текстовыми полями. Тем не менее, у меня также есть кнопка отправки, которая запускает действие публикации на другой странице (это кнопка отправки). Когда я ввожу что-то в текстовое поле и затем нажимаю на кнопку, звонок не выполняется. Более того, когда я набираю текстовое поле, нажимаю в другом месте (также вызывая вызов) и быстро нажимаю на кнопку отправки, вызов также не выполняется. Это ожидаемое поведение?

Причина, по которой я в первую очередь использую ajax, заключается в сохранении значений, поэтому, когда происходит что-то непредвиденное, например, сбой браузера, уже введенный текст уже сохраняется.

Мой образ мышления неправильный? Как бы вы решили эту проблему?

Спасибо за ваше время!

Ответы [ 2 ]

2 голосов
/ 23 февраля 2010

AJAX является асинхронным.

Когда вы отправляете запрос AJAX, движок javascript отправляет его и устанавливает обработчик для ответа.

Однако, если вы отправите AJAX-запрос на сервер, а затем уйдете со страницы до его получения, ничего не произойдет. Зачем? Поскольку при каждой загрузке страницы вся среда Javascript разрушается и инициализируется заново, он не знает, что произошло на последней странице.

В случае вашей проблемы я бы перехватил действие отправки формы и сделал все, что вам нужно сделать с данными, и затем отправил форму.

Редактировать: В ответ на ваш комментарий. Ты прав. Если ajax-запрос отправлен, и вы не зависите от его возвращаемого значения, то это не должно иметь значения.

Я бы предложил отладить вашу проблему с помощью Firebug , чтобы проверить, действительно ли AJAX-вызов действительно отправляется правильно, и чтобы убедиться, что ваш сервер правильно обрабатывает его.

1 голос
/ 23 февраля 2010

Если вы не делаете что-то особенное с постоянным локальным хранилищем, все вызовы javascript и ajax сдуваются, когда новая страница загружается поверх текущей. Также, когда отправка выполняется в форме.

Чтобы сохранить вещи внутри страницы, сохраните данные как можно скорее. Например, возможно сэкономить на включении, возможно периодически с таймером, а не только на потере фокуса.

Повторная отправка страницы: сначала измените поведение при нажатии, затем перейдите на новую страницу.

Все эффекты, которые вы видите, нормальные.

Кроме того, не забудьте протестировать как в медленных (то есть 6 или 7), так и в быстрых браузерах (хром)

...