在没有对话框的情况下使用 onbeforeunload?

Posted

技术标签:

【中文标题】在没有对话框的情况下使用 onbeforeunload?【英文标题】:Using onbeforeunload without dialog? 【发布时间】:2013-06-15 19:11:44 【问题描述】:

我正在尝试在用户离开我的页面时发布数据。我终于设法找到了一个可行的解决方案,但是,当用户离开时,它会显示一个确认对话框。我试过return null;,但没用。是否可以禁用对话框?

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

    return '';

【问题讨论】:

不返回任何东西? 您需要在 window.onbeforeunload 上使用 return :( 也许有解决方法,让我测试一下。我想你的问题是这个问题:***.com/questions/17169092/… 正确吗? 这个可行,但唯一的问题是它会弹出一个对话框,好吗?有不同的问题。 【参考方案1】:

来自Mozilla Developer Network page:

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

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

window.onbeforeunload = function() 

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

  return undefined;

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

在带有 jquery 的咖啡脚本中,它类似于

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

【讨论】:

有关信息,“beforeunload”事件对于数据操作是不可靠的。主要目标只是在离开网页之前显示一条警报消息:***.com/questions/9943220/…【参考方案2】:

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

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

而不是

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

希望对你有帮助。

【讨论】:

【参考方案3】:

删除 return 语句也对我有用。

【讨论】:

【参考方案4】:

你能测试一下吗:

$(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应该是bind onbeforeunload。 你的意思是:$(window).bind('onbeforeunload',...) ???因为使用它根本不应该工作。无论如何,如果您有正确的解决方法,请将其发布为答案。 它有效。我试过火狐、chrome和资源管理器。一切正常。【参考方案5】:

我找到了一个非常简单的技巧来使用它

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

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

);

【讨论】:

好吧,也许你正在使用旧版本的 jquery,因为现在:> 我用的是同样的方法把post code没有return就不会触发【参考方案6】:

这是使用 react 和 typescript:

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

【讨论】:

以上是关于在没有对话框的情况下使用 onbeforeunload?的主要内容,如果未能解决你的问题,请参考以下文章

jquery UI 对话框:如何在没有标题栏的情况下进行初始化?

如何在没有系统确认对话框的情况下删除 Android 11 (API 30) 上的文件?

在没有提示的情况下保存当前打开的文件

是否可以在没有 MFC 的情况下使用 CListCtrl

在没有确认对话框的情况下取消下拉列表的更改事件

如何在没有 dralogfragment 实例的情况下从适配器显示对话框片段?