Node.js 检查NW.js中何时有WebKit上下文可用

Node.js 检查NW.js中何时有WebKit上下文可用,node.js,node-webkit,nw.js,Node.js,Node Webkit,Nw.js,在节点上下文(Node main)中执行时 投掷 nw未定义 因为WebKit上下文尚未准备就绪(在NW.js=0.13中,从开始的窗口开始不可用)。及 工作正常,但setTimeout看起来像是黑客攻击,将其设置为安全延迟值可能会导致不必要的延迟 如何从节点上下文检查WebKit上下文和nw的可用性?有没有一个合理的方法,比如一个可以处理的事件 以下内容实现了同样的效果,但却反过来实现了 在html文件中: 在节点主JS文件中: exports.init=function(){ 控制台日志(

在节点上下文(
Node main
)中执行时

投掷

nw未定义

因为WebKit上下文尚未准备就绪(在NW.js=0.13中,从开始的
窗口开始
不可用)。及

工作正常,但
setTimeout
看起来像是黑客攻击,将其设置为安全延迟值可能会导致不必要的延迟


如何从节点上下文检查WebKit上下文和
nw
的可用性?有没有一个合理的方法,比如一个可以处理的事件

以下内容实现了同样的效果,但却反过来实现了

在html文件中:

在节点主JS文件中:

exports.init=function(){
控制台日志(nw);
}


这里,仅当Webkit上下文/DOM可用时才调用init函数。

您可以使用
pollit
:)

我已经测试过了,它对我有效:)。这将模块化我在本文末尾给出的解决方案

在webkit启动并运行ie浏览器之前,
nw
对象不存在 窗口已创建。这发生在节点启动之后,这就是为什么 获取此错误。要使用
nw
api,您可以创建 听取或调用全局函数,前者更好。下面的代码将演示这两个方面,并应能让您很好地了解
节点
WebKit
是如何相互连接的

此示例创建一个窗口,打开devtools并允许您切换 屏幕。它还会在控制台中显示鼠标位置。它还演示了如何使用DOM ie body.onclick()发送事件,并从节点ie中附加事件。我们将捕获
最小化
事件并将它们写入控制台

var start = new Date().getTime();
var events = require('events');
var e = new events.EventEmitter();

var stop = 0;
e.on('foo', function() { 
if(typeof nw === 'undefined') {
  setTimeout(function () {
    e.emit('is_nw_defined');
  }, 1); 
 }   
 else {
   if(stop === 0) {
     stop = new Date().getTime();
   }   
   setTimeout(function () {
     console.log(stop - start);
     console.log(nw);
     e.emit('is_nw_defined');
   }, 2000);
 }   
});
e.emit('is_nw_defined');
为此,您需要使用SDK版本的
NW
。这是我的package.json

{
  "name": "hello",
  "node-main": "index.js",
  "main": "index.html",
  "window": {
    "toolbar": true,
    "width": 800,
    "height": 600
  },
  "dependencies" : {
    "robotjs" : "*",
    "markdown" : "*"
  }
}
您需要的两个文件是
index.html

<!DOCTYPE html>
<html>
  <head>
    <script>
      var win = nw.Window.get();
      global.win = win;
      global.console = console;
      global.main(nw);
      global.mouse();
      var markdown = require('markdown').markdown;
      document.write(markdown.toHTML("-->Click between the arrows to toggle full screen<---"));
    </script>
  </head>
  <body onclick="global.mouse();">
  </body>
</html>
当运行这个时,我使用

nwjs --enable-logging --remote-debugging-port=1729  ./
然后,可以使用打开浏览器

http://localhost:1729/
用于调试(如果需要)

如果您想在
nw
对象存在后立即执行某项操作,您可以轮询它。我会使用eventEmitter,如果您不想使用eventEmitter,您可以同样轻松地将其包装到函数中并递归调用它。下面将显示设置
nw
对象之前所用的毫秒数。在我的系统上,这个范围在43-48毫秒之间。使用递归函数也不例外。如果您将此添加到上面的代码中,您将看到所有记录到控制台的内容

var start = new Date().getTime();
var events = require('events');
var e = new events.EventEmitter();

var stop = 0;
e.on('foo', function() { 
if(typeof nw === 'undefined') {
  setTimeout(function () {
    e.emit('is_nw_defined');
  }, 1); 
 }   
 else {
   if(stop === 0) {
     stop = new Date().getTime();
   }   
   setTimeout(function () {
     console.log(stop - start);
     console.log(nw);
     e.emit('is_nw_defined');
   }, 2000);
 }   
});
e.emit('is_nw_defined');
解决方案1: 您可以使用
onload

main.js:

var gui = require("nw.gui"),
    win = gui.Window.get();

onload = function() {
    console.log("loaded");
    console.log(win.nw);
};
<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="main.js"></script>
    </head>
    <body></body>
</html>
{
  "name": "Freebox",
  "main": "index.html"
}
index.html:

var gui = require("nw.gui"),
    win = gui.Window.get();

onload = function() {
    console.log("loaded");
    console.log(win.nw);
};
<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="main.js"></script>
    </head>
    <body></body>
</html>
{
  "name": "Freebox",
  "main": "index.html"
}
解决方案2: (防止问题,但不是必须的)


我最初提出的解决方案如下

app-node.js


app.html


global.process.emit('webkit');
...

我很高兴知道已经有一个事件需要监听,因此跨平台客户端脚本可以省略与NW相关的代码。

WebKit加载选项后是否正在运行您的节点主功能?@RahatMahbub我希望有一种官方的(可能没有文档记录的)方法可以单独通过节点执行此操作,如global event。这是有道理的,但如果没有,那么从html页面调用是唯一的选择,我想。@estus有办法做到这一点,但我不认为这是一个特别好的方法。如果你愿意的话,我可以把它加到我的答案中。@Harry当然,那太好了。答案包含一个很好的NW示例介绍,但没有直接回答问题。@estus我在其中添加了一个计时器,以便您可以看到定义
NW
对象需要多长时间。此解决方案是错误的。require('nw.gui')是获取nw对象的传统方法。您还缺少OP关于上下文的要点,在这个答案中,您在任何时候都不在节点上下文中。@Harry,这是一个例子。感谢
pollit
包,看起来像是一个黑客,但很好,性能命中率和过度延迟几乎为零。
var gui = require("nw.gui"),
    win = gui.Window.get();

onload = function() {
    console.log("loaded");
    var a = function () {
        if (!win.nw) return setTimeout(a, 10);
        console.log(win.nw);
    };
};
process.once('webkit', () => {
    console.log(nw);
});
<html>
<head>
    <script>
        global.process.emit('webkit');
    </script>
    ...