window.open跳转到一个已经打开的页面

背景

背景是这样的:某天拿到一个需求,在A页面点击打开B页面,B页面中操作完毕之后,关闭B页面,跳转回A页面。此时如果A页面处于打开状态(此时A页面可能已经人为关闭了),则直接定位到该页面,否则打开一个新页面显示A页面。

分析

这里自然就想到window.open函数了。这个函数有四个参数,但是常用的就是前两个。

  • 第一个参数(url): 新页面的地址;
  • 第二个参数(target): 页面的名称。如果当前打开的页面中没有该名称的页面。则打开新页面,并给该页面名称标注为target。否则跳转到该页面。

到这里不免有疑问,这个页面的名称到底是个啥呢?多方查证,其实就是当前页面的window.name属性。

具体看下边的一个具体例子

实例代码

// A页面
import React, { Component } from 'react'
export default class extends Component {
  componentDidMount() {
    window.name = 'A'     // 给A页面的名称设置为“A”
  }
  handleClick=() => {
    window.open('/b', 'B')   // 打开B页面,同时给B页面设置名称为“B”
  }
  render() {
    return <div onClick={this.handleClick}>toB</div>
  }
}

// B页面
import React, { Component } from 'react'
export default class extends Component {
  handleClick=() => {
    window.close()
    window.open('/a', 'A')
  }
  render() {
    return <div onClick={this.handleClick}>toA</div>
  }
}

此时在A页面中点击toB会打开B页面。 在B页面的控制台输入window.name会返回"B";
在B页面点击toA。 此时如果A页面没有关闭。则浏览器关闭B页面且窗口会指向到A页面并刷新。否则会关闭B页面,在新打开一个A页面。

遗留问题

如果B页面不是由A页面点击产生,而是直接在浏览器中输入url产生。 此时点击toA。会产生两个问题:

  • 在浏览器新开一个A页面(无论当面浏览器是否存在A页面);
  • B页面不会关闭。控制台会输出:Scripts may close only the windows that were opened by it. 网上很多解决这个问题的方法,遗憾的是 实测都无效

欢迎大佬们在评论区解答以上两个问题。

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
window.open一个用于在浏览器中打开新窗口的方法。在Vue中,可以使用window.open进行页面跳转。 你可以使用以下两种方式进行跳转: 1. 普通跳转跳转的是路由):通过Vue Router的resolve方法解析目标路由,得到目标路由的href,然后使用window.open打开新窗口。例如: ```javascript const { href } = this.$router.resolve({ name: "newDate", query: { floor_id: this.floor_id } }); window.open(href, '_blank'); ``` 这样会在新窗口中打开名为"newDate"的路由页面,并传递参数floor_id。 2. 跳转到新的网页:通过window.open直接跳转到新的网页。例如: ```javascript window.open("https://www.baidu.com/", "_blank"); ``` 这样会在新窗口中打开百度网页。 需要注意的是,使用window.open进行页面跳转时,大部分浏览器会拦截弹出窗口,因此有些情况下可能无法正常跳转。 在Vue Router 2.1.0版本后,可以使用resolve方法解析路由并获取目标路由的href,然后使用window.open打开新窗口。例如: ```javascript const { href } = this.$router.resolve({ name: 'foo', query: { bar } }); window.open(href, '_blank'); ``` 这样可以在新窗口中打开名为"foo"的路由页面,并传递参数bar。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [vue的跳转方式——window.open & router-link标签 & this.$router.push跳转 & this.$router.replace跳转 & ...](https://blog.csdn.net/weixin_44867717/article/details/120503404)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值