聊聊新窗口打開頁面的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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章