需求

我在做一个体验

当用户 submit enquiry 后会 window.open 开启 WhatsApp。而当用户关闭 WhatsApp 回来网站后,会 show 一个 feedback message。

实现思路

关键就在如何感知到,用户从 WhatsApp 切换回到了网站。

参考: Detect When Users Switch Tabs using JavaScript

监听 visibilitychange,然后通过 document.visibilityState 得知是 hidden or visible。

hidden 表示 leave tab,visible 表示 back to tab。

Android 鬼

本来是很简单的东西,但不知道是不是我手机的问题。Android 在开启 WhatsApp 的时候会触发 2 次。

Windows:open WhatsApp > hidden > close WhatsApp > visible

Android:open WhatsApp > hidden > visible > hidden > close WhatsApp > visible

显然 Windows 是正常的,Android 跑了多一次。

Workaround 就是尽可能判断出 Android 的情况,不要被它搞乱。我没有太认真去思考 right way,我觉得多半是一个 bug 来的,所以暂时解决就好了。

参考代码注释理解吧

const beforeWindowOpenTime = performance.now();
window.open(generateWhatsAppLink(whatsAppNumberBS.value, message), '_blank'); // note 解忧:
// 这里有一个 user back from WhatsApp 后 show submitted feedback 的体验。
// 它比较复杂,因为手机有 bug,
// 正常情况下 visibilitychange 会 dispatch when user leave/enter tab,离开 state = hidden,回来 state = visible。
// so when window open WhatsApp, dispatch lever tab 咯, when user close WhatsApp, dispatch enter tab 咯.
// 但是我的 android 有鬼。
// when window open WhatsApp,它会先 leave + enter 1 次, 紧接着又 leave 1 次, 直到 user back
// 所以下面代码需要顾虑它第一轮假的 leave + enter
const [visible$, hidden$] = partition(
fromEvent(window, 'visibilitychange').pipe(share()),
() => document.visibilityState === 'visible',
); // 监听第一次 visible
visible$.pipe(take(1)).subscribe(() => {
const now = performance.now();
// 如果第一次 visible 超过 1 秒
if (now - beforeWindowOpenTime >= 1000) {
// 直接 show feedback,因为 android 鬼是很快的,绝对不会超过 1 秒
showSubmittedFeedback();
return;
} // 如果小于 1 秒,那可能是 android 鬼,或者 user 真的很快就 close WhatsApp
// 我们尝试监听 hidden,如果是 android 鬼,那么 2 秒内会触发 hidden
// 如果 2 秒后没有 hidden 那判定是 user close 很快。
hidden$.pipe(take(1), timeout({ first: 2000 })).subscribe({
next() {
// android 鬼的话,等待下一次的 visible 表示 user close
visible$.pipe(take(1)).subscribe(() => showSubmittedFeedback());
},
error() {
// user close 的话,直接 show feedback
showSubmittedFeedback();
},
}); function showSubmittedFeedback() {
setTimeout(() => {
submitFeedbackReCaptchaContainer.submitFeedbackReCaptchaContainerController.showSubmittedFeedback();
}, 1000);
}
});

