Node-Webkit在不同的窗口中启动功能

ape*_*xys 5 javascript node.js node-webkit

我的node-webkit应用程序包含一个控制窗口和一个演示窗口.

控制窗口收集数据并最终通过该window.open功能启动演示窗口.

现在,演示窗口可以访问global变量中的一些信息.

现在我想通过创建SVG元素等来呈现该信息的图形表示.

我已经有一个javascript函数来完成这个,但我需要一些从控制窗口启动该函数的方法.

我不能直接调用它,因为那时函数必须访问其他窗口的DOM.

我已经尝试eval在其他窗口的对象上使用该函数,但是该消息使node-webkit崩溃

[18719:0522/205047:ERROR:breakpad_linux.cc(1225)] crash dump file written to 
/tmp/chromium-renderer-minidump-788bf8d0c68301d5.dmp
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?

使用setInterval要定期检查一个全局变量?

got*_*les 3

我发现一种非常有效的解决方案是将发布/订阅功能附加到global变量。到目前为止我使用的设置是基于 jQuery 的,尽管它也可以在没有 jQuery 的情况下构建。首先使用此代码的变体对其进行初始化:

    var messages = messages || {};
    global.Message = global.Message || function( id ) {
      var callbacks, method,
      message = id && messages[ id ];
      if ( !message ) {
        callbacks = jQuery.Callbacks();
        message = {
          publish: callbacks.fire,
          subscribe: callbacks.add,
          unsubscribe: callbacks.remove
        };
        if ( id ) {
        messages[ id ] = message;
        }
      }
      return message;
    };
Run Code Online (Sandbox Code Playgroud)

然后,可以使用以下模式发布和订阅窗口事件之间的任何位置。一个窗口即可发布数据:

global.Message("someButtonClicked").publish(data);
Run Code Online (Sandbox Code Playgroud)

然后其他人就可以听了。

global.Message("someButtonClicked").subscribe(onButtonClicked);

function onButtonClicked(data) {
  console.log(data);
};
Run Code Online (Sandbox Code Playgroud)