web前端——由计时打点需求引发的beforeonload使用的一些坑

    首先介绍一下想要写下这篇文章的原因(只想看坑的可以跳过这一段):前段时间接到了一个需求,大致是希望记录用户在某个页面的操作时间(没有太高的精度要求)。我们的项目是一个后台管理项目,使用Vue制作的一个单页应用,那么首先用户进入页面肯定是知道的,页面组件的created生命周期开始计一个时间戳(还有很多种其他方法),那么如何得知用户离开页面呢?首先需要考虑的是有几种算作离开页面的方式:

  • 1.用户通过a标签跳转到同域名下的其他路由
  • 2.用户最小化或者打开着去看其他页面了,这种情况我们的PM定义为未离开,可以不处理
  • 3.用户进行了前进、后退(刷新较为特殊,放在下面一条里)

    以上三种情况,这里面会用到vue-router的导航守卫相关api以及组件的卸载周期来记录,需要考虑两种方式同时触发(肯定有先后)时的处理,和主旨无关,这里不展开了

  • 4.用户关闭了页面(刷新、跳转去其他域名、关闭浏览器页面标签、关闭整个浏览器等一切视为页面关闭的情况)

    这种情况就需要用到咱们的主角了:监听beforeonload事件


    那么首先来看一下这个事件的用法,可以使用addEventListener或者直接window.onbeforeunload = func,那么这时候第一个分歧就来了

  • 1.使用onbeforeunload:如果保证你的项目只有你使用了一个这种事件,那么ok,取消监听也很方便,onbeforeunload = null即可。缺点当然是扩展性差。

  • 2.使用addEventListener:首先,你很可能需要取消这个事件的监听,那么你需要保证add时候和remove时候传参的函数是同一个函数(在内存中的位置是一样的)

    还有就是两种方式在做提示的时候默认文案修改的方式是不同的(计时这种用户无感知的行为不用管)on的方法直接return文案即可,addEventListener则需要修改event.returnValue

    第一个分歧解决之后,首先要看一下这个事件的兼容性(不是应该先看兼容性吗!)

onbeforeunload兼容性

    嗯很好,要啥自行车,由于我的项目使用人群可控,这个问题不用考虑。

    接下来就要看一下这个事件能否满足咱们的需求了:希望在这个事件中调用一个ajax接口让后台记录

    测试方法:在关闭页面时候,接口调用记录和控制台中打印出的东西无法看到,在这个函数中alert也是不起作用的,那么只能是麻烦后端看一下日志,结果是看到了调用记录,证明是可行的(当时松了一口气)。不过这种方法只适用于对精度不是很高的情况下(网络波动等可能造成后端无法拿到数据,极少情况)。

    到此看来仿佛已经完成了这个需求,在代码完成后自己测试了一下,ok没有问题!

    然而,经验丰富的QA同学提出:如果在任务管理器中alt+e(结束进程)来关闭浏览器,还能否成功计时呢?

    测试了一下,日志中莫得反映。。。。。。

    没错,beforeunload这个事件不适用于浏览器意外关闭的情况(进程被杀),也就是说意外断电等情况是无法记录的,由于pm认为这种情况暂时不需要处理(较低精确度),所以就暂时还是使用这种方法进行记录。

    引出思考:如果说精度较高,这种情况该如何处理呢?可以考虑定时调用接口记录(那么用户实际操作次数的精度也需要考虑,需要让后端在统计时得知哪几次调用其实是应该合并的),也可以考虑websoket(和第一种方法其实思路一样)

    总结:利用beforeunload进行计时打点时,适用于低精度的需求情景下,更多时候它还是适合用于提示用户是否已经保存表单的场景。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342