Я видел здесь несколько вопросов относительно того, чего я хочу достичь, и основал то, что у меня пока есть, на этих ответах. Но есть небольшое неправильное поведение, которое все еще раздражает меня.
То, что у меня есть, это своего рода функция восстановления. Всякий раз, когда вы вводите текст, клиент отправляет запрос синхронизации на сервер каждые 45 секунд. Это делает 2 вещи. Во-первых, это продлевает срок аренды, который клиент имеет в записи (только один человек может редактировать одновременно) еще на 60 секунд. Во-вторых, он отправляет набранный до сих пор текст на сервер в случае сбоя сервера, сбоя подключения к Интернету и т. Д. В этом случае при следующем входе пользователя в наше приложение пользователь получает уведомление о том, что что-то пошло не так и что-то из текста был восстановлен. Подумайте о восстановлении Microsoft или OpenOffice всякий раз, когда они терпят крах!
Конечно, если пользователь добровольно покидает страницу, ему не нужно уведомляться, и в результате восстановление удаляется. Я делаю этот последний запрос через событие beforeunload.
Все шло нормально, пока меня не попросили сделать окончательную настройку ... То же поведение, что и у вас при переполнении стека при выходе из редактора ... диалог подтверждения.
Пока это работает, НО, диалог подтверждения отображается дважды. Вот код.
Событие
if (local.sync.autosave_textelement) {
window.onbeforeunload = exitConfirm;
}
Функция
function exitConfirm() {
var local = Core;
if (confirm('blub?')) {
local.sync.autosave_destroy = true;
sync(false);
return true;
} else {
return false;
}
};
Некоторые проблемы не имеют отношения к разъяснениям:
- Ядро - это глобальный Объект, который содержит множество переменных, которые используются повсеместно.
- sync делает запрос ajax. Значения основаны на значениях, которые содержит объект Core.sync. Параметр определяет, будет ли вызов асинхронным (по умолчанию) или синхронизированным.
Редактировать 1
Я пытался разделить обе вещи (удаление восстановления и подтверждение пользователя) на beforeunload и unload. Проблема заключалась в том, что выгрузка слишком поздно. Пользователь получает информацию о восстановлении, даже если оно запланировано для удаления. Если вы обновите страницу через 1 секунду, диалоговое окно исчезнет, поскольку файл будет удален к этому моменту.