使用节点js('nw.gui')将对象传递给其他窗口

我试图search某种方式来创build“窗口”的多个实例,然后使用一些消息传达这些窗口实例。 然后我碰到这里的链接 。 但是我不确定我们是否可以在运行时使用脚本传递一些对象。 任何帮助,将不胜感激。

谢谢

使用带有JSON.stringifyJSON.parse postMessage 。 您可以在node-webkit使用这些技术中的任何一种。 所以在当前的窗口中,您将事件侦听器添加到“消息”事件并打开新窗口:

第一个窗口

 var gui = require('nw.gui'); window.addEventListener('message', function(event) { var data = JSON.parse(event.data); console.log(data); }, false); var newWindow = gui.Window.open('/some/path'); 

在新打开的窗口中添加事件监听器到'message'事件:

新打开的窗口

 window.addEventListener('message', function(event) { var data = JSON.parse(event.data); console.log(data); }, false); 

现在,您可以使用postMessage在这两个窗口之间进行通信。 例如:

第一个窗口

 newWindow.window.postMessage(JSON.stringify({ some: 'very important data1' })); 

新打开的窗口

 window.opener.postMessage(JSON.stringify({ some: 'very important data2' })); 

nw.js在每个窗口对象上都有一个EventEmmitter。

 // mainWindow.html var gui = require('nw.gui'); var newWindow = gui.Window.open('test.html'); var yourObject = {msg: "lorem ipsum"} newWindow.emit("testEvent", yourObject); // test.html var gui = require('nw.gui'); var win = gui.Window.get(); win.on("testEvent", function(data) { console.log(data.msg); // lorem ipsum }); 

我最深的歉意alexpods但stackoverflow不会让我添加一个评论,所以相反,我必须解除您的整个答案,并作出修改。

在nw.js中(至多?)0.19.0,不再有效,返回gui.Window.open的处理程序不起作用,.postMessage需要2个参数。

所以这里是一个更新的答案,alexpods的修改版本(因为我不能添加评论给他的答案)。 也谢谢你的答案alexpods,因为它绝对帮助了我。


使用带有JSON.stringify和JSON.parse的postMessage。 您可以在node-webkit中使用这些技术中的任何一种。 所以在当前的窗口中,您将事件侦听器添加到“消息”事件并打开新窗口:

第一个窗口

 var gui = require('nw.gui'); var newWindow; //we declare a global variable to store the handler for our new window window.addEventListener('message', function(event) { var data = JSON.parse(event.data); console.log(data); }, false); gui.Window.open('/some/path', {}, function(newWin) { newWindow = newWin; newWindow.on ('loaded', function(){ //We only post a message when the new window is ready to listen to events. newWindow.window.postMessage(JSON.stringify({ some: 'very important data1' }), "*"); //the second parameter specifies the message origin. afaik, this is merely a string and has no effect beyond being there }); }); 

在新打开的窗口中添加事件监听器到'message'事件:

新打开的窗口

 window.addEventListener('message', function(event) { var data = JSON.parse(event.data); console.log(data); }, false); 

现在,您可以使用postMessage在这两个窗口之间进行通信。 例如:

第一个窗口

您会注意到上面显示的postMessage被封装在一个“加载”事件中,该事件本身被包装在一个onComplete事件中。 这是因为不能保证在被调用的时候,newWindow已经准备好接收事件,或者已经分配了窗口句柄。 如果你不想把代码放在那里,你可能至less要检查窗口是否已经创build。

 if (typeof(newWindow) != 'undefined') { if (newWindow.window.document.readyState == "complete") { newWindow.window.postMessage(JSON.stringify({ some: 'very important data1' }), "*"); } } 

新打开的窗口

 window.opener.postMessage(JSON.stringify({ some: 'very important data2' }), "*");