如何实现回到原标签页功能

一、前言

最近接到一个需求,从一个标签页A打开标签页B,在标签页B要通过按钮返回标签页A,也就是回到首页功能,记录一下实现的过程。

二、基本实现原理

借助于window.open(url, name)指定name的方式返回。

在A页面设置window.name = 'A',B页面使用window.open('', 'A')的方式返回

三、第一种方案:使用window.opener.name判断

判断是否有opener以及opener的name是否是A页面

js 复制代码
const AUrl = "A.html";
if(window.opener) {
    if(window.opener.name == "A") {
        window.open("", A)
    }
} else {
    widnow.open(AUrl)
}

实现的过程中发现,A打开B页面后,这时候切换到A页面,从浏览器地址栏更改url,此时B页面访问A页面会出现跨域问题,代码做下兼容

js 复制代码
function toHome() {
    const AUrl = "A.html";
    if(window.opener) {
        try {
            let name = window.opener.name; // 获取name可能出现跨域问题
            if(name == "A") {
                window.open("", 'A'); // 可能会出现A窗口不是所需页面,暂无解决方案
            }
        } catch(e) {
            window.opener = window.open(AUrl)
        }
    } else {
        window.opener = widnow.open(AUrl)
    }
}

四、第二种方案:使用postMessage传递信息

B页面通过postMessage传递指令到A页面,A页面获取后返回当前的window.name到B页面。 B页面接收后使用window.open跳转。

js 复制代码
// A.html
window.addEventListener("message", (e) => {
    let data = e.data;
    if(data.action == "backHome") {
        let name = "A" + Math.round(Math.random() * 10000) // 生成随机数,确保name唯一
        window.name = name;
        e.source.postMessage({
            action: "backHome",
            name: name
        }, '*')
    }
})
// B.html
function toHome() {
    let url = 'A.html';
    let timer
    const callback = (e) => {
        let data = e.data;
        if(data.action && data.action == "backHome") {
            clearTimeout(timer);
            window.open("", data.name)
        }
        window.removeEventListener("message", callback)
    }
    let opener = window.opener;
    if(opener) {
        window.addEventListener("message", callback)
        opener.postMessage({
            action: "backHome"
        })
        timer = setTimeout(() => {
            window.removeEventListener("message", callback)
            window.opener = window.open(url);
        }, 300);
    } else {
        window.opener = window.open(url);
    }
}

总结

本文介绍了如何从一个新标签页跳转到原标签页,有window.opener和postMessage两种方法,window.opener方案有一定缺陷,推荐使用postMessage方式实现
相关推荐
kyriewen111 小时前
给浏览器画个圈:CSS contain 如何让页面从“卡成PPT”变“丝滑如德芙”
开发语言·前端·javascript·css·chrome·typescript·ecmascript
英俊潇洒美少年1 小时前
react19和vue3的优缺点 对比
前端·javascript·vue.js·react.js
~无忧花开~3 小时前
React生命周期全解析
开发语言·前端·javascript·react.js·前端框架·react
哈__3 小时前
ReactNative项目OpenHarmony三方库集成实战:react-native-maps
javascript·react native·react.js
SuperEugene4 小时前
Axios + Vue 错误处理规范:中后台项目实战,统一捕获系统 / 业务 / 接口异常|API 与异步请求规范篇
前端·javascript·vue.js·前端框架·axios
行走的陀螺仪4 小时前
手写 Vue3 极简 i18n
前端·javascript·vue.js·国际化·i18n
羽沢314 小时前
一篇简单的STOMP教程QAQ
前端·javascript·stomp
Kel4 小时前
深入 OpenAI Node SDK:一个请求的奇幻漂流
javascript·人工智能·架构
子兮曰4 小时前
AI写代码坑了90%程序员!这5个致命bug,上线就炸(附避坑清单)
前端·javascript·后端
终端鹿5 小时前
Vue3 核心 API 补充解析:toRef / toRefs / unref / isRef
前端·javascript·vue.js