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为 false
- scrollbars为 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 | 
浏览器兼容性
加载中…