1、在当前页面未完全加载时,利用location.href跳一下页面,会发现当前页面的汗青偶然会留下,偶然不会留下
【场景举例】在A页面做登录拦截,假如发现未登录则立刻跳B,在B实行history.back(),则偶然会到A,偶然会到A的上一页(观察到与网速有关,网速快时A没汗青,网速慢时A有汗青)。因此,B的上一条histiory不固定的话,返回的功能就会有标题。
【缘故起因分析】参看HTML Standard文档阐明, 假如当前document没有完全加载,则就算利用location.href也相当于replace的作用,原来是historyHanding在作怪
【办理方案】区分historyHanding是否会被置为replace的关键点在于找到Document is completely loaded的时点,经在chrome欣赏器里验证,通过window.onload方法无法判断,通过$(document).ready()也无法判断。
两个办理办法:
方法一:加延时
加100-300ms的延时,包管当前页的汗青肯定存在
方法二:通过document.readyState判断
document.readyState有loading(正在加载)、interactive(可交互)和complete(完成)等状态,实验利用complete来举行判断。假如未加载完成,手动插入一条汗青,以包管当前页汗青肯定存在。
- if(document.readyState!=="complete"){
- history.pushState(null,"",location.href);
- }
复制代码
2、在iOS webview 中连续快速调用2个location.href,则会导致前一个会被取消
【场景举例】嵌在App中的H5,大概会利用location.href的方式关照原生做一些事变,如隐蔽头部、修改头部颜色、隐蔽菜单等等,当须要同时做多件事变时,在iOS webview中,连续利用location.href,会有哀求abort。因此无法同时关照APP原生做多件事变。
【办理方案】接纳iframe
- let iframe = document.createElement("IFRAME");
- iframe.style.display = "none";
- iframe.style.height = 0;
- iframe.setAttribute("src", url);
- document.body.appendChild(iframe);
- setTimeout(() => {
- iframe.parentNode.removeChild(iframe);
- iframe = null;
- }, 200);
复制代码
3、在欣赏器中,连续调用多个location.href会看到有哀求被cancle掉了。着实标题3与标题2有异曲同工之处。
【场景举例】js循环批量下载文件时,假如利用location.href会出现部分文件无法下载。
【办理方案】接纳iframe,与2类似
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |