Window.onbeforeunload выполняется на странице обновления, а не на странице закрыть

Я использую window.onbeforeunload для открытия диалогового окна подтверждения при возникновении события закрытия, но диалог подтверждения появляется на странице обновления и не выполняется на закрытой странице.

Вот код JavaScript:

<script language="JavaScript">
    window.onbeforeunload = confirmWinClose();
    function confirmWinClose() {
        var confirmClose = confirm('Close?');
        return confirmClose;
    }    
</script>

Я пробовал его в Chrome, Firefox и Internet Explorer.

Ответ 1

ПРОБЛЕМА С ВАШИМ КОДОМ:

функция вызывается, когда вы refresh, потому что on refresh the page is unloaded and then reloaded.

в вашем решении, вы также должны заметить, что вы не назначаете function - window.onbeforeunload, но вы назначаете return value of the function при написании

window.onbeforeunload = confirmWinClose();

который также может выполнять функцию (на основе того, где вы размещаете ее в javascript) всякий раз, когда выполняется назначение. Напр.

function confirmWinClose() {
var confirmClose = confirm('Close?');
return confirmClose;
}

window.onbeforeunload = confirmWinClose();

приведенный выше код будет выполнять функцию confirmWinClose при загрузке этого js.

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

РЕШЕНИЕ:

приведенное ниже решение работает для close также

вместо вашего решения, я попробовал это

JS:

window.onbeforeunload = function() {
    var confirmClose = confirm('Close?');
    return confirmClose;
}

или

 window.onbeforeunload = confirmWinClose; //note the absence of calling parantheses

    function confirmWinClose() {
        var confirmClose = confirm('Close?');
        return confirmClose;
    }

это работает как ожидалось.

также обратите внимание, что вы должны return из onbeforeunload явно.

даже если вам нужно вызвать функцию, вы должны сделать

<script>
    window.onbeforeunload = function(e) {
       callSomeFunction();
       return null;
    };
</script>

Ответ 2

Нет полного решения, но вы можете перехватить клавишу F5 (не перехватывать, если пользователь нажимает кнопку обновления браузера...)

var isRefresh = false;

// with jquery

$(function() {
  $(document).on("keydown", function(e) {
    if (e.which === 116)
    {
      isRefresh = true;
    }
  });
});

window.onbeforeunload = function() {
 if (! isRefresh)
 {
   return confirm ('Close ?');
 }
 return false;
};

Ответ 3

Попробуй, это сработает. Вы назначали метод onload, который должен выполняться, когда происходит событие, поэтому он должен быть как объект. ссылка для лучшего объяснения - var functionName = function() {} vs function functionName() {}

 window.onbeforeunload = confirmWinClose;
 function confirmWinClose () {
 var confirmClose = confirm('Close?');
 return confirmClose;
 };

Ответ 4

Так как вы все равно хотите отображать свой текст, что просто использовать onbeforeunload, как ожидается, просто верните строку?

<script language="JavaScript">
  window.onbeforeunload = confirmWinClose;
  function confirmWinClose() {return "close?";}
</script>