HTML 也能开发桌面软件之 NW.js 中的 Window 窗体类
myzbx 2024-12-07 15:14 13 浏览
01)NW.js 是什么?
02)NW.js 中的配置指南
03)NW.js 中的 App 应用程序类
在之前的系列教程中,我们分别为大家介绍了 NW.js 的下载安装基本使用 以及 配置指南 以及 应用程序 `App` 类的介绍。
下面我们继续来为大家介绍 NW.js 中的 Window 类。Window 类是 NW.js 框架对窗口或者窗体的抽象、封装的类,其中定义了各种成员属性、方法 以及 事件,可以让我们对窗体相关的进行各种操作。
下面是该类的成员明细:
类的明细
属性明细
属性名 | 描述 |
win.window | 获取原生的DOM window对象 |
win.x | 窗口的X坐标 |
win.y | 窗口的Y坐标 |
win.width | 窗口的宽度 |
win.height | 窗口的高度 |
win.title | 窗口的标题 |
win.menu | 窗口的菜单栏对象 |
win.isAlwaysOnTop | 窗口是否总在最前 |
win.isFullscreen | 窗口是否处于全屏模式 |
win.isTransparent | 窗口是否透明 |
win.isKioskMode | 窗口是否处于kiosk模式 |
win.zoomLevel | 窗口的缩放级别 |
win.cookies.* | 访问窗口的cookie |
方法明细
方法名 | 描述 |
Window.get([window_object]) | 获取指定窗口对象的Window实例 |
Window.getAll(callback) | 获取所有窗口的Window实例 |
Window.open(url, [options], [callback]) | 打开一个新窗口 |
win.moveTo(x, y) | 移动窗口到指定位置 |
win.moveBy(x, y) | 相对当前位置移动窗口 |
win.resizeTo(width, height) | 调整窗口大小到指定尺寸 |
win.setInnerWidth(width) | 设置窗口内部宽度 |
win.setInnerHeight(height) | 设置窗口内部高度 |
win.resizeBy(width, height) | 相对当前大小调整窗口尺寸 |
win.focus() | 使窗口获得焦点 |
win.blur() | 使窗口失去焦点 |
win.show([is_show]) | 显示窗口 |
win.hide() | 隐藏窗口 |
win.close([force]) | 关闭窗口 |
win.reload() | 重新加载窗口 |
win.reloadDev() | 重新加载窗口(开发模式) |
win.reloadIgnoringCache() | 忽略缓存重新加载窗口 |
win.maximize() | 最大化窗口 |
win.unmaximize() | 取消最大化窗口 |
win.minimize() | 最小化窗口 |
win.restore() | 恢复窗口 |
win.enterFullscreen() | 进入全屏模式 |
win.leaveFullscreen() | 退出全屏模式 |
win.toggleFullscreen() | 切换全屏模式 |
win.enterKioskMode() | 进入kiosk模式 |
win.leaveKioskMode() | 退出kiosk模式 |
win.toggleKioskMode() | 切换kiosk模式 |
win.setTransparent(transparent) | 设置窗口透明度 |
win.setShadow(shadow) (Mac) | 设置窗口阴影(仅适用于Mac) |
win.showDevTools([iframe], [callback]) | 显示开发者工具 |
win.closeDevTools() | 关闭开发者工具 |
win.getPrinters(callback) | 获取可用打印机列表 |
win.isDevToolsOpen() | 检查开发者工具是否打开 |
win.print(options) | 打印窗口内容 |
win.setMaximumSize(width, height) | 设置窗口最大尺寸 |
win.setMinimumSize(width, height) | 设置窗口最小尺寸 |
win.setResizable(resizable) | 设置窗口是否可调整大小 |
win.setAlwaysOnTop(top) | 设置窗口是否总在最前 |
win.setVisibleOnAllWorkspaces(visible) (Mac and Linux) | 设置窗口是否在所有工作区可见(仅适用于Mac和Linux) |
win.canSetVisibleOnAllWorkspaces() (Mac and Linux) | 检查是否可以设置窗口在所有工作区可见(仅适用于Mac和Linux) |
win.setPosition(position) | 设置窗口位置 |
win.setShowInTaskbar(show) | 设置窗口是否在任务栏显示 |
win.requestAttention(attension) | 请求用户注意(如闪烁任务栏图标) |
win.capturePage(callback [, config ]) | 捕获窗口页面截图 |
win.captureScreenshot(options [, callback]) | 捕获窗口屏幕截图 |
win.setProgressBar(progress) | 设置任务栏进度条 |
win.setBadgeLabel(label) | 设置应用程序标记标签 |
win.eval(frame, script) | 在指定框架中执行JavaScript代码 |
win.evalNWBin(frame, path) | 在指定框架中执行NW.js二进制文件 |
win.evalNWBinModule(frame, path, module_path) | 在指定框架中执行NW.js二进制模块 |
win.removeAllListeners([eventName]) | 移除所有或指定事件的监听器 |
事件明细
事件名 | 描述 |
close | 窗口关闭时触发 |
closed | 窗口完全关闭后触发 |
loading | 窗口开始加载时触发 |
loaded | 窗口加载完成时触发 |
document-start(frame) | 文档开始加载时触发,参数为相关框架 |
document-end(frame) | 文档加载结束时触发,参数为相关框架 |
focus | 窗口获得焦点时触发 |
blur | 窗口失去焦点时触发 |
minimize | 窗口最小化时触发 |
restore | 窗口从最小化状态恢复时触发 |
maximize | 窗口最大化时触发 |
move(x, y) | 窗口移动时触发,参数为新的坐标 |
resize(width, height) | 窗口大小改变时触发,参数为新的尺寸 |
enter-fullscreen | 进入全屏模式时触发 |
leave-fullscreen | 离开全屏模式时触发 |
zoom | 窗口缩放级别变化时触发 |
capturepagedone | 页面截图完成时触发 |
devtools-opened(url) | 开发者工具打开时触发,参数为开发者工具的URL |
devtools-closed | 开发者工具关闭时触发 |
new-win-policy (frame, url, policy) | 新窗口策略事件,用于控制如何打开新窗口 |
navigation (frame, url, policy) | 导航事件,用于控制页面导航行为 |
基本实例
接下来我们分别用几个实例来演示属性、方法 以及 事件的基本使用。
属性实例
代码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="UTF-8">
<title>NW.js 窗口属性示例</title>
</head>
<body>
<h1>NW.js 窗口属性示例</h1>
<div id="win-window">win.window:</div>
<hr>
<div id="win-x">win.x:</div>
<hr>
<div id="win-y">win.y:</div>
<hr>
<div id="win-width">win.width:</div>
<hr>
<div id="win-height">win.height:</div>
<hr>
<div id="win-title">win.title:</div>
<hr>
<div id="win-menu">win.menu:</div>
<hr>
<div id="win-isAlwaysOnTop">win.isAlwaysOnTop:</div>
<hr>
<div id="win-isFullscreen">win.isFullscreen:</div>
<hr>
<div id="win-isTransparent">win.isTransparent:</div>
<hr>
<div id="win-isKioskMode">win.isKioskMode:</div>
<hr>
<div id="win-zoomLevel">win.zoomLevel:</div>
<hr>
<div id="win-cookies">win.cookies:</div>
<hr>
<script>
// 获取属性值的安全函数
function safeGetProperty(obj, prop) {
try {
// 先判断属性是否存在于对象的自身属性或原型链中
if (prop in obj) {
return obj[prop] !== undefined ? obj[prop] : 'Undefined';
} else {
return 'Undefined';
}
} catch (error) {
return 'Undefined';
}
}
const win = nw.Window.get();
// 自动打开开发者工具
// win.showDevTools();
// 使用安全函数获取并输出每个属性的值
document.getElementById('win-window').textContent += ` ${safeGetProperty(win, 'window')}`;
document.getElementById('win-x').textContent += ` ${safeGetProperty(win, 'x')}`;
document.getElementById('win-y').textContent += ` ${safeGetProperty(win, 'y')}`;
document.getElementById('win-width').textContent += ` ${safeGetProperty(win, 'width')}`;
document.getElementById('win-height').textContent += ` ${safeGetProperty(win, 'height')}`;
document.getElementById('win-title').textContent += ` ${safeGetProperty(win, 'title')}`;
document.getElementById('win-menu').textContent += ` ${safeGetProperty(win, 'menu')}`;
document.getElementById('win-isAlwaysOnTop').textContent += ` ${safeGetProperty(win, 'isAlwaysOnTop')}`;
document.getElementById('win-isFullscreen').textContent += ` ${safeGetProperty(win, 'isFullscreen')}`;
document.getElementById('win-isTransparent').textContent += ` ${safeGetProperty(win, 'isTransparent')}`;
document.getElementById('win-isKioskMode').textContent += ` ${safeGetProperty(win, 'isKioskMode')}`;
document.getElementById('win-zoomLevel').textContent += ` ${safeGetProperty(win, 'zoomLevel')}`;
// 特别处理 cookies 作为一个对象
safeGetProperty(win, 'cookies') !== 'Undefined' && win.cookies.getAll({}, function(cookies) {
document.getElementById('win-cookies').textContent += ` ${cookies.length > 0 ? JSON.stringify(cookies, null, 2) : '无 cookie'}`;
});
</script>
</body>
</html>
截图:
方法实例
01)打开关闭
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>启动窗体</title>
</head>
<body>
<h1>启动窗体</h1>
<p>点击下方按钮打开第二个窗体。</p>
<button onclick="openWindow()">打开 second.html</button>
<script>
function openWindow() {
nw.Window.open('second.html', {
width: 400,
height: 300,
focus: true
});
}
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Second Window</title>
</head>
<body>
<h1>Second Window</h1>
<p>点击下方按钮尝试关闭窗体。</p>
<button onclick="closeWindow()">关闭当前窗体</button>
<script>
function closeWindow() {
let result = confirm("您确定要关闭当前窗体吗?");
if (result) {
nw.Window.get().close();
} else {
alert("您取消了窗体关闭操作");
}
}
</script>
</body>
</html>
02)窗体传值
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>启动窗体</title>
</head>
<body>
<h1>启动窗体</h1>
<p>点击下方按钮打开第二个窗体。</p>
<button onclick="openWindow()">打开 second.html</button>
<p>来自 second.html 的文本:</p>
<p id="receivedText">尚无文本</p>
<script>
function openWindow() {
nw.Window.open('second.html', {
width: 400,
height: 300,
focus: true
}, function(win) {
// 打开控制台以便调试
win.showDevTools();
});
}
// 主窗口接收消息并处理
window.addEventListener('message', function(event) {
console.log('接收到的消息:', event.data);
document.getElementById('receivedText').innerText = event.data;
});
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Second Window</title>
</head>
<body>
<h1>Second Window</h1>
<p>在下方输入文本:</p>
<textarea id="textInput" rows="4" cols="50"></textarea>
<script>
const textInput = document.getElementById('textInput');
// 打开控制台以便调试
nw.Window.get().showDevTools();
// 监听文本框的输入事件
textInput.addEventListener('input', function() {
// 使用 postMessage 将文本内容发送到父窗口
// * 是一个通配符,用于指定消息可以发送到的目标源(origin)。
// 它表示允许消息发送到任意源
window.opener.postMessage(textInput.value, '*');
console.log('发送消息:', textInput.value);
});
</script>
</body>
</html>
事件实例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NW.js 事件演示</title>
</head>
<body>
<h1>NW.js 事件演示</h1>
<p>触发下列事件后,事件信息将显示在下方日志中:</p>
<div id="log"></div>
<script>
const logDiv = document.getElementById('log');
function logEvent(eventName, details) {
const message = `[${new Date().toLocaleTimeString()}] 事件: ${eventName} ${details || ''}`;
const logEntry = document.createElement('div');
logEntry.textContent = message;
logDiv.appendChild(logEntry);
}
// 获取当前窗口对象
const win = nw.Window.get();
// 事件绑定
win.on('close', () => logEvent('close'));
win.on('closed', () => logEvent('closed'));
win.on('loading', () => logEvent('loading'));
win.on('loaded', () => logEvent('loaded'));
win.on('document-start', (frame) => logEvent('document-start', `frame: ${frame}`));
win.on('document-end', (frame) => logEvent('document-end', `frame: ${frame}`));
win.on('focus', () => logEvent('focus'));
win.on('blur', () => logEvent('blur'));
win.on('minimize', () => logEvent('minimize'));
win.on('restore', () => logEvent('restore'));
win.on('maximize', () => logEvent('maximize'));
win.on('move', (x, y) => logEvent('move', `x: ${x}, y: ${y}`));
win.on('resize', (width, height) => logEvent('resize', `width: ${width}, height: ${height}`));
win.on('enter-fullscreen', () => logEvent('enter-fullscreen'));
win.on('leave-fullscreen', () => logEvent('leave-fullscreen'));
win.on('zoom', () => logEvent('zoom'));
win.on('capturepagedone', () => logEvent('capturepagedone'));
win.on('devtools-opened', (url) => logEvent('devtools-opened', `url: ${url}`));
win.on('devtools-closed', () => logEvent('devtools-closed'));
win.on('new-win-policy', (frame, url, policy) => logEvent('new-win-policy', `frame: ${frame}, url: ${url}, policy: ${policy}`));
win.on('navigation', (frame, url, policy) => logEvent('navigation', `frame: ${frame}, url: ${url}, policy: ${policy}`));
// 手动关闭窗口的事件处理,防止窗口直接关闭
win.on('close', function() {
logEvent('close');
this.hide(); // 隐藏窗口
console.log('Window is about to be closed');
setTimeout(() => {
logEvent('closed');
this.close(true); // 强制关闭窗口
}, 2000); // 模拟延迟操作
});
</script>
</body>
</html>
相关推荐
- Django零基础速成指南:快速打造带用户系统的博客平台
-
#python##服务器##API##编程##学习#不是所有教程都值得你花时间!这篇实战指南将用5分钟带你解锁Django核心技能,手把手教你从零搭建一个具备用户注册登录、文章管理功能的完整...
- iOS 17.0 Bootstrap 1.2.9 半越狱来啦!更新两点
-
这款Bootstrap半越狱工具终于更新,离上一次更新已相隔很久,现在推出1.2.9版本,主要为内置两点功能进行更新,也是提升半越狱的稳定性。如果你正在使用这款半越狱工具的,建议你更新。注意!...
- iOS 16.x Bootstrap 1.2.3 发布,支持运行清理工具
-
本文主要讲Bootstrap半越狱工具更新相关内容。如果你是iOS16.0至16.6.1和17.0系统的,想体验半越狱的果粉,请继续往下看。--知识点科普--Bootstrap...
- SpringBoot整合工作流引擎Acticiti系统,适用于ERP、OA系统
-
今日推荐:SpringBoot整合工作流引擎Acticiti的源码推荐理由:1、SpringBoot整合工作流引擎Acticiti系统2、实现了三级权限结构3、持久层使用了mybatis框架4、流程包...
- SpringCloud自定义Bootstrap配置指南
-
在SpringCloud中自定义Bootstrap配置需要以下步骤,以确保在应用启动的早期阶段加载自定义配置:1.添加依赖(针对新版本SpringCloud)从SpringCloud2020...
- Python使用Dash开发网页应用(三)(python网页开发教程)
-
PlotlyDash开发Web应用示例一个好的网页设计通常都需要编写css甚至js来定制前端内容,例如非常流行的bootstrap框架。我们既然想使用Dash来搭建web应用,很大的一个原因是不熟悉...
- Oxygen XML Editor 27.1 中的新功能
-
OxygenXMLEditor27.1版是面向内容作者、开发者、合作者和出版商的行业领先工具包的增量版本。在27.1版本中,AIPositronAssistant得到了增强,包括用于...
- 【LLM-多模态】Mini-Gemini:挖掘多模态视觉语言模型的潜力
-
一、结论写在前面论文提出了Mini-Gemini,一个精简而强大的多模态VLM框架。Mini-Gemini的本质在于通过战略性框架设计、丰富的数据质量和扩展的功能范围,发掘VLM的潜在能力。其核心是补...
- 谐云课堂 | 一文详解分布式改造理论与实战
-
01微服务与分布式什么是分布式?首先,我们对上图提到的部分关键词进行讲解。单体,是指一个进程完成全部的后端处理;水平拆分,是同一个后端多环境部署,他们都处理相同的内容,使用反向代理来均衡负载,这种也叫...
- 基于Abaqus的手动挡换挡机构可靠性仿真
-
手动挡,也称手动变速器,英文全称为Manualtransmission,简称MT,即用手拨动换挡操纵总成才能改变变速器内的齿轮啮合位置,改变传动比,从而达到变速的目的。家用轿车主要采用软轴连接的换挡...
- 【pytorch】目标检测:彻底搞懂YOLOv5详解
-
YOLOv5是GlennJocher等人研发,它是Ultralytics公司的开源项目。YOLOv5根据参数量分为了n、s、m、l、x五种类型,其参数量依次上升,当然了其效果也是越来越好。从2020...
- 超实用!50个非常实用的PS快捷键命令大全分享
-
今天,给大家介绍50个非常实用的快捷键命令大全,大家伙都是设计师,关于软件使用那是越快越好啊。一、常用的热键组合1、图层混合模式快捷键:正常(Shift+Option+N),正片叠底(Shif...
- Pohtoshop中深藏不露的小技巧(科目一考试技巧记忆口诀看完必过)
-
邢帅教育ps教程为大家总结了一些Pohtoshop中深藏不露的小技巧,可以帮助到大家在设计时减少不必要的麻烦,提高工作效率哦~~~1.设置网格线保持像素完美不在1:1分辨率下也能保持像素完美,可以...
- Ganglia监控安装总结(监控安装工作总结)
-
一、ganglia简介:Ganglia是一个跨平台可扩展的,高性能计算系统下的分布式监控系统,如集群和网格。它是基于分层设计,它使用广泛的技术,如XML数据代表,便携数据传输,RRDtool用于数据...
- 谁说Adobe XD做不出好看的设计?那是你没搞懂这些功能
-
AdobeXD的美化栏具有将设计视图美化的功能,它能使界面设计和原型设计更漂亮、更吸引眼球。美化栏的7个功能包括竖线布局设计、横线布局设计、重复网格、图形大小和位置设置、响应式调整大小、文字美化以及...
- 一周热门
- 最近发表
-
- Django零基础速成指南:快速打造带用户系统的博客平台
- iOS 17.0 Bootstrap 1.2.9 半越狱来啦!更新两点
- iOS 16.x Bootstrap 1.2.3 发布,支持运行清理工具
- SpringBoot整合工作流引擎Acticiti系统,适用于ERP、OA系统
- SpringCloud自定义Bootstrap配置指南
- Python使用Dash开发网页应用(三)(python网页开发教程)
- Oxygen XML Editor 27.1 中的新功能
- 【LLM-多模态】Mini-Gemini:挖掘多模态视觉语言模型的潜力
- 谐云课堂 | 一文详解分布式改造理论与实战
- 基于Abaqus的手动挡换挡机构可靠性仿真
- 标签列表
-
- HTML 基础教程 (29)
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 中级教程 (30)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)