Я работаю над похожей проблемой - я должен отправить данные в ответ на пользователя, покидающего сайт, и мой код находится в качестве внешнего ресурса на чьей-то странице. Я ничего не могу всплыть, и я должен сделать звонок. И я должен использовать JSONP, который не может быть синхронным.
То, что я смог выяснить, это:
- Обработчик onbeforeunload блокирует браузер от уничтожения текущей страницы
- если вы ничего не возвращаете, всплывающее окно не появляется.
Таким образом, ваш код будет работать до тех пор, пока работает обработчик событий.
псевдокод:
window.onbeforeunload = function() {
startAsynchronousSending();
//do lots of slow and synchronous stuff to delay destroying the window//
//return statement deliberately missing
}
На данный момент это уже работает для меня, но часть задержки - это просто интенсивная загрузка ЦП. Это имеет значение (есть достаточно времени для отправки запроса), но я ищу лучшую задержку.
Смотри также: http://forums.thedailywtf.com/forums/t/24374.aspx
Буду признателен за комментарии с идеями о том, что включить в цикл. Я принимаю во внимание некоторые варианты:
- тратить процессор на математику на большие числа
- доступ к локальному хранилищу (синхронный вызов, операция ввода-вывода)
- доступ к DOM
- синхронный вызов ajax (но я не хочу включать код для ajax в скрипт, который его не использует)
Есть идеи?