如何处理Angular中的浏览器选项卡关闭事件?仅关闭,不刷新

弗尔坎·巴萨兰(Furkan Basaran)

我的目标是在浏览器选项卡关闭时删除用户cookie。

是否有可能?我可以在没有刷新情况下处理浏览器选项卡关闭事件吗?

如果我使用beforeunloadunload事件,则在用户刷新页面时触发功能,我不希望这样,我只想在关闭选项卡时运行。

如何在Angular中做到这一点?

vvohra87

可悲的是,这不是一个简单的问题要解决。但这是可以完成的。以下答案是由许多不同的SO答案合并而成的。

简单的部分:知道该窗口已被破坏。您可以使用onunload事件句柄来检测到这一点。

棘手的部分:

检测是刷新,链接跟随还是所需的窗口关闭事件。删除链接如下,表单提交非常简单:

var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind('beforeunload', function(eventObject) {
    var returnValue = undefined;
    if (! inFormOrLink) {
        returnValue = "Do you really want to close?";
    }
    eventObject.returnValue = returnValue;
    return returnValue;
}); 

穷人的解决方案

检查event.clientYevent.clientX确定单击了什么来触发事件。

function doUnload(){
 if (window.event.clientX < 0 && window.event.clientY < 0){
   alert("Window closed");
 }
 else{
   alert("Window refreshed");
 }
}

Y轴不起作用,因为它对重新加载或选项卡/窗口关闭按钮的点击为负,而在使用键盘快捷键重新加载(例如F5,Ctrl-R等)和关闭窗口(例如Alt-F4)时为负)。X轴没有用,因为不同的浏览器具有不同的按钮位置。但是,如果您受到限制,那么最好通过一系列if-elses运行事件坐标。注意,这肯定是不可靠的。

涉及的解决方案

(摘自Julien Kronegg)使用HTML5的本地存储和客户端/服务器AJAX通信。警告:这种方法仅限于支持HTML5本地存储的浏览器。

在您的页面上,onunload向窗口添加以下处理程序

function myUnload(event) {
    if (window.localStorage) {
        // flag the page as being unloading
        window.localStorage['myUnloadEventFlag']=new Date().getTime();
    }

    // notify the server that we want to disconnect the user in a few seconds (I used 5 seconds)
    askServerToDisconnectUserInAFewSeconds(); // synchronous AJAX call
}

然后将onloadon主体添加到以下处理程序

function myLoad(event) {
    if (window.localStorage) {
        var t0 = Number(window.localStorage['myUnloadEventFlag']);
        if (isNaN(t0)) t0=0;
        var t1=new Date().getTime();
        var duration=t1-t0;
        if (duration<10*1000) {
            // less than 10 seconds since the previous Unload event => it's a browser reload (so cancel the disconnection request)
            askServerToCancelDisconnectionRequest(); // asynchronous AJAX call
        } else {
            // last unload event was for a tab/window close => do whatever
        }
    }
} 

在服务器上,将断开连接请求收集在一个列表中,并设置一个计时器线程,该线程定期检查该列表(我每20秒使用一次)。断开连接请求超时(即5秒钟消失)后,将用户与服务器断开连接。如果在此期间收到断开连接请求取消,则将相应的断开连接请求从列表中删除,以便不会断开用户的连接。

如果要区分选项卡/窗口关闭事件与跟随的链接或提交的表单,此方法也适用。您只需要在每个包含链接和表单的页面以及每个链接/表单登录页面上放置两个事件处理程序。

闭幕词(双关语意):

由于您要在关闭窗口时删除cookie,因此我假设这是为了防止它们在以后的会话中使用。如果这是正确的假设,则上述方法将很好地工作。您将无效的cookie保留在服务器上(一旦客户端断开连接),当客户端创建新会话时,JS将默认发送该cookie,此时您知道它来自较旧的会话,将其删除并有选择地提供一个在客户端上设置一个新的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在MVC Web应用程序中,当关闭浏览器或选项卡而不注销时如何处理会话

来自分类Dev

angular 6 中的浏览器选项卡关闭事件仅适用于调试模式

来自分类Dev

检测 Bokeh 中的浏览器选项卡关闭

来自分类Dev

在JSF中获取“浏览器选项卡关闭”事件

来自分类Dev

调用ashx处理程序后在浏览器中关闭选项卡

来自分类Dev

如何处理浏览器“多个”选项卡中的用户注销?

来自分类Dev

当ReactJS中的浏览器选项卡关闭时,如何触发弹出窗口?

来自分类Dev

清除选项卡/浏览器上的localStorage关闭,但不刷新

