4

我想访问导致 beforeunload 事件的事件。具体来说,如果我单击指向另一个页面的链接,我想知道 beforeunload 事件处理程序中的链接是什么。

这样,我将根据 URL 的内容在 beforeunload 事件处理程序中执行不同的操作。

例如 'http:' 或 'https:' 警告用户丢失未保存的更改;'mailto:' 或 'skype:' 不要警告用户,因为页面实际上不会被卸载。

我正在尝试为这样的问题构建一个好的解决方案: mailto 链接(在 chrome 中)正在触发 window.onbeforeunload - 我可以防止这种情况吗?

4

2 回答 2

17

我已经准备好告诉您这是不可能的,因为 onbeforeunload 事件仅在您检查 event.target、event.originaltarget 等时报告已被窗口触发。但是,如果您覆盖 window.onclick,我们可以修改它方法来注册页面上最后点击的元素。然后,通过为 window.onbeforeunload 提供代码,我们可以指定新的行为来检查最后点击的元素的 href。万岁,啤酒!

这里的代码将为您提供您想要的确切信息,在纯 javascript 中并且没有在您的锚标签中添加任何内容。我还输入了 preventDefault() ,它会弹出“此页面要求您确认是否要离开 - 您输入的数据可能不会被保存。” 确认框。希望这会有所帮助 - 你可以从这里弄清楚该怎么做。

<!DOCTYPE html>
<html lang="en">
<head>
    <title>12065389</title>
    <meta charset="utf-8">
    <script type="text/javascript">
        var last_clicked;

        window.onclick = function(e) {
            last_clicked = e.target;
            return true;
        }

        window.onbeforeunload = function(e) {
            var e = e || window.event;
            if (last_clicked.href) {
                alert(last_clicked.href);
                e.preventDefault();
            }
        }
   </script>
</head>
<body>
<a href="http://google.com">google</a>
</body>
</html>
于 2012-08-22T02:53:44.410 回答
0

我可能会将事件附加到页面上的所有链接,而不是 beforeunload 事件。

就像是:

$("a").click(function(evt) {
    if($(this).attr('href').indexOf('http') == 0) {
        if(confirm("Are you sure?")) {
            //continue
        } else {
            evt.preventDefault();
        }
    }
}
于 2012-08-22T02:00:34.313 回答