窗口


Window 是 DOM 最顶层的 window 对象的包装器。它具有扩展操作,并且可以接收各种窗口事件。

每个 Window 都是 EventEmitter 类的实例,您可以使用 Window.on(...) 来响应原生窗口的事件。

行为变更

自 0.13.0 版本起,Window 有一些变化。请参阅 从 0.12 迁移到 0.13 的迁移说明

概述

// Get the current window
var win = nw.Window.get();

// Listen to the minimize event
win.on('minimize', function() {
  console.log('Window is minimized');
});

// Minimize the window
win.minimize();

// Unlisten the minimize event
win.removeAllListeners('minimize');

// Create a new window and get it
nw.Window.open('https://github.com', {}, function(new_win) {
  // And listen to new window's focus event
  new_win.on('focus', function() {
    console.log('New window is focused');
  });

});

Window.get([window_object])

  • window_object {DOM Window} 可选 是 DOM 窗口
  • 返回 {Window} 原生 Window 对象

如果未指定 window_object,则返回当前窗口的 Window 对象,否则返回 window_objectWindow 对象。

注意

如果 window_objectiframe 的,该函数仍将返回最顶层窗口的 Window 对象。

// Get the current window
var win = nw.Window.get();

// Get iframe's window
var iframeWin = nw.Window.get(iframe.contentWindow);

//This will return true
console.log(iframeWin === win);

// Create a new window and get it
nw.Window.open('https://github.com/nwjs/nw.js', {}, function(new_win) {
  // do something with the newly created window
});

Window.getAll(callback)

获取所有窗口,并使用回调函数,该函数的参数是 nw.Window 对象数组。此函数自 0.42.6 版本起支持。

Window.open(url, [options], [callback])

行为变更

该函数的行为自 0.13.0 版本起已更改。请参阅 从 0.12 迁移到 0.13 的迁移说明

  • url {String} 要在打开的窗口中加载的 URL
  • options {Object} 可选 请参阅清单格式中的 窗口子字段。 此外,以下额外字段也可以在 options 中使用。
    • new_instance {Boolean} 可选 是否在新渲染进程中打开一个新窗口。
    • mixed_context {Boolean} 可选 如果为 true,则 Node 上下文和 DOM 上下文将在新窗口的进程中合并。 仅在 new_instance 为 true 时使用。
    • inject_js_start {String} 可选 在任何 DOM 构建和任何脚本运行之前注入的脚本。 请参阅 清单格式
    • inject_js_end {String} 可选 在文档对象加载后、onload 事件触发之前注入的脚本。 请参阅 清单格式
    • id {String} 可选 用于标识窗口的 id。 这将用于记住窗口的大小和位置,并在以后打开具有相同 id 的窗口时恢复该几何形状。 另请参阅 Chrome 应用文档
  • callback(win) {Function} 可选 打开的原生 Window 对象的回调

打开一个新窗口并在其中加载 url

注意

您应该等待窗口的 loaded 事件,然后再与任何组件进行交互。

焦点

默认情况下,打开的窗口不会获得焦点。 如果希望它默认获得焦点,可以在 options 中将 focus 设置为 true

win.window

获取原生窗口的对应 DOM 窗口对象。

win.x

win.y

获取或设置窗口框架到屏幕的左/上偏移量。

win.width

win.height

获取或设置窗口的大小,包括窗口框架。

win.title

获取或设置窗口的标题。

win.menu

获取或设置窗口的菜单栏。 使用类型为 menubar 的菜单设置。 当 win.menu 设置为 null 时,菜单栏将完全从 Windows 和 Linux 中删除,并且菜单栏将在 Mac 上被清除。

请参阅 自定义菜单栏 以了解菜单栏的用法。 另请参阅 菜单菜单项 以了解详细的 API。

win.isAlwaysOnTop

获取窗口是否始终置顶。

win.isFullscreen

获取是否处于全屏模式。

win.isTransparent

获取是否开启透明度。

win.isKioskMode

获取是否处于 Kiosk 模式。

win.zoomLevel

获取或设置页面缩放比例。0 表示正常大小;正值表示放大;负值表示缩小。

