如何阻止页面在JS中卸载(导航)?

Nat*_*wne 68 javascript jquery events

有谁知道如何阻止页面重新加载或导航?

jQuery(function($) {

    /* global on unload notification */
    warning = true;

    if(warning) {
        $(window).bind("unload", function() { 
            if (confirm("Do you want to leave this page") == true) {
                //they pressed OK
                alert('ok');
            } else {
                // they pressed Cancel
                alert('cancel');
                return false;
            }
        });
    }
});

我目前正在开发电子商务网站,显示您未来订单的页面可以使用+/-按钮更改订购商品的数量.以这种方式改变数量实际上不会改变订单本身,他们必须按下确认,因此提交一个积极的行动来改变订单.

但是,如果他们更改了数量并离开了页面,我想警告他们他们这样做是为了防止这是一次意外,因为如果他们离开或刷新页面,更改的数量将会丢失.

在上面的代码中,我使用的是一个全局变量,默认情况下为false(仅适用于测试),当数量更改时,我将更新此变量为true,当他们确认更改时,我将其设置为false .

如果警告为真并且页面已卸载,我会向他们提供一个确认框,如果他们拒绝他们想留在这个页面我需要阻止它卸载.return false不起作用,它仍然允许用户导航(警报仅用于调试)

有任何想法吗?

Nic*_*itz 84

onbeforeunload是你想要的; 你的函数"应该将一个字符串值赋给Event对象的returnValue属性并返回相同的字符串".有关详细信息,请查看MicrosoftMozilla的文档.

您返回的字符串将被浏览器用于向用户显示自定义确认框,允许他们拒绝留在那里,如果他们这样选择.必须采取这种方式来防止恶意脚本导致拒绝浏览器攻击.

  • 应该注意的是,如果你使用jQuery绑定事件,你应该绑定到`beforeunload`(不要在字符串的`on`部分) (3认同)

cra*_*ter 67

此代码根据Natalie的建议发出警告,但如果页面上的表单已提交,则会禁用警告.使用JQuery.

var warning = true;
window.onbeforeunload = function() { 
  if (warning) {
    return "You have made changes on this page that you have not yet confirmed. If you navigate away from this page you will lose your unsaved changes";
  }
}

$('form').submit(function() {
   window.onbeforeunload = null;
});
Run Code Online (Sandbox Code Playgroud)

  • 为什么选择downvote?我回答并添加到主题中.警告变量用于说明概念证明.切换或删除它.我相信大多数用户不会从这个网站逐字复制代码并按原样使用它. (9认同)
  • 完全错过了警告变量的要点. (8认同)
  • 我猜想downvote是因为你设置了警告变量,然后不在你的提交函数中使用它,例如只使用`warning = false`而不是`window.onbeforeunload = null` (7认同)
  • 如果有提交操作,则不需要该警告……仅当用户尝试不提交而离开页面时。 (2认同)

scu*_*ffe 19

你想使用onbeforeunload事件.

  • @ karim79:不,不.jQuery中没有任何东西绑定到beforeunload函数; "unload"绑定到"unload"事件.如果你不相信我,请搜索来源;-) (17认同)

小智 5

window.onbeforeunload = confirmExit;
function confirmExit()
{
    return "You have attempted to leave this page.  If you have made any changes to the fields without clicking the Save button, your changes will be lost.  Are you sure you want to exit this page?";
}
Run Code Online (Sandbox Code Playgroud)