来自分类Dev

实施JWT存储以允许浏览器刷新但在选项卡/浏览器关闭时清除

来自分类Dev

实施JWT存储以允许浏览器刷新但在选项卡/浏览器关闭时清除

来自分类Dev

关闭浏览器选项卡nodejs

来自分类Dev

在关闭浏览器选项卡上发送邮件

来自分类Dev

当浏览器选项卡或窗口关闭时,是否会触发一般事件?

来自分类Dev

当用户关闭ASP.NET MVC中的浏览器或选项卡时,如何注销用户?

来自分类Dev

如何使用JavaScript关闭浏览器选项卡(父窗口)

来自分类Dev

如何关闭知道进程ID的浏览器选项卡?

来自分类Dev

如何恢复意外关闭的浏览器选项卡?

来自分类Dev

用户单击关闭选项卡时如何打开新窗口浏览器?

来自分类Dev

如何在浏览器或选项卡关闭上实现Session.Abandon()?

来自分类Dev

X-Mouse Button Control:如何设置双击关闭浏览器选项卡?

来自分类Dev

客户端无需关闭握手即可与websocket断开连接(关闭浏览器选项卡)。如何正确处理呢?

来自分类Dev

如何在 Angular 中监听浏览器的关闭事件?

来自分类Dev

在浏览器关闭选项卡或浏览器退出上运行方法

来自分类Dev

ec2上的RStudio服务器-关闭浏览器选项卡时不持久

来自分类Dev

如何使用浏览器刷新中的选项卡维护页面状态

来自分类Dev

每当浏览器选项卡/窗口关闭时,Angular 应用程序就会变得不可用

来自分类Dev

当用户关闭基于 django2.0 的网站上的选项卡或浏览器时,如何强制注销用户

来自分类Dev

在不使用鼠标的情况下关闭浏览器中单个选项卡的快捷键

来自分类Dev

使用Logitech mx随时随地关闭浏览器中的选项卡2s

Related 相关文章

  1. 1

    在MVC Web应用程序中,当关闭浏览器或选项卡而不注销时如何处理会话

  2. 2

    angular 6 中的浏览器选项卡关闭事件仅适用于调试模式

  3. 3

    检测 Bokeh 中的浏览器选项卡关闭

  4. 4

    在JSF中获取“浏览器选项卡关闭”事件

  5. 5

    调用ashx处理程序后在浏览器中关闭选项卡

  6. 6

    如何处理浏览器“多个”选项卡中的用户注销?

  7. 7

    当ReactJS中的浏览器选项卡关闭时,如何触发弹出窗口?

  8. 8

    清除选项卡/浏览器上的localStorage关闭,但不刷新

  9. 9

    实施JWT存储以允许浏览器刷新但在选项卡/浏览器关闭时清除

  10. 10

    实施JWT存储以允许浏览器刷新但在选项卡/浏览器关闭时清除

  11. 11

    关闭浏览器选项卡nodejs

  12. 12

    在关闭浏览器选项卡上发送邮件

  13. 13

    当浏览器选项卡或窗口关闭时,是否会触发一般事件?

  14. 14

    当用户关闭ASP.NET MVC中的浏览器或选项卡时,如何注销用户?

  15. 15

    如何使用JavaScript关闭浏览器选项卡(父窗口)

  16. 16

    如何关闭知道进程ID的浏览器选项卡?

  17. 17

    如何恢复意外关闭的浏览器选项卡?

  18. 18

    用户单击关闭选项卡时如何打开新窗口浏览器?

  19. 19

    如何在浏览器或选项卡关闭上实现Session.Abandon()?

  20. 20

    X-Mouse Button Control:如何设置双击关闭浏览器选项卡?

  21. 21

    客户端无需关闭握手即可与websocket断开连接(关闭浏览器选项卡)。如何正确处理呢?

  22. 22

    如何在 Angular 中监听浏览器的关闭事件?

  23. 23

    在浏览器关闭选项卡或浏览器退出上运行方法

  24. 24

    ec2上的RStudio服务器-关闭浏览器选项卡时不持久

  25. 25

    如何使用浏览器刷新中的选项卡维护页面状态

  26. 26

    每当浏览器选项卡/窗口关闭时,Angular 应用程序就会变得不可用

  27. 27

    当用户关闭基于 django2.0 的网站上的选项卡或浏览器时,如何强制注销用户

  28. 28

    在不使用鼠标的情况下关闭浏览器中单个选项卡的快捷键

  29. 29

    使用Logitech mx随时随地关闭浏览器中的选项卡2s

热门标签

归档