win.cookies.*

包含多个用于操作 Cookie 的函数。API 定义与 Chrome 扩展程序 相同。NW.js 支持 getgetAllremoveset 方法;onChanged 事件(支持该事件的 addListenerremoveListener 函数)。

Chrome 扩展程序 API 中与 CookieStore 相关的任何内容都不支持,因为 NW.js 应用中只有一个全局 Cookie 存储。

win.moveTo(x, y)

  • x {Integer} 屏幕左侧的偏移量
  • y {Integer} 屏幕顶部的偏移量

将窗口的左边缘和上边缘移动到指定的坐标。

win.moveBy(x, y)

  • x {Integer} 水平偏移量
  • y {Integer} 垂直偏移量

将窗口相对于其当前坐标移动指定的像素数。

win.resizeTo(width, height)

  • width {Integer} 窗口的内部宽度
  • height {Integer} 窗口的内部高度

将窗口调整为指定的 widthheight

win.setInnerWidth(width)

  • width {Integer} 窗口的内部宽度

win.setInnerHeight(height)

  • height {Integer} 窗口的内部高度

win.resizeBy(width, height)

  • width {Integer} 窗口的偏移宽度
  • height {Integer} 窗口的偏移高度

按指定量调整窗口大小。

win.focus()

将焦点设置到窗口上。

win.blur()

移走焦点。通常它会将焦点移动到应用程序的其他窗口,因为在某些平台上没有模糊的概念。

win.show([is_show])

  • is_show {Boolean} 可选 指定窗口是否应该显示或隐藏。默认设置为 true

如果窗口未显示,则显示窗口。

show(false)hide() 的效果相同。

焦点

show 在某些平台上不会将焦点设置到窗口上,因此如果需要,您需要调用 focus

win.hide()

隐藏窗口。隐藏后,用户将无法找到窗口。

win.close([force])

  • force {Boolean} 指定是否强制关闭窗口并绕过 close 事件。

关闭当前窗口。您可以通过监听 close 事件来阻止关闭。如果指定了 force 并等于 true,则会忽略 close 事件。

通常您希望监听 close 事件并执行一些关闭工作,然后执行 close(true) 来真正关闭窗口。

win.on('close', function () {
  this.hide(); // Pretend to be closed already
  console.log("We're closing...");
  this.close(true); // then close it forcefully
});

win.close(); // Would be detected by the above close event. To skip the above close event use win.close(true);

win.reload()

重新加载当前窗口。

win.reloadDev()

从头开始新的渲染器进程,重新加载当前页面。

win.reloadIgnoringCache()

reload() 相似,但不使用缓存(也称为“shift-reload”)。

win.maximize()

在 GTK 和 Windows 上最大化窗口,在 Mac OS X 上缩放窗口。

win.unmaximize()

已弃用

此功能自 0.13.0 版本起已弃用。现在已由 restore 事件 替换。请参阅 从 0.12 迁移到 0.13 的迁移说明

取消最大化窗口,即 maximize() 的反操作。

win.minimize()

在 Windows 上将窗口最小化到任务栏,在 GTK 上将窗口图标化,在 Mac OS X 上将窗口最小化。

win.restore()

在窗口最小化后将窗口恢复到先前状态,即 minimize() 的反操作。它没有命名为 unminimize,因为 restore 是常用的。

win.enterFullscreen()

使窗口全屏。

注意

此函数与 HTML5 全屏 API 不同,HTML5 全屏 API 可以使页面的一部分全屏,Window.enterFullscreen() 仅使整个窗口全屏。

win.leaveFullscreen()

退出全屏模式。

win.toggleFullscreen()

切换全屏模式。

win.enterKioskMode()

进入 Kiosk 模式。在 Kiosk 模式下,应用程序将全屏显示,并尝试阻止用户离开应用程序,因此您应该记住在应用程序中提供退出 Kiosk 模式的途径。此模式主要用于公共显示器上的演示。

win.leaveKioskMode()

退出 Kiosk 模式。

win.toggleKioskMode()

切换 Kiosk 模式。

win.setTransparent(transparent)

已弃用

