🚀面试官:打开了一个新窗口,怎么知道这个窗口已经被打开过?🚀

前言

我们现在来想这么一个场景,在掘金的文章管理页打开了一篇文章草稿,然后点击编辑,这个时候打开新标签页 A ,再点击一次编辑,打开了标签页 B

此时如果你在 A 编辑, B 是感知不到 A 的内容变动的,因为没做协同编辑。此时再到 B 编辑,那么就可能导致A标签页的内容丢失。

别问我是怎么 YY 出来这种场景的,因为我就真的犯过这种错😓

所以可不可以做一种机制,再第二次点击编辑的时候,弹出一个提示,告诉你这个标签页已经打开过?或者说直接输入 url 的时候,能不能获取到相同的 urltab 页?

如何打开前检测

比如说我们有一个函数 openBoard ,它接受一个 id 参数,用来打开一个编辑页面:

js 复制代码
export const openBoard = (id) => {
  const url = `${location.protocol}//${location.host}/board/${id}`;
  window.open(url);
};

我们来看一下 window.open 这个 api ,它其实是有返回值的:

一个 WindowProxy (en-US) 对象。只要符合同源策略安全要求,返回的引用就可用于访问新窗口的属性和方法。

我们可以实现一个 mapidkey ,打开的 windowvalue ,具体实现如下:

js 复制代码
let openWindowMap = {};
export const openBoard = (id) => {
  const url = `${location.protocol}//${location.host}/board/${id}`;
  const openedWindow = openWindowMap[id];
  if (openedWindow && !openedWindow.closed) {
    // 如果窗口已存在且未关闭
    openedWindow.focus(); // 切换到已存在的窗口
  } else {
    const newWindow = window.open(url); // 打开一个新窗口
    openWindowMap[id] = newWindow;
  }
};

点击打开链接的时候判断一下这个链接是否被打开过,如果已经被打开过,且打开的 tab 页还存在,没有被关闭,则切换到已经存在的窗口

否则就打开一个新窗口,并维护这份关系。

效果如下

最后

以上就是本文的全部内容,算是一个小知识点吧。五一假期将至,提前祝大家假期愉快~

相关推荐
铁皮饭盒9 分钟前
Next.js 风格路由内置?Bun FileSystemRouter 凭啥这么香
javascript
乘风gg10 分钟前
多 Agent 不是万能的!搞懂这 5 个原则,少走 1 年弯路!
前端·agent·ai编程
猩猩程序员44 分钟前
Vercel 推出 Agent 框架 Eve:让 AI Agent 像写 Web 应用一样简单
前端
小林ixn1 小时前
别再背八股了!从 5 个真实场景彻底搞懂 JavaScript 的 this
javascript
爱读源码的大都督1 小时前
Claude Code源码分析(三):为什么系统提示词中需要有tools呢?
前端·人工智能·后端
爱勇宝1 小时前
Claude Code 被曝暗藏“隐形检测”代码:封代理不是最可怕的,可怕的是你根本不知道它在干什么
前端·后端·程序员
小牛不牛的程序员1 小时前
我用 Claude Code 半天撸完了一个完整网站,AI 编程到底提升了多少效率?
前端
东风破_1 小时前
JavaScript 面试常考的字符串算法:从反转字符串到回文判断
前端·javascript
巴勒个啦1 小时前
D3.js 入门实战:用力导向图可视化项目依赖关系
javascript
ITOM运维行者2 小时前
从零搭建企业级服务器监控体系:踩坑实录与架构设计
前端·后端