Я заметил (в Safari 6.0.4 на MacOSX) окно предупреждения появляется, и запрос ajax отправляется только после нажатия «ОК». (В Chrome запрос отправляется во время отображения предупреждения).
Таким образом, код, следующий за моим запросом ajax, фактически задерживает отправленный запрос.
Я считаю, что очень удивительно, но я не могу проверить это, как я не Mac OS X. Хотя alert
блокирует основной JavaScript нить, она не должна препятствовать браузер от отправки просьбе , так как браузер многопоточен. Но я предполагаю, что это возможно, в некоторых реализациях.
Обратите внимание, что независимо от того, alert
будет поддерживать вызов любого обработчика «успеха» или «ошибки», связанного с запросом, что совсем другое. Это связано с тем, что, если вы не используете веб-работников, JavaScript однопоточен в браузерах, а (снова) alert
поддерживает один поток JavaScript.
Если отправки действительно получать поддерживавшиеся alert
, вы можете исправить это с setTimeout
:
$(function() {
url = "http://...../myscript.php";
$.post(url, { action: 'my action', param: 'my parameter'}, {cache: false});
setTimeout(function() { alert("Hello"); }, 0); // Defers it
});
Если это обратные вызовы, которые становятся все удерживаемые до, лучший способ борьбы с этим является чтобы сделать что-то более современное, чем alert
, например, красиво оформленное абсолютно div
, содержащее сообщение. Если вы хотите, чтобы сообщение было модальным, вы можете сделать это самостоятельно, хотя есть некоторые граничные условия, при отключении остальной части страницы; но есть также около миллиона «модальных» плагинов для jQuery, которые обрабатывают эти граничные условия для вас. (Оба JQuery UI и Bootstrap предоставляют их, и их много.)
Поскольку alert() является блокирующим действием. Сообщение отправляется, предупреждение затем останавливает браузер от обработки результата (помните, ajax является асинхронным), пока вы не закроете предупреждение. Вы не задерживаете отправленный запрос, вы задерживаете полученный запрос. –
@KevinB Чтобы уточнить, вы откладываете функции обратного вызова от выполнения, а не получаемый ответ. –
@KevinB Я ожидаю, что браузер блокирует любые обратные вызовы или аналогичные, но что нет исходящего запроса кажется странным? – Samuel