打开一个新窗口

点击查看原文,里面有精彩的效果展示。

在新窗口中打开连接的两种方法:

  • 直接a标签加上target=”_blank”属性
  • 使用js进行window.open(url)搞定。

安全问题

一个叫opener的全局对象:如果父页面和新开窗口中的页面是不同域名的,浏览器会禁止新窗口访问opener中的内容。但是有一个操作除外:可以通过window.opener.location = newURL来重写父页面的url,即使与父窗口的页面不同域。

利用这个方式,将父窗口的链接悄悄地替换成了钓鱼页面的地址。刚好父窗口的原始页面没有做防止被iframe嵌入,可以简单地通过iframe做一个极真实的钓鱼页面。如果不看url根本区分不出来是钓鱼页面(父窗口刚打开的时候好好的,谁会关注到这个url居然悄悄地变了呢?)

性能问题

chrome有不同的标签页面使用不同进程和线程,但是有个例外,通过a标签的target=”_blank”属性,或者window.open(url)在新窗口中打开页面, 会与父窗口共用进程和线程。因为opener里有DOM信息。两个进程中同时hold住了DOM信息,在多进程下很难道控制,所以干脆就放在一个进程里了。这个算是chrome的一个小缺陷(firefox也有,ie没有),不过chrome目前正在跟进和优化这里。

若新页面中有一个定时器,每隔一段时间就有一个持续的循环,这个循环在阻塞新页面本身的js线程的同时,也会阻塞opener(也就是打开新页面的父窗口)里的js线程。如果再搞得狠一些,父窗口中的页面交互可以寸步难行。

解决方案

  1. 使用noopener属性
    通过在a标签上添加这个noopener属性(rel=”noopener noreferrer”
    ),可以将新打开窗口的opner置为空。特点:
    可解决除IE外的安全问题,和所有现代浏览器的性能问题

  2. window.open并设置opner为空
    var otherWindow= window.open();
    otherWindow.opener = null;
    other = ‘http://newurl‘;
    可解决所有除safari外,所有浏览器的安全问题,无法解决性能问题

  3. 新建Iframe中打开新窗口,然后关掉iframe
    可解决safari下的安全问题,无法解决性能问题

推荐方案
如果是a标签要在新窗口中打开,添加noopener属性
如果是js中打开新窗口,手动将新窗口的opener置为null

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值