iframe子页面调用history.back(),父页面会返回

2020-01-21  本文已影响0人  farawei

1,问题原因:浏览器兼容问题,Chrome支持,Safari不支持

解决姿势:https://blog.csdn.net/qingyuexiao/article/details/84707473

function goBack(){
    //解决Safari中后退功能的兼容问题
    if (navigator.userAgent && /(iPhone|iPad|iPod|Safari)/i.test(navigator.userAgent)) {
        window.location.href = window.document.referrer;
    } else {
        window.history.back(-1);  //根据需要可使用history.go(-1);
    }
}

2,问题已经解决,我想说说我的场景与解题思路

场景是在vue框架的基础上,把某一个模块的页面,全部替换为第三方的站点,使用iframe标签去展示

一,可能是冒泡导致,因为是简单的调用了window.history.back()

参考:https://www.cnblogs.com/likesunny/p/5688429.html
所以自己写代码来验证,如下图:

首页.png 第二页.png
测试后发现,不管我有没有阻止冒泡,在Chrome下和Safari下,都没有问题,我在考虑可能是第三方网站的代码问题,我去查了第三方的代码,就是简单的window.history.back(-1),到这里并没有解决我的问题,想另外的方法

二,有没有可能是子页面window的问题

子页面下window拿到的可能是父页面的window
我使用了几种方式去验证

window
window.self
window.top
this
window.document.querySelector('iframe').contentWindow

三,既然找不到源头,那我事后修改

就是监听返回事件,对监听的事件进行处理进行后补处理
使用的是window下popstate事件,这里不多解析,可以参考下:https://www.jb51.net/html5/606481.html

window.onpopstate = () => {
    console.log('onpopstate')
    window.history.pushState('forward', null, '#')
    window.history.forward(1)
}

不过因为有些机子行有些不行,有些要点两下才有效果,可能是自己也不大懂popstate,pushstate

偶然翻到这一篇文章:https://www.cnblogs.com/zeussbook/p/10870479.html
说是浏览器问题,特意搜索Chrome下,Safari下的history.back(),果然是这样。终于知道时间是怎么过去的了

上一篇 下一篇

猜你喜欢

热点阅读