Nodejs node-webkit窗口间通信的问题
Nodejs node-webkit窗口间通信的问题
node-webkit 打开(创建)的窗口 如何跟父窗口通信? postMessage 只能用于window.open 打开的窗口. gui.Window.open 打开的窗口找不到父级.无法用postMessage 请指点… 还有其他简单明了的方法吗.
在使用 Node-WebKit(现称为 NW.js)时,实现不同窗口间的通信是一个常见的需求。postMessage
方法通常用于标准的浏览器窗口间通信,但对于 gui.Window.open
打开的窗口,这种方法可能不起作用。不过,NW.js 提供了一些内置的方法来解决这个问题。
使用 NW.js 的 nw.Window
对象进行通信
在 NW.js 中,每个窗口都是一个 Window
对象,可以通过 nw.Window.get()
获取当前窗口对象,并通过 nw.Window.get().evalNWBin()
方法来执行 JavaScript 代码或发送消息到另一个窗口。
示例代码
- 打开新窗口
var gui = require('nw.gui');
var win = gui.Window.get();
// 打开一个新的窗口
var newWin = gui.Window.open('new_window.html', {
width: 400,
height: 300
});
// 监听新窗口加载完成事件
newWin.on('loaded', function() {
// 通过 evalNWBin 方法向新窗口发送消息
newWin.evalNWBin('myMsg', 'Hello from parent window!');
});
- 接收消息的新窗口
在 new_window.html
中:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>New Window</title>
<script>
var gui = require('nw.gui');
// 创建一个窗口对象
var newWin = gui.Window.get();
// 接收来自父窗口的消息
newWin.on('document-end', function() {
newWin.evalNWBin('myMsg', function(msg) {
console.log('Received message:', msg);
});
});
</script>
</head>
<body>
<h1>New Window</h1>
</body>
</html>
解释
gui.Window.open
: 用于打开一个新的窗口。newWin.on('loaded', ...)
: 监听新窗口加载完成事件,在新窗口加载完成后立即执行某些操作。newWin.evalNWBin
: 用于向新窗口发送消息或执行脚本。第一个参数是消息类型,第二个参数是实际的消息内容。newWin.evalNWBin('myMsg', function(msg) {...})
: 在新窗口中监听并处理来自父窗口的消息。
通过这种方式,您可以轻松地在 NW.js 应用中的不同窗口之间传递消息,而不需要依赖于 postMessage
。这种方法不仅简单,而且功能强大,适用于大多数 NW.js 应用场景。
用sock试试
那么太麻烦了. 最好用本身的api 就可以实现的.
如果不是new-instance的窗口的话可以通过node context互相访问。同一个进程内的窗口共享一个Node context。比如那些process, global, require对象都是位于node context里面。通过 require 加载的库也是。
这方面的例子太少了,可否提供一些出来!特别是窗口之间通讯和js执行的!
解决了.
请问怎么解决的,方便的话回复个邮件 113406790@qq.com 谢谢
在使用 node-webkit
(现称为 NW.js
)时,实现不同窗口之间的通信可以采用多种方法。虽然 postMessage
主要用于标准的浏览器环境,但 NW.js
提供了更强大的 API 来处理这种需求。
你可以使用 nw.gui.Window.get().evalNWBin()
方法来在不同的窗口之间发送消息。这种方法允许你在子窗口中执行 JavaScript 代码,从而实现与父窗口的通信。以下是一个简单的示例:
父窗口代码 (main.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Main Window</title>
</head>
<body>
<button id="open-child">Open Child Window</button>
<script>
document.getElementById('open-child').addEventListener('click', function() {
var child = window.open('child.html');
});
// 接收来自子窗口的消息
window.addEventListener('message', function(event) {
console.log('Message from child:', event.data);
});
</script>
</body>
</html>
子窗口代码 (child.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Child Window</title>
</head>
<body>
<script>
// 当页面加载完成后发送消息到父窗口
window.onload = function() {
var parentWindow = nw.Window.get();
parentWindow.evalNWBin('main.html', 'sendToParent', 'Hello from child!', function(result) {
console.log('Message sent to parent:', result);
});
};
</script>
</body>
</html>
NW.js 脚本 (index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>NW.js App</title>
</head>
<body>
<iframe src="main.html" style="display:none;"></iframe>
</body>
</html>
在这个例子中,当点击“Open Child Window”按钮时,会打开一个新的子窗口。子窗口会在加载完成后通过 evalNWBin
方法向父窗口发送一条消息。父窗口通过监听 message
事件来接收这条消息。
这种方法不仅简单,而且功能强大,适合于 NW.js
应用程序中的窗口间通信。