網站使用 rel="noopener" 打開外部錨


當您的頁面鏈接至使用 target="_blank" 的另一個頁面時,新頁面將與您的頁面在同一個進程上運行。 如果新頁面正在執行開銷極大的 JavaScript,您的頁面性能可能會受影響。

此外,target="_blank" 也是一個安全漏洞。新的頁面可以通過 window.opener 訪問您的窗口對象,並且它可以使用 window.opener.location = newURL 將您的頁面導航至不同的網址。

單擊下面的一個鏈接,打開一個需要大量JavaScript計算的頁面(以下並非鏈接,請參見原文——譯者注):

<a target="_blank">
<a target="_blank" rel="noopener">

沒有rel="noopener",隨機數會被新打開頁面中的JavaScript阻斷。不僅如此,所有主線程活動也會被阻塞,試試選擇頁面中的文本。但加了rel="noopener"之后,隨機數生成一直保持在60fps。當然,是在Chrome或Opera中。

大多數瀏覽器都是多進程的,除了Firefox(他們正在改)。每個進程包含多個線程,包括我們常說的“主”線程。解析、樣式計算、布局、繪制和非worker的JavaScript都在主線程里執行。就是說,一個域中的JavaScript與另一個標簽頁或窗口中的域中的JavaScript在不同的線程里。

然而,由於我們可以通過window.opener同步跨窗口地訪問DOM,因此通過target="_blank"啟動的窗口還在同一個進程(線程)中。通過window.open打開的iframe和窗口也一樣。

rel="noopener"會阻止window.opener,因此不存在跨窗口訪問。Chromium瀏覽器為此做過優化,會在獨立的進程中打開新頁面。

REFs


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM