尝试检测浏览器关闭事件

IT技术 javascript jquery browser
2021-02-07 19:01:17

我尝试了很多方法来通过 jQuery 或 JavaScript 检测浏览器关闭事件。但是,不幸的是,我无法检测到关闭。onbeforeunloadonunload方法也没有工作。

如何检测的窗口closeunloadbeforeunload事件?

6个回答

你试过这个代码吗?

window.onbeforeunload = function (event) {
    var message = 'Important: Please click on \'Save\' button to leave this page.';
    if (typeof event == 'undefined') {
        event = window.event;
    }
    if (event) {
        event.returnValue = message;
    }
    return message;
};

$(function () {
    $("a").not('#lnkLogOut').click(function () {
        window.onbeforeunload = null;
    });
    $(".btn").click(function () {
        window.onbeforeunload = null;
});
});

第二个功能是可选的,以避免在单击#lnkLogOut.btn元素时出现提示

还有一件事,自定义提示在 Firefox 中不起作用(即使在最新版本中也是如此)。有关它的更多详细信息,请转到线程。

@Ravi 代码很好。但是如果用户单击“离开此页面”,我想触发注销功能。但是如何检测用户是否点击了“离开此页面”?
2021-03-10 19:01:17
@Bit_hunter,您可以执行一个函数,在其中显示自定义 div,用户可以在其中按 Yes 或 No
2021-03-15 19:01:17
我不确定这是否可能。据我所知,这是不可能的。但是,您能否发布一个新问题并参考此答案,以便社区发表评论。
2021-03-17 19:01:17
有没有办法避免页面刷新时的消息?
2021-03-22 19:01:17
它不显示自定义消息,仅显示浏览器的消息默认值
2021-04-07 19:01:17

参考了各种文章并进行了一些反复试验,最终我开发了这个非常适合我的想法。

这个想法是检测关闭浏览器触发的卸载事件。在这种情况下,鼠标将移出窗口,指向关闭按钮 ('X')

$(window).on('mouseover', (function () {
    window.onbeforeunload = null;
}));
$(window).on('mouseout', (function () {
    window.onbeforeunload = ConfirmLeave;
}));
function ConfirmLeave() {
    return "";
}
var prevKey="";
$(document).keydown(function (e) {            
    if (e.key=="F5") {
        window.onbeforeunload = ConfirmLeave;
    }
    else if (e.key.toUpperCase() == "W" && prevKey == "CONTROL") {                
        window.onbeforeunload = ConfirmLeave;   
    }
    else if (e.key.toUpperCase() == "R" && prevKey == "CONTROL") {
        window.onbeforeunload = ConfirmLeave;
    }
    else if (e.key.toUpperCase() == "F4" && (prevKey == "ALT" || prevKey == "CONTROL")) {
        window.onbeforeunload = ConfirmLeave;
    }
    prevKey = e.key.toUpperCase();
});

ConfirmLeave 函数会给出弹出的默认消息,以防需要自定义消息,然后在ConfirmLeave() 函数中返回要显示的文本而不是空字符串

此外,如果您在鼠标超出该按钮的窗口时向后或向前单击浏览器,它就会触发。:-(
2021-03-13 19:01:17
解决方案很好,但是,就我而言,它似乎只有在浏览器中打开开发人员的控制台时才有效。如果我单击页面(焦点在页面上),则它不起作用。知道为什么会这样吗?
2021-03-21 19:01:17
嗨,希夫。这在大多数情况下似乎工作正常,除了当没有其他选项卡时 ALT+F4,即在浏览器中打开页面并按 Alt+F4。这将关闭浏览器而不显示消息。Ctrl + F4 在同样的情况下工作.. 有什么想法吗?
2021-03-23 19:01:17
当用户按下离开页面按钮时启动 ajax 怎么样?如果不是,还有什么可以替代的
2021-04-02 19:01:17
我最喜欢的答案。这避免了列出所有可能导致您离开页面的 DOM 元素。除此之外,代码还检测选项卡\窗口关闭键盘快捷键。
2021-04-07 19:01:17

在 Linux chrome 环境下尝试以下代码对我有用。在运行之前确保 jquery 附加到文档。

$(document).ready(function()
{
    $(window).bind("beforeunload", function() { 
        return confirm("Do you really want to close?"); 
    });
});

对于简单的遵循以下步骤:

  1. 打开http://jsfiddle.net/
  2. 在 html、css 或 javascript 框中输入一些内容
  3. 尝试在 chrome 中关闭标签

它应该显示以下图片:

在此处输入图片说明

抱歉,在 ubuntu 中我没有 Mozilla 33。所以你可以查找 jsfiddle 的实现
2021-03-11 19:01:17
在卸载之前阻止确认('你真的想关闭吗?')。
2021-03-12 19:01:17
Fiddle url 不再工作。请检查并更新
2021-03-18 19:01:17
@ShashankVivek 小提琴链接确实有效。再次阅读答案。他们从当前版本的 web ui 中删除了“beforeunload”事件处理。所以你不会再在 jsfiddle 中看到通知窗口。但是使用脚本上层您仍然可以自己处理事件。我无能为力。
2021-03-21 19:01:17
目前在 2021 年工作,改为 on 而不是 bind。但我确实有一个问题。当用户点击离开时我们可以运行一个功能吗?
2021-04-05 19:01:17

嗨,我有一个棘手的解决方案,它仅适用于新浏览器:

只需打开一个 websocket 到您的服务器,当用户关闭窗口时,将触发 onclose 事件

@JyotiDuhan 不,您可以在服务器端检测到它
2021-03-22 19:01:17
嗨,我们可以在这个 onclose 事件中显示一个模态窗口/自定义弹出窗口吗?
2021-03-27 19:01:17

以下脚本将在 Chrome 和 IE 上给出消息:

<script>
window.onbeforeunload = function (e) {
// Your logic to prepare for 'Stay on this Page' goes here 

    return "Please click 'Stay on this Page' and we will give you candy";
};
</script>

铬合金
在此处输入图片说明

IE
在此处输入图片说明

在 Firefox 上,您将收到通用消息

在此处输入图片说明

机制是同步的,所以没有服务器调用延迟会起作用,你仍然可以准备一个像模态窗口这样的机制,如果用户决定留在页面上,但没有办法阻止他离开。

在评论中回答问题

F5将再次触发事件,所以将Atl+ F4

我希望检测 HTA 应用程序的关闭事件,此解决方案运行良好。
2021-03-14 19:01:17
@Kiquenet 我刚刚在 IE8 上测试了 Alt + f4 并且它确实触发了机制,在测试它在所有浏览器(IE、Chrome、Firefox)上触发的 Crome 时我一定做错了什么
2021-03-26 19:01:17
有没有办法避免页面刷新时的消息?
2021-03-27 19:01:17
我只想在用户关闭选项卡或导航器和 Alt+F4 时检测。
2021-04-02 19:01:17
当用户按下离开页面按钮时启动 ajax 怎么样?如果不是,还有什么可以替代的
2021-04-05 19:01:17