此功能自 0.13.0 版本起已弃用。请参阅 从 0.12 迁移到 0.13 的迁移说明

  • transparent {Boolean} 是否将窗口设置为透明

开启/关闭透明度支持。有关更多信息,请参阅 透明窗口

win.setShadow(shadow) (Mac)

  • shadow {Boolean} 窗口是否具有阴影

开启/关闭窗口的原生阴影。对于无边框、透明窗口很有用。

win.showDevTools([iframe], [callback])

注意

此 API 仅在 SDK 构建版本中可用。

行为变更

该函数的行为自 0.13.0 版本起已更改。请参阅 从 0.12 迁移到 0.13 的迁移说明

  • iframe {String}{HTMLIFrameElement} 可选 要在其上进行限制的 <iframe> 的 ID 或元素。默认情况下,DevTools 将显示在整个窗口中。
  • callback(dev_win) {Function} 使用 DevTools 窗口的原生窗口的回调。

打开 Devtools 以检查窗口。

可选的 iframe 作为 String 应为窗口中任何 <iframe> 元素的 id 属性的值。它将 DevTools 限制为仅检查 <iframe>。如果它是一个空字符串,则此功能无效。

可选的 iframe 作为 HTMLIFrameElement 应该是 iframe 对象。它与 id 参数的作用相同。

此函数通过回调返回一个 Window 对象。您可以使用 Window 的任何属性和方法,除了事件。

另请参见 webview 参考,了解如何在 webview 中打开 DevTools 或在 webview 中打开 DevTools。

win.closeDevTools()

注意

此 API 仅在 SDK 构建版本中可用。

关闭开发者工具窗口。

win.getPrinters(callback)

枚举系统中的打印机。回调函数将接收一个包含打印机信息的 JSON 对象数组。JSON 对象的设备名称可以用作 nw.Window.print() 中的参数。

win.isDevToolsOpen()

注意

此 API 仅在 SDK 构建版本中可用。

查询开发者工具窗口的状态。

另请参见 win.showDevTools().

win.print(options)

打印窗口中的网页内容,无论是否需要用户交互。options 是一个包含以下字段的 JSON 对象

  • autoprint {Boolean} 是否无需用户交互即可打印;可选,默认值为 true
  • silent {Boolean} 隐藏闪烁的打印预览对话框;可选,默认值为 false
  • printer {String}nw.Window.getPrinters() 返回的打印机的设备名称;打印到 PDF 时无需设置此项
  • pdf_path {String} 打印到 PDF 时输出 PDF 的路径
  • headerFooterEnabled {Boolean} 是否启用页眉和页脚
  • landscape {Boolean} 是否使用横向或纵向
  • mediaSize {JSON Object} 纸张尺寸规格
  • shouldPrintBackgrounds {Boolean} 是否打印 CSS 背景
  • marginsType {Integer} 0 - 默认;1 - 无边距;2 - 最小;3 - 自定义,请参见 marginsCustom
  • marginsCustom {JSON Object} 自定义边距设置;单位为点。
  • copies {Integer} 打印的份数。
  • scaleFactor {Integer} 缩放比例;100 为默认值。
  • headerString {String} 用于替换页眉中 URL 的字符串。
  • footerString {String} 用于替换页脚中 URL 的字符串。

marginsCustom 示例:"marginsCustom":{"marginBottom":54,"marginLeft":70,"marginRight":28,"marginTop":32}
mediaSize 示例:'mediaSize':{'name': 'CUSTOM', 'width_microns': 279400, 'height_microns': 215900, 'custom_display_name':'Letter', 'is_default': true}

注意:如果未传递任何选项,则应调用 win.print({})

win.setMaximumSize(width, height)

  • width {Integer} 窗口的最大宽度
  • height {Integer} 窗口的最大高度

设置窗口的最大尺寸。

win.setMinimumSize(width, height)

  • width {整数} 窗口的最小宽度
  • height {整数} 窗口的最小高度

设置窗口的最小尺寸。

win.setResizable(resizable)

  • resizable {布尔值} 窗口是否可以调整大小

设置窗口是否可调整大小。

win.setAlwaysOnTop(top)

  • top {布尔值} 窗口是否应始终位于最上面