CSS & JS Effect – Do something on enter/leave window tab的更多相关文章

  1. #3使用html+css+js制作网页 番外篇 使用python flask 框架 (II)

    #3使用html+css+js制作网页 番外篇 使用python flask 框架 II第二部 0. 本系列教程 1. 登录功能准备 a.python中操控mysql b. 安装数据库 c.安装mys ...

  2. CSS & JS 制作滚动幻灯片

    ==================纯CSS方式==================== <!DOCTYPE html> <html> <head> <met ...

  3. Batsing的网页编程规范(HTML/CSS/JS/PHP)

    特别注意!!!我这里的前端编程规范不苟同于Bootstrap的前端规范. 因为我和它的目的不同,Bootstrap规范是极简主义,甚至有些没有考虑到兼容性的问题. 我的规范是自己从编程实践中总结出来的 ...

  4. 【转】Maven Jetty 插件的问题(css/js等目录死锁)的解决

    Maven Jetty 插件的问题(css/js等目录死锁,不能自动刷新)的解决:   1. 打开下面的目录:C:\Users\用户名\.m2\repository\org\eclipse\jetty ...

  5. Css Js Loader For Zencart

    Css Js Loader 描述:这个插件很早就出来了,可能知道人非常少 这个插件的功能是整合所有的网站的CSS和JS内容到一个文件里边. 因为CSS和JS文件到了一个文件,加快了程序的运行 在配合其 ...

  6. 购物车数字加减按钮HTML+CSS+JS(有需要嫌麻烦的小伙伴拿走不谢)

    之前在写详情页的时候,如下图 因为自己嫌麻烦,就去看其他网站是怎么写的,想直接拿来用,后来看来看去觉得写得很麻烦,于是最后还是决定自己写,附上HTML+CSS+JS代码,一条龙一站式贴心服务2333 ...

  7. vs合并压缩css,js插件——Bundler & Minifier

    之前做了一个大转盘的抽奖活动,因为比较火,部分用户反馈看不到页面的情况,我怀疑js加载请求过慢导致,所以今天针对之前的一个页面进行调试优化. 首先想到的是对页面的js和css进行压缩优化,百度了下vs ...

  8. 使用CSS/JS代码修改博客模板plus

    之前对CSS/JavaScript了解还不深,只是把模板的CSS胡乱修改了几个属性.最近正好也在做一个网站的前端,学习了不少东西,再来改一改~ 上次最后之所以铩羽而归,是因为从CSS里找不到那些#和. ...

  9. nginx资源定向 css js路径问题

    今天玩玩项目,学学nginx发现还不错,速度还可以,但是CSS JS确无法使用,原来Iginx配置时需要对不同类型的文件配置规则,真是很郁闷,不过想想也还是很有道理.闲暇之际,把配置贴上来.#user ...

  10. IIS7的集成模式下如何让自定义的HttpModule不处理静态文件(.html .css .js .jpeg等)请求

    今天将开发好的ASP.NET站点部署到客户的服务器上后,发现了一个非常头疼的问题,那么就是IIS7的应用程序池是集成模式的话,ASP.NET项目中自定义的HttpModule会处理静态文件(.html ...

随机推荐

  1. ComfyUI进阶篇:ControlNet核心节点

    前言: ControlNet_aux库包含大量的图片预处理节点,功能丰富,适用于图像分割.边缘检测.姿势检测.深度图处理等多种预处理方式.掌握这些节点的使用是利用ControlNet的关键,本篇文章将 ...

  2. 全网最好看的单细胞umap图绘制教程

    全网最好看的单细胞umap图绘制教程 作者按 大家或许都曾被Nature, Science上的单细胞umap图吸引过,不免心生崇拜.在这里,我们将介绍一种简单方便的顶刊级umap图可视化 全文字数|预 ...

  3. FusionAccess liteAD

    回车回车 fusion access完成 进入access网页 https://IP:8443进入web网页 输入用户名:admin:密码:IaaS@PORTAL-CLOUD8! 输入完账号密码后改密 ...

  4. Java基础学习知识点框架(详细)

    //学习网站 Java研发技术学习路线_飞月程序人生-CSDN博客_java开发学习路线 Java后端技术栈梳理 - 知乎 harrywfl/JavaGuide: [Java学习+面试指南] 一份涵盖 ...

  5. Jmeter函数助手32-UUID

    UUID函数用于返回一个伪随机类型4通用唯一标识符(UUID).该函数没有参数,直接引用即可

  6. 【Java】项目采用的设计模式案例

    先说一下业务需要: 做电竞酒店后台系统,第一期功能有一个服务申请的消息通知功能 就是酒店用户在小程序点击服务功能,可以在后台这边查到用户的服务需要 原本设计是只需要一张表存储这些消息,但是考虑设计是S ...

  7. 【Layui】13 轮播 Carousel

    文档地址: https://www.layui.com/demo/carousel.html 基础轮播: <style> /* 为了区分效果 */ div[carousel-item]&g ...

  8. Google的TPU的Pallas扩展无法使用jax的随机数生成

    Google的TPU的Pallas无法使用jax的随机数生成 地址: https://jax.readthedocs.io/en/latest/pallas/tpu.html

  9. ( Ubuntu环境下 )Vim插件推荐-Python自动补齐Vim插件jedi-vim的安装(使用插件管理器vundle进行安装)

    Ubuntu系统下,为 Vim 安装python自动补齐的插件   jedi-vim   . 1.   jedi-vim安装依赖 首先,jedi-vim插件需要当前Vim版本支持python,在终端输 ...

  10. 部署CPU与GPU通用的tensorflow:Anaconda环境

      本文介绍在Anaconda环境中,下载并配置Python中机器学习.深度学习常用的新版tensorflow库的方法.   在之前的两篇文章Python TensorFlow深度学习回归代码:DNN ...