window.onhashchange(监听 URL hash)

本文介绍了URL中通过search和hash传值的基本概念及应用场景,并探讨了不同监听方法的优缺点,包括setInterval定时检查、利用window.onresize触发事件及window.onhashchange事件监听。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本概念

在 URL 中 传值有两方式,一种是通过 search 来传值(即 ? 后面的部分),一种是通过 hash 来传值(即 # 后面的部分)。它们之间有一个区别, 即 search 改变时浏览器会发一次的 http request,而 hash 改变时浏览器不会发送 http request。也就是 说,search 可以用来做浏览器和服务器端的信息传递,而 hash 则更适合用于本地页面的信息传递(比如在主页面和“跨域” iframe 之间做信息传递,主页面通过改变 iframe.src 中的 hash 部分来“发送数据”, 而 iframe 则通过读取 window.location.hash 来“接收数据”。相反的,iframe 通过改 变 window.location.hash 来“发送数据”,主页面则通过读取 iframe.src 来“接收数据”)。了解了如何收发数据,那么 收发数据的时间点怎么匹配呢?就是说接收方如何知道发送方发送了数据呢?
 

监听方法

最 常用的方案是,数据接收方采用 setInterval 来定时检查,已达到监听的目的。当然,这种方式的弊端在于:如果时间间隔设置太长则不够即时,时 间太短则又牺牲页面性能。除了这个方案之外还有两种较常见的,一种是先改变 iframe 的 src 然后紧接着改变 iframe 的尺寸以触 发 iframe 中的 window.onresize事件(iframe 只要监听 window.onresize 就可以了,这种方法的优势在于 兼容所有浏览器,但缺点在于实现稍麻烦些且只能用于由 iframe 外向 iframe 内的单向传递,详细方法见《iframe 监听 location.href》),另一种则是“最大可能的使用”window.onhashchange 事 件来监听 hash 的改变(所谓“最大可能的使用“,是因为该事件并非所有版本浏览器都支持)。此外,window.onhashchange 事件还 有一个局限性,就是它只能用于在 iframe 内部 hash 的监听,对于主页面而言,仍然只能采用定时检查的方式(这一点和上一种方法相同)。

兼容性

转载于:https://www.cnblogs.com/fly-allblue/p/3387334.html

doctype html> <html lang="zh"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="theme-color" content="#000000"> <meta HTTP-EQUIV="pragma" CONTENT="no-cache"> <meta HTTP-EQUIV="Cache-Control" CONTENT="no-store, must-revalidate"> <link rel="shortcut icon" href="/favicon.ico"> <link href="/page/manage/css/main.css?20241028" rel="stylesheet"> <title>移动管理平台-企业管理</title> </head> <body> <script> var serverTitle = "" if (serverTitle) { window.document.title = serverTitle } window.contextPath = ""; window.apiPrifix = "/emp"; window.staticcdnurl = ""; window.version = "20241028"; window.accessToken = ""; var accesstoken = window.accessToken; if (accesstoken == null || accesstoken == '') { accesstoken = localStorage.getItem("access_token"); } var url = window.location.href; var urlbase = url.split("#")[0]; var gohome = ""; console.info(url) console.info(gohome) if (gohome == "gohome" && (url.endsWith("/#/") || url.endsWith("/#") || url.indexOf("#") == -1 || url.endsWith("#/login"))) { window.location.replace(urlbase + "#/home"); } if (url.indexOf("#") != -1 && url.indexOf("login") == -1 && (accesstoken == null || accesstoken == '')) { window.location.replace(urlbase); url = urlbase; } else { document.write("<div id=\"root\"></div>"); var baseUserId = localStorage.getItem("baseUserId"); if (baseUserId == -1 && url.indexOf("msgMonitor") == -1 && url.indexOf("#") != -1) { if (url.split("#").length > 1 && url.split("#")[1].length > 1) { urlbase = urlbase + "#/clientset/msgMonitor"; window.location.replace(urlbase); url = urlbase; } } } </script> <script src="/page/manage/js/vendor.js?20241028"></script> <script src="/page/manage/js/main.js?20241028"></script> </body> </html>
最新发布
07-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值