将小部件设置为位于窗口系统中所有其他窗口的顶部。

win.setVisibleOnAllWorkspaces(visible) (Mac 和 Linux)

  • visible {布尔值} 窗口是否应在所有工作区中可见

对于支持多个工作区的平台(目前为 Mac OS X 和 Linux),这允许 NW.js 窗口同时在所有工作区中可见。

win.canSetVisibleOnAllWorkspaces() (Mac 和 Linux)

返回一个布尔值,指示平台(目前为 Mac OS X 和 Linux)是否支持 Window API 方法 setVisibleOnAllWorkspace(Boolean)

win.setPosition(position)

  • position {字符串} 窗口的位置。有三个有效位置:nullcentermouse

将窗口移动到指定位置。目前,只有 center 在所有平台上受支持,它会将窗口置于屏幕中央。

win.setShowInTaskbar(show)

  • show {布尔值} 是否在任务栏中显示

控制是否在任务栏或停靠栏中显示窗口。另请参见 清单格式 中的 show_in_taskbar

win.requestAttention(attension)

  • attension {布尔值}{整数} 如果是布尔值,则表示请求或取消用户的关注。如果是整数,则表示窗口闪烁的次数。

通过使窗口在任务栏中闪烁来请求用户的关注。

Mac

在 Mac 上,值 < 0 将触发 NSInformationalRequest,而值 > 0 将触发 NSCriticalRequest

win.capturePage(callback [, config ])

  • callback {函数} 完成捕获窗口时的回调
  • config {字符串}{对象} 可选 如果是字符串,请参见 config.format 以获取有效值。
    • format {字符串} 可选 用于生成图像的图像格式。它支持两种格式:"png""jpeg"。如果忽略,则默认为 "jpeg"
    • datatype {字符串} 它支持三种类型:"raw""buffer""datauri"。如果忽略,则默认为 "datauri"

捕获窗口的可见区域。要捕获整个页面,请参见 win.captureScreenshot

rawdatauri

"raw" 仅包含 Base64 编码的图像。但 "datauri" 还包含 mime 类型标头,并且可以直接分配给 Imagesrc 以加载图像。

示例用法

// png as base64string
win.capturePage(function(base64string){
 // do something with the base64string
}, { format : 'png', datatype : 'raw'} );

// png as node buffer
win.capturePage(function(buffer){
 // do something with the buffer
}, { format : 'png', datatype : 'buffer'} );

win.captureScreenshot(options [, callback])

当省略 callback 时,将返回一个 Promise,它将使用回调的 data 参数解析。

  • callback {Function} 可选 捕获窗口完成后调用的回调函数。它将使用以下参数调用:
    • err null 表示成功;{String} 表示错误消息,表示失败。
    • data {String} base64 编码的图像
  • options {Object}
    • fullSize {Boolean} 可选 捕获超出可见区域的整个页面。目前,Chromium 捕获的图像高度限制为 16384 像素。
    • format {String} 可选 用于生成图像的图像格式。它支持两种格式:"png""jpeg""png" 是默认格式。
    • quality {Integer} 可选 压缩质量,范围为 [0..100](仅限 jpeg)。
    • clip {Object} 可选 仅捕获给定区域的屏幕截图。该对象的属性为:
    • x: {Number} 设备无关像素 (dip) 中的 X 偏移量。
    • y: {Number} 设备无关像素 (dip) 中的 Y 偏移量。
    • width: {Number} 设备无关像素 (dip) 中的矩形宽度。
    • height: {Number} 设备无关像素 (dip) 中的矩形高度。
    • scale: {Number} 页面缩放比例。

捕获窗口。它可以用来捕获超出可见区域的整个页面。

注意

此 API 处于实验阶段,将来可能会发生变化。

示例用法

          win.captureScreenshot({fullSize: true}, (err, data) => {
            if (err) {
              alert(err.message);
              return;
            }
            var image = new Image();
            image.src = 'data:image/jpg;base64,' + data;
            document.body.appendChild(image);
          });

win.setProgressBar(progress)

  • progress {Float} 有效值在 [0, 1] 之间。设置为负值 (<0) 将删除进度条。

