Отправка запроса обратно на сервер в событии onbeforeunload - PullRequest
1 голос
/ 19 февраля 2012

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

Я пытаюсьотправить запрос обратно на сервер, чтобы разблокировать запись, но она не работает в Firefox.Событие onbeforeunload вызывается в сценарии, но оно не отправляет запрос обратно на сервер.Есть идеи?

<body>
<script>
    window.onbeforeunload = function (e) {
        doUnlock();
    }

function doUnlock() {
    if (navigator.appName == 'Microsoft Internet Explorer') {
        // works in IE (with an IFRAME)
        utilFrame.location.href = "/unlock.do?recordId=" + recordId;
    } else if (navigator.appName == 'Netscape') {
        // None of this works....
        //window.location.href = "/unlock.do?recordId=" + recordId;
        var req = newXMLHttpRequest();
        req.open("GET", "/unlock.do?recordId=" + recordId, true);
        req.send();
    } else {
        // Works for chrome
        window.open("/unlock.do?recordId=" + recordId);
    }
}

</script>

Ответы [ 2 ]

3 голосов
/ 19 февраля 2012

Добавить пробел между new и XMLHttpRequest.

При выгрузке страницы все ожидающие (AJAX) запросы * отменены .Если вам нужно отправить AJAX-запрос на сервер при выгрузке, используйте синхронный запрос ( не рекомендуется !!! ):

    var req = new XMLHttpRequest();
    req.open("GET", "/unlock.do?recordId=" + recordId, false); // false
    req.send();

Я не рекомендую синхронный запрос, потому чтопользовательский интерфейс блокируется, пока запрос не завершится.Это не очень удобно для пользователя.

2 голосов
/ 19 февраля 2012

Вы должны изучить использование блокировки на основе времени. Когда пользователь начинает редактировать запись, заблокируйте ее с помощью отметки времени. Каждые 30 секунд отправляют пинг от пользователя, что запись все равно должна быть заблокирована. Если в течение 60 секунд отсутствует пинг, разблокируйте запись.

...