使用onbeforeunload而不需要对话框?

31

我试图在用户离开我的页面时发布数据。我最终找到了一个可行的解决方案,但是当用户离开时它会显示一个确认对话框。我尝试过return null;,但它没有起作用。有没有可能禁用这个对话框?

window.onbeforeunload = function() {
    $.post("track.php", {
        async: false,
        refid: refid,
        country: country, 
        type: type,
    });

    return '';
}

2
Don't return anything? - SeinopSys
你需要在 window.onbeforeunload 上使用 return :( - user198989
也许有一个解决方法,让我来测试一下。我猜你的问题是关于这个的:https://dev59.com/ZXPYa4cB1Zd3GeqPi3Jr 对吗? - A. Wolff
这个可以工作,但唯一的问题是它会弹出一个对话框,好吗?有不同的问题。 - user198989
6个回答

50

根据Mozilla 开发者网络页面

当此事件返回一个非 void 值时,用户将被提示确认页面的卸载。

这意味着处理程序的返回值必须为 undefined(而不是 ''falsenull),以避免触发确认提示。

window.onbeforeunload = function() {

  $.post("track.php", {
  ...
  });

  return undefined;
}

在 JavaScript 中,您可以完全跳过返回值以获得相同的结果。

在使用 jQuery 的 CoffeeScript 中,它类似于:

$(document).ready ->
  $(window).bind('beforeunload', ->
    #put your cleanup code here
    undefined
  )

有关信息,“beforeunload”事件不可靠于数据操作。主要目的只是在离开网页前显示警报消息:https://dev59.com/0mkw5IYBdhLWcg3wXpac#f-kkoYgBc1ULPQZFVbnG - baptx

13

如果您想禁用对话框,请只写

window.onbeforeunload = function() { ... return; }

而不是

window.onbeforeunload = function() { ... return ''; }.

希望这能帮到您。


4

我也尝试了删除return语句,这对我起到了作用。


2

你能测试一下这个吗:

$(window).on('beforeunload', function (e) {
    if (e.originalEvent) $.post("track.php", {
        async: false,
        refid: refid,
        country: country,
        type: type,
    });
    else $.get("", {
        async: false
    });
    $(this).trigger('beforeunload');
}

这将会产生很多无用的请求,但应该能够让您的第一个请求有足够的时间到达服务器。

谢谢,我终于找到解决方案了,bind beforeunload 应该被绑定到 onbeforeunload 上。 - user198989
你的意思是:$(window).bind('onbeforeunload',...) 吗?因为这样使用根本行不通。无论如何,如果你有正确的解决方法,请将其发布为答案。 - A. Wolff
它可以工作。我已经在Firefox、Chrome和Explorer上尝试过了,都可以工作。 - user198989

1

这是使用React和TypeScript:

  useEffect(() => {
    window.onbeforeunload = (ev: any) => {
      ev.preventDefault()
      anotherMethod()
    }
  }, [])

1

我发现了一个非常简单的技巧,可以让这个工作起来

$(window).bind('onbeforeunload', function () {

$.post("track.php", {
async: false,
refid: refid,
country: country, 
type: type,
});

});

2
好的,也许你正在使用较旧版本的jQuery,因为现在:<<请注意,在绑定事件时不再有'on'。在后来的jQuery版本中使用先前的onbeforeunload将导致什么都不发生。>> - A. Wolff
我正在使用相同的方法,但没有返回值,邮政编码不会触发。 - Siim Nelis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接