開啟乙個新視窗

2021-08-07 01:48:47 字數 1145 閱讀 1306

在新視窗中開啟連線的兩種方法:

乙個叫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執行緒。如果再搞得狠一些,父視窗中的頁面互動可以寸步難行。

使用noopener屬性

通過在a標籤上新增這個noopener屬性(rel=」noopener noreferrer」

),可以將新開啟視窗的opner置為空。特點:

可解決除ie外的安全問題,和所有現代瀏覽器的效能問題

window.open並設定opner為空

可解決所有除safari外,所有瀏覽器的安全問題,無法解決效能問題

新建iframe中開啟新視窗,然後關掉iframe

可解決safari下的安全問題,無法解決效能問題

推薦方案

如果是a標籤要在新視窗中開啟,新增noopener屬性

如果是js中開啟新視窗,手動將新視窗的opener置為null

寫了乙個開啟最大新視窗的JS

在ie裡面如果使用a標籤的target black 開啟的新視窗,那麼視窗的大小是由最後一次關閉視窗時視窗大小決定的,如果我們希望a標籤開啟的新視窗都是最大的視窗,那麼我們需要使用window.open來實現。另外在ie7裡面還有另外乙個問題就是如果我們是用a標籤開啟的新視窗,那麼在window.c...

寫了乙個開啟最大新視窗的JS

在ie裡面如果使用a標籤的target black 開啟的新視窗,那麼視窗的大小是由最後一次關閉視窗時視窗大小決定的,如果我們希望a標籤開啟的新視窗都是最大的視窗,那麼我們需要使用window.open來實現。另外在ie7裡面還有另外乙個問題就是如果我們是用a標籤開啟的新視窗,那麼在window.c...

寫了乙個開啟最大新視窗的JS

在ie裡面如果使用a標籤的target black 開啟的新視窗,那麼視窗的大小是由最後一次關閉視窗時視窗大小決定的,如果我們希望a標籤開啟的新視窗都是最大的視窗,那麼我們需要使用window.open來實現。另外在ie7裡面還有另外乙個問題就是如果我們是用a標籤開啟的新視窗,那麼在window.c...