事发背景(时间较久)

  在一个阳光明媚的一天,这天lz正在工位上悠闲的敲着代码;说时迟那时快,运营小姐姐箭步过来,让lz做一个挽留弹窗;我当时一听这TM不是流氓么。于是便有了以下的故事。。。

  如何实现

  众所周知,我们一般是无法去监听浏览器的返回事件的;更别说是用户设备的物理返回键了;依稀记得浏览器确实是有个关闭事件----onbeforeunload;但是这个原意是用户是否确定关闭此页面,会有个弹窗出现;所以,这条路是走不了了。OMG折磨人,于是又想了想,如果我们添加一个中间页,在这个页面进行跳转;如果用户返回必将回到这个页面,然后在进行挽留的需求;思路貌似是可以的;但这样用户体验以及与我们需求的初衷是不符合的,于是又被pass;接着又想了想用hash去做监听呢,而且页面也不会有刷新,感觉还挺好;实践了后发现,页面进去改变了hash值后就会触发一次,当用户返回时,就不再触发这个hashchange事件了;于是就想在浏览器的浏览记录去动手;于是就用到了History 接口中的pushState完成这个需求;

  如何使用:pushState /onpopstate

  pushState见名知意就是往历史记录条目添加一条历史状态;使用方法:

  state:'',//可以用在popstate事件中,可以通过locaton.state获取 k
  title: 'pushstate',//为跳转的state传递一个短标题
  url: '#'//该参数定义了新的历史URL记录
  window.history.pushState(state, title,url);

  onpopstate监听就比较简单:

 window.addEventListener('popstate', (e) => {
this.callback()
}, false)

  兼容性:

这个是H5新特性,目前的兼容性也不是特别好;但是至少我们能够把这个需求能够完成,至于其他的监听思路,lz暂时还没想出来;也请各路大神集思广益。。

最后lz贴上我之前写的方法:

class _browserBack {
init (param) {
let {callback} = param;
this.callback = callback;
this.pushHistory()
this.listenEvent()
}
listenEvent () {
  if('pushState' in window.history){
    window.addEventListener('popstate', (e) =>
      this.callback()
    }, false)
  }
}
  pushHistory () {
if (this.ifhasHash()) return;
let state = {
title: 'pushstate',
url: '#'
}
window.history.pushState(state, 'title', '#');
}
ifhasHash () {
return location.href.includes('#')
}
}

  文章的结尾lz推荐一篇大神的文章:https://www.zhangxinxu.com/wordpress/2013/06/html5-history-api-pushstate-replacestate-ajax/

  小弟不才,还望指教!

H5如何解监听页面退出需求???的更多相关文章

  1. webview缓存及跳转时截取url地址、监听页面变化

    缓存及一些设定 我在做一些项目时,h5做的项目手机浏览器能使用,但是在搬到webview时候不能用,这个时候通过查阅资料,原来是webview没有设定好,包括缓存.缓存大小及路径等等 mWebview ...

  2. react 监听页面滚动

    html: // 如果使用typescript, 定义dom类型 private dom: HTMLDivElement | null // ReactJS中,对Div监听只需要绑定 onScroll ...

  3. js监听页面放大缩小

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>d ...

  4. vue 监听页面宽度变化 和 键盘事件

    vue 监听页面窗口大小 export default { name: 'Full', components: { Header, Siderbar }, data () { return { scr ...

  5. vue中监听页面滚动和监听某元素滚动

    ①监听页面滚动 在生命周期mounted中进行监听滚动: mounted () { window.addEventListener('scroll', this.scrollToTop) }, 在方法 ...

  6. vue监听页面大小变化重新刷新布局

    在项目中由于某些div元素在布局的时候需要初始化宽高,因为当浏览器缩小屏幕的时候需要重新刷新页面视图. 分析思路: 1.在store中创建state,用于保存当前浏览器的宽.高值. 2.在mounte ...

  7. jq监听页面的滚动事件,

    jQuery监听页面的滚动状态,实现代码: $(document).scroll(function() {       var scroH = $(document).scrollTop(); //滚 ...

  8. uni-app中不使用scroll-view组件,监听页面滑直底部事件

    最终达到的目标效果 将要用到 监听页面滚动事件:onPageScroll 获取节点信息uni.createSelectorQuery() 标签布局 <template> <view ...

  9. C# NanUI WinFormium监听页面加载开始\结束

    个人博客 地址:https://www.wenhaofan.com/article/20190501213608 因为NanUI文档中仅介绍了Formium窗口的监听,但是没有WinFormium相关 ...

随机推荐

  1. centos7安装与配置nginx1.11,开机启动

    1.官网下载安装包 http://nginx.org/en/download.html,选择适合Linux的版本,这里选择最新的版本,下载到本地后上传到服务器或者centos下直接wget命令下载. ...

  2. MYCP作业

    本次作业主要复习了输入流输出流的内容 作业要求: 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt ...

  3. mysql 关联表修改数据

    UPDATE t1 INNER JOIN t2 ON t1.c1=t2.c1  SET t1.c2=value WHERE t1`removed`=0 AND t2`removed`=0 AND t1 ...

  4. python中opencv的安装

    1.得到opencv的安装包: 2.把安装包中的cv.py, cv2.pd放到一个文件夹中,并把这个文件夹放到D:\Anaconda2\Lib\site-packages中: 3.添加新的变量,变量名 ...

  5. JavaScript实现轮播图效果

    我又来了,同志们.老想你们了 捕获小可爱一枚. 下面进入正题:用JavaScript原生代码写轮播图效果. 具体效果就不多说了,网站上面的轮播效果我们都知晓.下面是展示代码 html代码: <d ...

  6. T-SQL实用查询之查询字段所属的数据库表

    SELECT b.name as TableName,a.name as columnname From syscolumns a INNER JOIN sysobjects b ON a.id=b. ...

  7. MongoDB代码——Python篇

    需要安装的库:pymongo 一.添加文档 from pymongo import MongoClient # 连接服务器 conn = MongoClient("localhost&quo ...

  8. 软件测试-培训的套路-log3

    最新的套路!我是没了解过--下图中描述-log3 Dotest-董浩 但是我知道不管什么没有白吃的午餐而且还会给钱…如果真的有,请醒醒! 当然话又回来,套路不套路,关键看你是否需要:你如果需要我觉得是 ...

  9. spring boot 业务场景简单,代码完整的demo们

    源码地址:https://github.com/zhzhair/spring-boot-examples.git 开发环境:windows,jdk8,spring boot2.1.4

  10. Iterator接口(迭代器)

    目录 前言 原理 方法 异常 Iterator接口(迭代器) 前言 一般遍历数组都是采用for循环或者增强for,这两个方法也可以用在集合框架,但是还有一种方法是采用迭代器遍历集合框架,它是一个对象, ...