【问题标题】:Javascript: suppress "This page is asking you to confirm that you want to leave" popup on onbeforeunloadJavascript:抑制 onbeforeunload 上的“此页面要求您确认是否要离开”弹出窗口
【发布时间】:2012-02-09 22:25:58
【问题描述】:

当用户离开页面时,我需要询问他是否想在离开前执行特定操作。

<script type="text/javascript">
$(document).ready(function() {
        window.onbeforeunload = askConfirm;
});

function askConfirm() {
    var addFriend = confirm("Would you like to ping?");
    if (addFriend) {
        var xmlhttp;
        if (window.XMLHttpRequest) {
            xmlhttp=new XMLHttpRequest();
        } else {
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.open("GET","http://example.com?ping=1234",true);
        xmlhttp.send();
    }
    return null;
}

根据最后一个return 语句的值(""nulltruefalse,或者根本没有return 语句),我可以有以下两种情况之一:

1) 用户收到“您要 ping 吗?”确认(良好),发送 ping(良好),用户会看到“此页面要求您确认是否要离开”弹出窗口(错误)

-或-

2) 用户收到“您要 ping 吗?”确认(良好),ping发送(错误),用户看到“此页面要求您确认您要离开”弹出窗口(好)。

如何在发送 AJAX ping 的同时抑制“此页面要求您确认是否要离开”弹出窗口?

编辑:听起来很荒谬,我为这个问题找到的“解决方法”是alert()xmlhttp.send() 声明之后。唯一干净的方法是提醒用户他的 ping 已发送。如果未来的 StackOverflowers 找到更好的解决方案,我很想知道。

谢谢。

【问题讨论】:

  • 返回 true 而不是 null?
  • @MarcB,我认为这是问题中的场景 2。也许 ping 被“优化”了?
  • @bzim:关于“优化掉”你可能是对的。我可以让某些东西“依赖”它吗?
  • @dotancohen,回复 cmets 时使用昵称自动补全。 :)
  • @bzlm:当我按下制表符时,Add Comment 按钮获得焦点,然后我必须按 Shift-制表符返回。我不妨把整件事都打出来。是否仅在使用自动完成功能时才发送通知?一个人可以自动完成并保持专注于文本区域吗?

标签: javascript ajax onbeforeunload


【解决方案1】:

您可以使您的 Ajax 请求同步。

xmlhttp.open("GET","http://example.com?ping=1234", false); // use false here 
xmlhttp.send(); 

如果您的服务器速度较慢,可能会导致轻微延迟,但应该可以解决无法发送 ping 的问题。

【讨论】:

  • 那将是一个 SJAX 请求 ;)
  • 谢谢 Gilly,这看起来确实是问题的根源。我可以确认 SJAX :) 方法确实在我测试的所有条件下都发送了 ping。谢谢!
【解决方案2】:

好吧,我没有在你离开之前这样做,而是在卸载时完成了它,这是我在 FF 和 IE 中工作的内容(除了 chrome,这就是我得到的全部):http://jsfiddle.net/rmpLm/9/

也许你可以让它在 chrome 上工作,但如果你不能,也许你可以做到,如果你点击确定,它会带你到你发送它的页面。希望对你有帮助:)

编辑:也许您应该考虑制作它,以便它在加载时执行它

【讨论】:

  • 你艾丹!你是对的,转向 onunload 确实解决了 Firefox 的问题。我现在无法在 IE 中进行测试(没有 Windows 机器),但感谢您的警告。我确实选择了 Gilly 的赏金答案,因为他确实攻击了问题的根源,但我选择了您的答案作为已接受的答案。我看到您目前需要一些业力,所以请继续发帖,如果我有能力判断您的答案,我会四处走动以支持您的答案!欢迎来到 SO!
  • @dotancohen 非常感谢。我真的不在乎我没有得到赏金(虽然它会很好)。至少我现在可以发表评论了。这将有助于回答。到目前为止,我有 58 个代表点,所以赏金不再重要了 PS:我花了很多时间来解决这个问题
  • 是的,我浏览了您的四个帖子,并确保他们得到了他们应得的认可!感谢您帮助艾丹!
猜你喜欢
  • 1970-01-01
  • 2012-03-14
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
相关资源
最近更新 更多