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;