Linux

仅支持 Ubuntu,您需要通过 NW_DESKTOP 环境变量指定应用程序的 .desktop 文件。如果未找到 NW_DESKTOP 环境变量,则默认使用 nw.desktop

win.setBadgeLabel(label)

在任务栏或停靠栏中的窗口图标上设置徽章标签。

Linux

此 API 仅在 Ubuntu 上受支持,标签仅限于字符串数字。您还需要为您的应用程序指定 .desktop 文件(请参阅有关 setProgressBar 的说明)。

win.eval(frame, script)

  • frame {HTMLIFrameElement} 要在其中执行的框架。如果 iframenull,则假定在当前窗口/框架中。
  • script {String} 要执行的脚本的源代码

在框架中执行一段 JavaScript 代码。

win.evalNWBin(frame, path)

  • frame {HTMLIFrameElement} 要在其中执行的框架。如果 iframenull,则假定在当前窗口/框架中。
  • path {String|ArrayBuffer|Buffer}nwjc 生成的二进制文件的路径或 BufferArrayBuffer

在框架中加载并执行编译后的二进制文件。请参阅 保护 JavaScript 源代码

win.evalNWBinModule(frame, path, module_path)

实验性

此 API 在未来版本中可能会发生变化,因为我们正在探索更好的支持此功能的方法。 在此讨论

  • frame {HTMLIFrameElement} 要在其中执行的框架。如果 iframenull,则假定在当前窗口/框架中。
  • path {String|ArrayBuffer|Buffer}nwjc 生成的二进制文件的路径或 BufferArrayBuffer
  • module_path {String} 与当前文档相关的模块 URL。它将用于 解析模块说明符

加载并执行框架中模块的编译二进制文件。二进制文件应使用 nwjc --nw-module 编译。以下代码将加载 lib.bin 作为模块,其他模块可以使用类似 import * from './lib.js' 的方式引用它。

nw.Window.get().evalNWBinModule(null, 'lib.bin', 'lib.js');

win.removeAllListeners([eventName])

删除所有监听器,或指定 eventName 的监听器。

事件: close

close 事件是一个特殊事件,它会影响 Window.close() 函数的结果。如果开发者监听窗口的 close 事件,Window.close() 会发出 close 事件而不关闭窗口。

通常,您会在 close 事件的回调中执行一些关闭工作,然后调用 this.close(true) 来真正关闭窗口,这样就不会再次捕获到它。忘记在回调中调用 this.close() 时添加 true 会导致无限循环。

如果关闭工作需要一些时间,用户可能会觉得应用程序退出速度很慢,这是一种糟糕的体验,因此您可以在 close 事件中隐藏窗口,然后再真正关闭它,以提供流畅的用户体验。

有关 close 事件用法的示例代码,请参见 上面的 win.close(true)

Mac

在 Mac 上,会将一个参数传递给回调,指示它是通过 +Q 关闭的。如果为真,它将设置为字符串 quit,否则为 undefined

事件: closed

closed 事件在相应的窗口关闭后发出。通常您无法获得此事件,因为窗口关闭后所有 js 对象都将被释放。但它在另一个窗口中监听窗口的事件时很有用,另一个窗口的对象不会被释放。

// Open a new window.
nw.Window.open('popup.html', {}, function (win) {
  // Release the 'win' object here after the new window is closed.
  win.on('closed', function () {
    win = null;
  });

  // Listen to main window's close event
  nw.Window.get().on('close', function () {
    // Hide the window to give user the feeling of closing immediately
    this.hide();

    // If the new window is still open then close it.
    if (win !== null) {
      win.close(true);
    }

    // After closing the new window, close the main window.
    this.close(true);
  });
});

事件: loading

当窗口开始重新加载时发出,通常您无法捕获此事件,因为通常它是在您实际设置回调之前发出的。

您唯一可以捕获此事件的情况是,当您刷新窗口并在另一个窗口中监听此事件时。

事件: loaded

当窗口完全加载时发出,此事件的行为与window.onload相同,但不依赖于DOM。

