0

我正在尝试为我页面上的所有锚链接禁用 onbeforeunload,因此它仅在我关闭浏览器窗口/选项卡时触发。

这是我这样做的方式:

对于所有锚点,onmouseover,我将空值存储到 window.onbeforeunload 函数。然后,onmouseleave,我恢复了 window.onbeforeunload 函数

$(function () {
    SetupOnNavigateAway();
});

function OnBeforeUnload(oEvent) {       
    return "Are you sure you want to close this page?";     
}

function SetupOnNavigateAway() {
    window.onbeforeunload = OnBeforeUnload;
    $(window).data('beforeunload', window.onbeforeunload);
    $('body').delegate('a', 'hover', function (event) {
        if (event.type === 'mouseenter' || event.type === "mouseover")
            window.onbeforeunload = null;
        else
            window.onbeforeunload = $(window).data('beforeunload');
    });
}

我的问题是,对于某些浏览器版本,当我单击链接时,mouseleave 事件在 mouseclick 事件之前触发。(我的光标没有离开链接)所以 onbeforeunload 函数在不需要调用时被调用..

例子:

现在是这样处理的:

  1. 在按钮上移动鼠标:window.onbeforeunload = null
  2. 将鼠标从按钮上移开:window.onbeforeunload = OnBeforeUnload
  3. 在按钮上移动鼠标:window.onbeforeunload = null
  4. 将光标停留在按钮上并单击:window.onbeforeunload = OnBeforeUnload,重定向

这是它应该如何工作的:

  1. 在按钮上移动鼠标:window.onbeforeunload = null
  2. 将鼠标从按钮上移开:window.onbeforeunload = OnBeforeUnload
  3. 在按钮上移动鼠标:window.onbeforeunload = null
  4. 将光标停留在按钮上并单击:重定向(window.onbeforeunload 仍然为空)

那么,当我单击锚点时,如何防止 mouseleave 事件发生?

谢谢!

4

2 回答 2

2

您是否尝试在单击时为 mouseleave 取消绑定事件侦听器:

$('body').delegate('a', 'click', function (event) {
    $(this).unbind('mouseleave'); 
});
于 2012-04-11T09:01:50.703 回答
0

接受的答案对我有用,但对于那些可能需要另一种解决方案的人来说,这对我也有用:

$('body').delegate('a', 'click', function (event) {
    $(this).attr('clicked', 'yes'); 
});
$('body').delegate('a', 'hover', function (event) {
    if (event.type === 'mouseenter' || event.type === "mouseover") {
        window.onbeforeunload = null;
    }
    else {
        if ($(this).attr('clicked') != 'yes') {
            window.onbeforeunload = $(window).data('beforeunload');
        }
        else {
            $(this).attr('clicked', '');
        }
    }
});
于 2012-04-11T09:27:21.137 回答