浅谈通过JS拦截 pushState和replaceState事件


Posted in Javascript onJuly 21, 2017

history.pushState 和 history.replaceState 可以在不刷新当前页面的情况下更改URL,但是这样就无法获取通过AJAX得到的新页面的内容了。

虽然各种HTML5文档说 window.onpopstate 事件可以拦截 pushState 的消息,但在实际的测试中, onpopstate 根本没有任何作用,无法拦截 pushState 的消息。

经过Google一番,才找到了正确获取 pushState 事件的代码

https://stackoverflow.com/a/25673911

// Add this:
var _wr = function(type) {
  var orig = history[type];
  return function() {
    var rv = orig.apply(this, arguments);
    var e = new Event(type);
    e.arguments = arguments;
    window.dispatchEvent(e);
    return rv;
  };
};
history.pushState = _wr('pushState');
history.replaceState = _wr('replaceState');

// Use it like this:
window.addEventListener('pushState', function(e) {
  console.warn('THEY DID IT AGAIN!');
});
window.addEventListener('replaceState', function(e) {
  console.warn('THEY DID IT AGAIN!');
});

这段代码改写了 history 中原来的函数,然后自己激活一个事件

这样就可以解决 pushState 无法激活事件的问题了

另外记得最好将这段代码放在文档加载前执行

以上这篇浅谈通过JS拦截 pushState和replaceState事件就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 加载时自动调整图片大小
May 28 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
Jun 23 Javascript
使用js完成节点的增删改复制等的操作
Jan 02 Javascript
js获取客户端网卡的IP地址、MAC地址
Mar 26 Javascript
Iframe实现跨浏览器自适应高度解决方法
Sep 02 Javascript
浅谈Javascript如何实现匀速运动
Dec 19 Javascript
JavaScript数组对象赋值用法实例
Aug 04 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
Nov 17 Javascript
Angular实现双向折叠列表组件的示例代码
Nov 21 Javascript
详解vuex commit保存数据技巧
Dec 25 Javascript
layui radio点击事件实现input显示和隐藏的例子
Sep 02 Javascript
leaflet加载geojson叠加显示功能代码
Feb 21 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
Jul 20 #Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
Jul 20 #Javascript
微信小程序获取微信运动步数的实例代码
Jul 20 #Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
Jul 20 #Javascript
angular动态删除ng-repaeat添加的dom节点的方法
Jul 20 #Javascript
如何使用JS在HTML中自定义字符串格式化
Jul 20 #Javascript
详解用webpack把我们的业务模块分开打包的方法
Jul 20 #Javascript
You might like
论建造顺序的重要性
2020/03/04 星际争霸
php获取指定范围内最接近数的方法
2015/06/02 PHP
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
js中的屏蔽的使用示例
2013/07/30 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
javascript框架设计读书笔记之数组的扩展与修复
2014/12/02 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
JQuery显示隐藏页面元素的方法总结
2015/04/16 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
JS实现页面打印功能
2017/03/16 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
详解如何使用router-link对象方式传递参数?
2019/05/02 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
[47:48]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第三局
2016/02/28 DOTA
使用setup.py安装python包和卸载python包的方法
2013/11/27 Python
Python判断文件或文件夹是否存在的三种方法
2017/07/27 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
HTML5 通过Vedio标签实现视频循环播放的示例代码
2020/08/05 HTML / CSS
优瑞自动咖啡机官网:Jura
2018/09/29 全球购物
说一下Linux下有关用户和组管理的命令
2016/01/04 面试题
法学专业本科生自荐信范文
2013/12/17 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
神龙架导游词
2015/02/11 职场文书
教你一步步实现一个简易promise
2021/11/02 Javascript