2012-07-03 3 views
5

У меня есть Flash-игра, в которой я пытаюсь сохранить состояние, когда пользователь закрывает вкладку браузера. Она использует следующий код JQuery:Как сделать запрос на разгрузку через браузер?

//Called from Flash when window closes 
function sendRequest(url, params) { 
    $.ajax({ 
     type: "POST", 
     async: false, 
     url: url, 
     data: params 
    }) 
} 

$(window).unload(function() { 
    //Make Flash attempt to save the game when the window closes. 
    //Flash gets the necessary data and calls sendRequest() 
    document["flashGame"].saveBeforeUnload(); 
}); 
  • Firefox: Работает правильно
  • Chrome: корректно работает при перегрузке но не тогда, когда закрытия вкладки или закрытия браузера
  • IE (все версии): не работает вообще

I wan он работает во всех браузерах правильно, но самое главное - Chrome (у многих наших пользователей есть IE).

Flash правильно вызывает sendRequest (во всех браузерах, проверенных с предупреждением), поэтому я не верю, что проблемы возникли из Flash, но это может быть.

+1

Я не думаю, что вы можете и не думать, что вы должны полагаться на .unload, если пользователь хочет закрыть браузер, который хочет закрыть браузер. Если ваш запрос займет больше нескольких мс для сохранения, если браузер будет ждать? Почему бы не сохранить игру, скажем, 30-секундный таймер, так что самый длинный из них будет 30 секунд, тогда вам не нужно беспокоиться о событии разгрузки. – dstarh

+0

@dstarh: Мы уже сохраняем игру на таймере. Целью этого является предотвращение проигрыша игрокам последних нескольких секунд. Часто эти последние действия важны. – Fragsworth

+1

, так что вы говорите, что человек, нажимая на X, чтобы закрыть окно своего браузера, должен ожидать, что все, что они сделали за последние несколько секунд, должно быть сохранено? Я думаю, что для обучения пользователю нажать кнопку «Сохранить», а затем закрыть браузер, лучше потратить время.Нам нужно заставить пользователей отказаться от менталитета «Я вытащил шнур питания со стены, почему не все спасло ???? !!! ???» – dstarh

ответ

6

Короткий ответ в том, что вы не можете.

Событие onbeforeunload было первоначально представлено Microsoft, чтобы разрешить стандартный диалог подтверждения. В настоящее время он поддерживается в оригинальной форме большинством браузеров, и в большинстве случаев разрешается выполнение короткой, неинтерактивной функции (например, вы можете зарегистрировать свое состояние в localStorage). Но, как это описано в the cross-browser jQuery API, это ненадежно:

Точная обработка события разгрузки варьировалась от версии к версии браузеров. Например, некоторые версии Firefox запускают событие , когда идет ссылка, но не тогда, когда окно закрыто. В практическом применении должно быть проверено поведение, должно быть протестировано на всех поддерживаемых браузерах, и в отличие от проприетарного события beforeunload.

Поскольку существует множество потенциальных проблем безопасности, связанные с выполнением задачи, когда пользователь попросил закончить страницу (и, таким образом, сценарий), это, вероятно, будет ненадежным, пока (и если) серьезное усилие нормировки чтобы точно определить, что именно можно сделать в обратном вызове onbeforeunload.

Для прогнозируемого будущего рекомендуется не зависеть от onbeforeunload, а использовать другие схемы, например постоянное сохранение фона или большую кнопку «сохранить».

1

Пробег: window.onbeforeunload. Я нашел это в jQueryBug Tracker в качестве возможного решения:

window.onbeforeunload = function() { return "text"; } 
Смежные вопросы