浅谈通过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将iframe中控件的值传到主页面控件中的实现方法
Mar 11 Javascript
SOSO地图JS画出标注和中心点以html形式运行
Aug 09 Javascript
常用的JavaScript模板引擎介绍
Feb 28 Javascript
js淡入淡出焦点图幻灯片效果代码分享
Sep 08 Javascript
谈一谈JS消息机制和事件机制的理解
Apr 14 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
Oct 11 Javascript
vue父子组件的数据传递示例
Mar 07 Javascript
Vue.js实现网格列表布局转换方法
Aug 25 Javascript
angular1配合gulp和bower的使用教程
Jan 19 Javascript
Node.js成为Web应用开发最佳选择的原因
Feb 05 Javascript
vue项目打包上传github并制作预览链接(pages)
Apr 19 Javascript
原生javascript制作的拼图游戏实现方法详解
Feb 23 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
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
JSON中双引号的轮回使用过程中一定要小心
2014/03/05 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
浅析JS操作DOM的一些常用方法
2016/05/13 Javascript
Jquery获取第一个子元素简单实例
2016/06/02 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
JS中使用FormData上传文件、图片的方法
2016/08/07 Javascript
详解Nodejs基于mongoose模块的增删改查的操作
2016/12/21 NodeJs
jQuery中的一些小技巧
2017/01/18 Javascript
浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
2017/02/19 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
2017/12/11 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
jquery实现动态添加附件功能
2018/10/23 jQuery
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
Python脚本实现集群检测和管理功能
2015/03/06 Python
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
详解django2中关于时间处理策略
2019/03/06 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
Jeep牧马人、切诺基和自由人零配件:4 Wheel Drive Hardware
2017/07/02 全球购物
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
市场营销毕业生自荐信
2013/11/23 职场文书
公益广告宣传方案
2014/02/28 职场文书
生物技术专业求职信
2014/06/10 职场文书
5s标语大全
2014/06/23 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
物业保安辞职信
2015/05/12 职场文书