Window: open() 方法
Window 介面的 open() 方法將指定資源載入到一個新的或現有的瀏覽上下文(即選項卡、視窗或 )中,並給定一個指定名稱。
語法
open()
open(url)
open(url, target)
open(url, target, windowFeatures)
引數
url可選-
一個字串,表示要載入資源的 URL 或路徑。如果指定空字串(
"")或省略此引數,則在目標瀏覽上下文中開啟一個空白頁面。 target可選-
一個不含空格的字串,指定資源載入到的瀏覽上下文的 名稱。如果該名稱未識別出現有上下文,則會建立一個新上下文並賦予指定的名稱。還可以使用特殊的
target關鍵字,如_self、_blank(預設)、_parent、_top和_unfencedTop。_unfencedTop僅與 Fenced Frames 相關。 windowFeatures可選-
一個字串,包含以
name=value形式表示的逗號分隔的視窗特性列表。布林值可以透過以下方式設定為 true:name、name=yes、name=true或name=n(其中n是任何非零整數)。這些特性包括視窗的預設大小和位置、是否開啟最小化彈出視窗等選項。支援以下選項:attributionsrc實驗性-
表示您希望瀏覽器在
open()呼叫中傳送Attribution-Reporting-Eligible標頭。此呼叫必須在使用者互動事件處理程式(例如click)內,並在使用者互動後的五秒內透過瞬時啟用完成。在伺服器端,這用於觸發在響應中傳送Attribution-Reporting-Register-Source標頭,以完成歸因源的註冊。此外,當
open()方法完成時,瀏覽器還會觸發儲存相關聯的源資料(如Attribution-Reporting-Register-Source響應頭中提供)。有關更多詳細資訊,請參閱 歸因報告 API。
注意:
open()呼叫不能用於註冊歸因觸發器。 popup-
預設情況下,
window.open在新標籤頁中開啟頁面。如果popup設定為 true,它會請求使用一個最小化的彈出視窗。彈出視窗中包含的使用者介面功能將由瀏覽器自動決定,通常只包括一個位址列。如果popup存在並設定為 false,仍然會開啟一個新標籤頁。有一些遺留特性曾用於控制開啟視窗的 UI 功能。在現代瀏覽器中,它們僅具有請求彈出視窗的效果。如果
popup未指定,並且windowFeatures包含除noopener、noreferrer或attributionsrc之外的任何特性(包括無法識別的特性),則如果滿足以下任何條件,視窗也會作為彈出視窗開啟:location和toolbar都為 false 或缺失menubar為 false 或缺失resizable為 falsescrollbars為 false 或缺失status為 false 或缺失
否則,視窗將作為標籤頁開啟。
width或innerWidth-
指定內容區域的寬度,包括捲軸。所需最小值為 100。
height或innerHeight-
指定內容區域的高度,包括捲軸。所需最小值為 100。
left或screenX-
指定新視窗在使用者作業系統定義的工作區左側的畫素距離。
top或screenY-
指定新視窗在使用者作業系統定義的工作區頂部的畫素距離。
noopener-
如果設定此特性,新視窗將無法透過
Window.opener訪問源視窗,並返回null。當使用
noopener時,除了_top、_self和_parent之外的非空目標名稱,在決定是否開啟新的瀏覽上下文時,都會被視為_blank。 noreferrer-
如果設定此特性,瀏覽器將省略
Referer標頭,並將noopener設定為 true。有關更多資訊,請參閱rel="noreferrer"。
null值被視為與空字串("")相同。
注意: 如果 windowFeatures 中請求的任何位置(top、left)和尺寸(width、height)值不允許整個瀏覽器彈出視窗在使用者作業系統的應用程式工作區內渲染,則這些值將被修正。換句話說,新彈出視窗的任何部分都不能初始定位在螢幕外。
返回值
如果瀏覽器成功開啟新的瀏覽上下文,則返回一個 WindowProxy 物件。只要符合同源策略安全要求,返回的引用就可用於訪問新上下文的屬性和方法。
如果使用 Cross-Origin-Opener-Policy HTTP 標頭,並且文件策略使文件在新瀏覽上下文組中開啟,則對已開啟視窗的引用將被切斷,並且返回的物件將指示已開啟視窗已關閉(closed 為 true)。
如果瀏覽器無法開啟新的瀏覽上下文,例如因為它被瀏覽器彈出視窗阻止程式阻止,則返回 null。
描述
Window 介面的 open() 方法將 URL 作為引數,並將其標識的資源載入到新的或現有的選項卡或視窗中。target 引數確定將資源載入到哪個視窗或選項卡中,而 windowFeatures 引數可用於控制開啟具有最小 UI 功能的新彈出視窗,並控制其大小和位置。
遠端 URL 不會立即載入。當 window.open() 返回時,視窗總是包含 about:blank。URL 的實際獲取被推遲,並在當前指令碼塊執行完成後開始。視窗建立和引用資源的載入是非同步完成的。
現代瀏覽器有嚴格的彈出視窗阻止策略。彈出視窗必須直接響應使用者輸入而開啟,並且每次 Window.open() 呼叫都需要單獨的使用者手勢事件。這可以防止網站向用戶傳送大量視窗。然而,這給多視窗應用程式帶來了問題。為了解決這個限制,您可以設計您的應用程式以:
- 一次最多開啟一個新視窗。
- 重用現有視窗以顯示不同的頁面。
- 建議使用者如何更新瀏覽器設定以允許開啟多個視窗。
示例
開啟新標籤頁
window.open("https://www.mozilla.org/", "mozillaTab");
開啟彈出視窗
另外,以下示例演示瞭如何使用 popup 特性開啟彈出視窗。
window.open("https://www.mozilla.org/", "mozillaWindow", "popup");
可以控制新彈出視窗的大小和位置
const windowFeatures = "left=100,top=100,width=320,height=320";
const handle = window.open(
"https://www.mozilla.org/",
"mozillaWindow",
windowFeatures,
);
if (!handle) {
// The window wasn't allowed to open
// This is likely caused by built-in popup blockers.
// …
}
漸進增強
在某些情況下,JavaScript 被停用或不可用,並且 window.open() 將不起作用。我們不應僅僅依賴此功能的存在,而應提供替代解決方案,以使網站或應用程式仍然能夠執行。
當 JavaScript 被停用時提供替代方法
如果 JavaScript 支援被停用或不存在,則使用者代理將相應地建立一個輔助視窗,或根據其對 target 屬性的處理來渲染引用的資源。目標和想法是為使用者提供(而不是強加)一種開啟引用資源的方式。
HTML
<a href="https://www.wikipedia.org/" target="OpenWikipediaWindow">
Wikipedia, a free encyclopedia (opens in another, possibly already existing,
tab)
</a>
JavaScript
let windowObjectReference = null; // global variable
function openRequestedTab(url, windowName) {
if (windowObjectReference === null || windowObjectReference.closed) {
windowObjectReference = window.open(url, windowName);
} else {
windowObjectReference.focus();
}
}
const link = document.querySelector("a[target='OpenWikipediaWindow']");
link.addEventListener("click", (event) => {
openRequestedTab(link.href);
event.preventDefault();
});
以上程式碼解決了與連結開啟彈出視窗相關的一些可用性問題。程式碼中 event.preventDefault() 的目的是取消連結的預設動作:如果執行了 click 事件監聽器,則無需執行連結的預設動作。但如果使用者的瀏覽器停用或不存在 JavaScript 支援,則 click 事件監聽器將被忽略,瀏覽器將在名為 "WikipediaWindowName" 的目標框架或視窗中載入引用的資源。如果沒有框架或視窗名為 "WikipediaWindowName",則瀏覽器將建立一個新視窗並將其命名為 "WikipediaWindowName"。
重用現有視窗並避免使用 target="_blank"
使用 "_blank" 作為 target 屬性值會在使用者桌面上建立多個新的、未命名的視窗,這些視窗無法回收或重用。嘗試為您的 target 屬性提供一個有意義的名稱,並在您的頁面上重用該 target 屬性,以便單擊另一個連結可以將引用的資源載入到已經建立和渲染的視窗中(從而加快使用者處理速度),從而證明建立輔助視窗的理由(以及使用者系統資源、花費的時間)。使用單個 target 屬性值並在連結中重用它對使用者資源更友好,因為它只建立一個可回收的輔助視窗。
這是一個輔助視窗可以開啟並用於其他連結的示例:
HTML
<p>
<a href="https://www.wikipedia.org/" target="SingleSecondaryWindowName">
Wikipedia, a free encyclopedia (opens in another, possibly already existing,
tab)
</a>
</p>
<p>
<a
href="https://support.mozilla.org/products/firefox"
target="SingleSecondaryWindowName">
Firefox FAQ (opens in another, possibly already existing, tab)
</a>
</p>
JavaScript
let windowObjectReference = null; // global variable
let previousURL; /* global variable that will store the
url currently in the secondary window */
function openRequestedSingleTab(url) {
if (windowObjectReference === null || windowObjectReference.closed) {
windowObjectReference = window.open(url, "SingleSecondaryWindowName");
} else if (previousURL !== url) {
windowObjectReference = window.open(url, "SingleSecondaryWindowName");
/* if the resource to load is different,
then we load it in the already opened secondary window and then
we bring such window back on top/in front of its parent window. */
windowObjectReference.focus();
} else {
windowObjectReference.focus();
}
previousURL = url;
/* explanation: we store the current url in order to compare url
in the event of another call of this function. */
}
const links = document.querySelectorAll(
"a[target='SingleSecondaryWindowName']",
);
for (const link of links) {
link.addEventListener("click", (event) => {
openRequestedSingleTab(link.href);
event.preventDefault();
});
}
同源策略
如果新開啟的瀏覽上下文不共享相同的源,則開啟指令碼將無法與該瀏覽上下文的內容互動(讀取或寫入)。
// Script from example.com
const otherOriginContext = window.open("https://example.org");
// example.com and example.org are not the same origin
console.log(otherOriginContext.origin);
// DOMException: Permission denied to access property "origin" on cross-origin object
// Script from example.com
const sameOriginContext = window.open("https://example.com");
// This time, the new browsing context has the same origin
console.log(sameOriginContext.origin);
// https://example.com
有關更多資訊,請參閱同源策略文章。
可訪問性考慮
避免使用 window.open()
出於以下幾個原因,最好避免使用 window.open():
- 現代瀏覽器提供彈出視窗阻止功能。
- 現代瀏覽器提供標籤頁瀏覽功能,且支援標籤頁的瀏覽器使用者在大多數情況下更喜歡開啟新標籤頁而非新視窗。
- 使用者可能會使用瀏覽器內建功能或擴充套件來選擇是將連結在新視窗中開啟、在同一視窗中開啟、在新標籤頁中開啟、在同一標籤頁中開啟,還是在後臺開啟。強制使用
window.open()以特定方式開啟會讓他們感到困惑並無視他們的習慣。 - 彈出視窗沒有選單工具欄,而新標籤頁使用瀏覽器視窗的使用者介面;因此,許多使用者更喜歡標籤頁瀏覽,因為介面保持穩定。
切勿在 HTML 中內聯使用 window.open()
這些偽造的 href 值在複製/拖動連結、在新標籤頁/視窗中開啟連結、新增書籤或在 JavaScript 載入、出錯或被停用時會導致意外行為。它們還會向輔助技術(如螢幕閱讀器)傳達不正確的語義。
如有必要,請改用 元素。通常,您應該只將連結用於導航到真實的 URL。
始終標識指向輔助視窗的連結
以幫助使用者導航的方式標識將開啟新視窗的連結。
<a target="WikipediaWindow" href="https://www.wikipedia.org">
Wikipedia (opens in new tab)
</a>
目的是警告使用者上下文變化,以最大程度地減少使用者的困惑:更改當前視窗或彈出新視窗可能會讓使用者感到非常迷失方向(對於彈出視窗,沒有工具欄提供“上一步”按鈕返回上一個視窗)。
當上下文的極端變化在發生前明確標識時,使用者可以決定是否繼續,或者他們可以為變化做好準備:他們不僅不會感到困惑或迷失方向,而且經驗豐富的使用者可以更好地決定如何開啟此類連結(是否在新視窗中開啟,是否在同一視窗中開啟,是否在新標籤頁中開啟,是否在“後臺”開啟)。
規範
| 規範 |
|---|
| HTML # dom-open-dev |
| CSSOM 檢視模組 # the-features-argument-to-the-open()-method |
瀏覽器相容性
載入中…