Nodejs node-webkit窗口间通信的问题

Nodejs node-webkit窗口间通信的问题

node-webkit 打开(创建)的窗口 如何跟父窗口通信? postMessage 只能用于window.open 打开的窗口. gui.Window.open 打开的窗口找不到父级.无法用postMessage 请指点… 还有其他简单明了的方法吗.

9 回复

在使用 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 代码或发送消息到另一个窗口。

示例代码

  1. 打开新窗口
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!');
});
  1. 接收消息的新窗口

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 谢谢

var zhailei = {}; var wins = gui.Window.open(‘http://192.168.1.73/groups/lite/’, { position: ‘right’, width: 480, height: 800, });

wins.on(‘document-start’,function(){ wins.window.window.zhailei = zhailei; })

这样两边的页面都可以访问zhailei这个对象了,里面就可以写方法,传参数了!!

在使用 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 应用程序中的窗口间通信。

回到顶部