Как определить, когда пользователь покидает веб-страницу (исключая определенные ссылки) - PullRequest
2 голосов
/ 27 июля 2011

Ситуация: У меня есть веб-страница Grails с двумя таблицами.Одна таблица отображает информацию о персонале (включая определенные флаги), а вторая таблица содержит список флагов с «кнопкой добавления», которая позволяет пользователю добавлять данный флаг к себе.

Теперь естьКнопка «Сохранить», которая при нажатии помещает текущее «состояние» флагов пользователей в нашу базу данных.Поэтому я хочу иметь возможность отображать подсказку, если при попытке пользователя перейти к другой части сайта отображается несохраненная информация.Это достаточно просто с помощью существующего логического значения isDirty, которое хранит каждый флаг.Я могу просто просмотреть активные флаги людей и проверить, не загрязнен ли он.Если у этого человека есть хотя бы один грязный флаг, мне нужно отобразить подсказку, если он попытается уйти, потому что эти данные не будут сохранены, если они явно не нажмут кнопку.

Проблема: Есть много способов отойти от этой страницы.Я использую <body onbeforeunload="checkForDirtyFlags();">, где checkForDirtyFlags () - это базовая функция js для проверки любых грязных флагов.Но вот в чем дело - когда пользователь добавляет или удаляет флаг, это вызывает перезагрузку страницы, потому что способ настройки страницы состоит в том, чтобы перенаправить на URL-адрес следующим образом:

"http://my.url/addFlag/123456"

Затем контроллер знает, как добавитьфлаг с идентификатором 123456 для текущего человека.Однако это НЕ меняет места, где человек находится на веб-сайте, потому что та же страница по-прежнему отображается (она просто содержит обновленные таблицы).Таким образом, в основном, когда я вижу URL с addFlag или removeFlag, я не хочу запрашивать у пользователя, уверены ли они, что они хотят уйти со страницы, потому что в глазах пользователя они не покидают страницу.

Вопрос: Есть ли способ определить, какой целью является цель во время onbeforeunload?Чтобы в моем javascript могло быть что-то вроде этого:

function checkForDirtyFlag() {
    if( justAdding ) { //We are just adding a flag. No prompt necessary
        //Don't do anything
    }
    else if( justRemoving ) { //We are just removing a flag. No prompt necessary
        //Don't do anything
    }
    else { // In this case, we want to prompt them to save before leaving
        alert('You have unsaved data on the page. Leaving now will lose that data. Are you sure you want to leave?');
    }
}

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

Спасибо!

Ответы [ 3 ]

0 голосов
/ 27 июля 2011

Я не совсем уверен, правильно ли я вас понял - но вы на самом деле уже написали решение там. Почему бы вам просто не return строка-сообщение из onbeforeunload, когда это необходимо?

Например:

window.onbeforeunload = function() {
    if( justAdding ) { //We are just adding a flag. No prompt necessary
        //Don't do anything
    }
    else if( justRemoving ) { //We are just removing a flag. No prompt necessary
        //Don't do anything
    }
    else { // In this case, we want to prompt them to save before leaving
        return 'You have unsaved data on the page. Leaving now will lose that data. Are you sure you want to leave?';
    }
};

Если вы вернете string value из этого события, браузер позаботится о модальном диалоговом окне, которое появится. В противном случае ничего не происходит.

0 голосов
/ 27 июля 2011

Я не думаю, что вы можете получить целевое местоположение в событии unload.Что бы я сделал, это связал кнопку сохранения / отправки с функцией, которая отключает событие выгрузки, если кнопка нажата, поэтому отключаю запрос.Если пользователь попытается выйти, нажав назад и т. Д., Событие unload сработает.

0 голосов
/ 27 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...