事件: document-start(frame)

  • frame {HTMLIFrameElement} 是 iframe 对象,如果事件是针对窗口,则为 null

当此窗口或子 iframe 中的文档对象可用时发出,在所有文件加载后,但在 DOM 构造或任何脚本运行之前发出。
它不会在使用 nw.Window.open() 创建的新窗口上触发:该函数的回调将在与该事件相同的点触发。

请参阅 清单格式 中的 inject_js_start

事件: document-end(frame)

  • frame {HTMLIFrameElement} 是 iframe 对象,如果事件是针对窗口,则为 null

当此窗口或子 iframe 中的文档对象卸载时发出,但在发出 onunload 事件之前发出。

请参阅 清单格式 中的 inject_js_end

事件: focus

当窗口获得焦点时发出。

事件: blur

当窗口失去焦点时发出。

事件: minimize

当窗口最小化时发出。

事件: restore

行为变更

该函数的行为自 0.13.0 版本起已更改。请参阅 从 0.12 迁移到 0.13 的迁移说明

当窗口从最小化、最大化和全屏状态恢复时发出。

事件: maximize

当窗口最大化时发出。

事件: move(x, y)

窗口移动后发出。回调将调用两个参数:(x, y) 用于窗口左上角的新位置。

事件: resize(width, height)

窗口调整大小后发出。回调将调用两个参数:(width, height) 用于窗口的新大小。

事件: enter-fullscreen

当窗口进入全屏状态时发出。

事件: leave-fullscreen

已弃用

此功能自 0.13.0 版本起已弃用。现在已由 restore 事件 替换。请参阅 从 0.12 迁移到 0.13 的迁移说明

当窗口退出全屏状态时发出。

事件: zoom

当窗口缩放更改时发出。它有一个参数指示新的缩放级别。有关参数的值定义,请参阅 win.zoom() 方法

事件: capturepagedone

已弃用

此功能自 0.13.0 起已弃用。请改用 win.capturePage() 的回调。请参阅 从 0.12 迁移到 0.13 的迁移说明

在调用 capturePage 方法并准备好图像数据后发出。有关参数的值定义,请参阅 win.capturePage() 回调函数。

事件: devtools-opened(url)

已弃用

此功能自 0.13.0 起已弃用。请改用传递给 win.showDevtoolscallback。请参阅 从 0.12 迁移到 0.13 的迁移说明

有关更多详细信息,请参阅 win.showDevTools() 方法

事件: devtools-closed

在关闭 Devtools 后发出。

有关更多详细信息,请参阅 win.closeDevTools() 方法

事件: new-win-policy (frame, url, policy)

  • frame {HTMLIFrameElement} 是请求来自的子 iframe 的对象,如果来自顶层窗口,则为 null
  • url {String} 是请求链接的地址
  • policy {Object} 是一个包含以下方法的对象
    • ignore() : 忽略请求,不会发生导航。
    • forceCurrent() : 强制链接在同一框架中打开
    • forceDownload() : 强制链接可下载,或由外部程序打开
    • forceNewWindow() : 强制链接在新窗口中打开
    • forceNewPopup() : 强制链接在新弹出窗口中打开
    • setNewWindowManifest(m) : 控制新弹出窗口的选项。对象 m 的格式与清单格式中的 窗口子字段 相同。

当从当前窗口或子 iframe 请求新窗口时发出。您可以在回调中调用 policy.* 方法来更改打开新窗口的默认行为。

例如,当用户尝试在新窗口中打开时,您可以在系统浏览器中打开 URL

nw.Window.get().on('new-win-policy', function(frame, url, policy) {
  // do not open the window
  policy.ignore();
  // and open it in external browser
  nw.Shell.openExternal(url);
});

事件: navigation (frame, url, policy)

  • frame {HTMLIFrameElement} 是请求来自的子 iframe 的对象,如果来自顶层窗口,则为 null
  • url {String} 是请求链接的地址
  • policy {Object} 是一个包含以下方法的对象
    • ignore() : 忽略请求,不会发生导航。

在导航到另一个页面时发出。类似于 new-win-policy,您可以在回调中调用 policy.ignore() 来忽略导航。