Javascript на выпуск до загрузки - PullRequest
5 голосов
/ 17 июня 2010

Хорошо, у меня проблема со следующим кодом. Что происходит, когда пользователь закрывает свой браузер, он должен попросить либо нажать кнопку ОК, либо нажать ОТМЕНА, чтобы покинуть страницу. Нажатие OK приведет к тому, что window.location перенаправит на другую страницу для отслеживания пользователя (и да, чтобы избежать пламенных войн, существует дополнительная система для обеспечения точного отслеживания в случае, если пользователь убивает браузер из диспетчера задач (как уже упоминалось в аналогичных вопросах)). ОТМЕНА будет оставаться на странице, проблема в том, что независимо от того, какую кнопку вы нажали, вы будете перенаправлены, как если бы вы хотели покинуть страницу. Соответствующий код ниже.

    window.onbeforeunload = confirmExit;
function confirmExit()
{
    var where_to = confirm("Click OK to exit, Click CANCEL to stay.");
    if (where_to == true)
    {
        window.location="logout.php";
    }
    if (where_to == false){
        alert("Returning...");
    }
}

Ответы [ 3 ]

6 голосов
/ 17 июня 2010

onbeforeunload не работает таким образом.Соответствующая функция должна возвращать строку, которая, в свою очередь, должна отображаться в диалоговом окне onbeforeunload по умолчанию.

function confirmExit() {
    return "This message will appear in the dialog.";
}

Но вы ничего не возвращаете и не берете это в свои руки с confirm().Если функция ничего не возвращает, диалоговое окно onbeforeunload вообще не будет отображаться.

Чтобы вызвать реальный выход из системы, вы должны использовать onunload событие.Вот переписывание:

window.onbeforeunload = confirmExit;
window.onunload = logout;

function confirmExit() {
    return "Click OK to exit, Click CANCEL to stay.";
}

function logout() {
    window.location = 'logout.php';
}

Однако вы зависите от веб-браузера, будет ли последний на самом деле попадать на сервер.Большинство, если не все веб-браузеры, не делают.Я бы предпочел создать несанкционированный запрос по этому URL, но вы также зависите от веб-браузера, будет ли он работать безупречно.

0 голосов
/ 24 января 2012

Протестировано в IE9 и Chrome


function addEvent(elm, evType, fn, useCapture) {
  if (elm.addEventListener) {
    elm.addEventListener(evType, fn, useCapture);
    return true;
  }
  else if (elm.attachEvent) {
    var r = elm.attachEvent('on' + evType, fn);
    return r;
  }
  else {
    elm['on' + evType] = fn;
  }
}

function exitAlert(e) {
  var msg = "This message will appear in the dialog.";
  if (!e) { e = window.event; }
  if (e) { e.returnValue = msg; }
  return msg;
}

addEvent(window, 'beforeunload', exitAlert, false);
0 голосов
/ 17 июня 2010

Возможно, вместо того, чтобы взломать браузер пользователя, вы можете запустить XHR-запрос изнутри вашего unbeforeunload () и получить необходимые данные, отправленные туда, куда вам нужно?

Без большей части варианта использования этоТрудно сказать, но это может стать хорошей альтернативой.

...