聊聊新窗口打开页面的opener问题

1.新窗口中打开页面的方式:

//a 链接
<a target="_blank" />

//opener
window.open()

2.新窗口中打开页面会有两方面的问题:安全问题,性能问题;

 

2.1安全问题:

上面新窗口中打开页面的方式都会在新窗口中找到一个opener的对象。

那什么是opener(MDN:),简单来说,它是父窗口的窗口对象。如果新窗口和服窗口同域的情况下,可以直接拿到这个对象,不同域的情况下,浏览器是会禁止访问这个对象的。但是!!!还是可以通过window.opener.location=newurl的方式来重写父页面的url,这样当再次来到父窗口时,用户一般不会发现当前的父窗口已经改变,还会以为是原来的url页面,如果再次去输入用户名密码什么的,就会被非法盗窃,而用户又察觉不到。这就是安全问题。

2.2性能问题:

一般来说,chrome的每一个窗口就是一个单独的进程,一个进程包含多个线程。

然而通过a标签的target="_blank"属性或者window.open打开的心窗口会与父窗口共用进程和线程。

那这个原因是为什么呢?

因为opener里面有DOM信息。两个进程中同时hold住了DOM信息,在多线程下去合理控制DOM比较难, 于是就放在了一个进程里。目前这样的问题chrome和firefox都存在。

 

3.解决方式:

在a标签上添加这个noopener属性,在新打开窗口的opner置为空


<a  rel='noopener'/>

// es6
let newWindow= window.open();
newWindow.opener = null;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值