浅谈通过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获取IP和PcName(IE)在vs中可用
Aug 02 Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
Dec 08 Javascript
javascript实现表格排序 编辑 拖拽 缩放
Jan 02 Javascript
jQuery对table表格进行增删改查
Dec 22 Javascript
Bootstarp 基础教程之表单部分实例代码
Feb 03 Javascript
angularjs定时任务的设置与清除示例
Jun 02 Javascript
package.json文件配置详解
Jun 15 Javascript
antd Upload 文件上传的示例代码
Dec 14 Javascript
jQuery实现的中英文切换功能示例
Jan 11 jQuery
vue3实现v-model原理详解
Oct 09 Javascript
简单了解常用的JavaScript 库
Jul 16 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
Jul 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
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
PHP实现Socket服务器的代码
2008/04/03 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
PHP session 会话处理函数
2016/06/06 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
JQuery里面的几种选择器 查找满足条件的元素$("#控件ID")
2011/08/23 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
2013/11/26 Javascript
浅析Node.js查找字符串功能
2014/09/03 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
JavaScript替换当前页面的方法
2015/04/03 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
Angular简单验证功能示例
2017/12/22 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
通过webpack引入第三方库的方法
2018/07/20 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
python基础教程之Hello World!
2014/08/29 Python
python多线程用法实例详解
2015/01/15 Python
python实现挑选出来100以内的质数
2015/03/24 Python
python动态性强类型用法实例
2015/05/09 Python
Python中的 enum 模块源码详析
2019/01/09 Python
python3 配置logging日志类的操作
2020/04/08 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
法国二手手袋、手表和奢侈珠宝购物网站:Collector Square
2018/07/05 全球购物
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
小孩百日宴答谢词
2014/01/15 职场文书
2013年军训通讯稿
2014/02/05 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书