Vous pouvez utiliser pollit
:) ...
var pit = require("pollit");
foo = function(data) {
console.log(nw);
};
pit.nw('nw', foo);
Je l'ai testé et il fonctionne pour moi :). Ceci modularise la solution que je donne vers la fin de ceci.
L'objet nw
n'existe pas tant que webkit n'est pas opérationnel, c'est-à-dire que la fenêtre du navigateur a été créée. Cela se produit après le démarrage de Node. C'est la raison pour laquelle vous obtenez cette erreur. Pour utiliser l'API nw
, vous pouvez soit créer des événements pouvant être écoutés , soit appeler des fonctions globales, la première étant préférable. Le code suivant va démontrer les deux et devrait vous donner une bonne idée de la façon dont Node
et WebKit
s'interfaçent les uns avec les autres.
Cet exemple crée une fenêtre, ouvre devtools et vous permet de basculer l'écran . Il affiche également l'emplacement de la souris dans la console. Il montre également comment envoyer des événements en utilisant le DOM, c'est-à-dire body.onclick() et en attachant des événements depuis Node, c'est-à-dire que nous allons capturer les événements minimize
et les écrire sur la console.
Pour que cela fonctionne, vous devez utiliser la version SDK de NW
. C'est mon paquet.JSON
{
"name": "hello",
"node-main": "index.js",
"main": "index.html",
"window": {
"toolbar": true,
"width": 800,
"height": 600
},
"dependencies" : {
"robotjs" : "*",
"markdown" : "*"
}
}
Les deux fichiers dont vous avez besoin sont 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>
et index.js
.
var robot = require("robotjs");
global.mouse = function() {
var mouse = robot.getMousePos();
console.log("Mouse is at x:" + mouse.x + " y:" + mouse.y);
global.win.toggleFullscreen();
}
global.main = function(nw_passed_in) {
global.win.showDevTools();
console.log("Starting main");
console.log(nw_passed_in);
console.log(nw);
global.win.on('minimize', function() {
console.log('n: Window is minimized from Node');
});
}
Lors de l'exécution cela, j'utilisé
nwjs --enable-logging --remote-debugging-port=1729 ./
Vous pouvez ensuite ouvrir le navigateur en utilisant
http://localhost:1729/
pour le débogage en cas de besoin.
Si vous voulez faire quelque chose dès que l'objet nw
existe, vous pouvez l'interroger. J'utiliserais eventEmitter, si vous ne voulez pas utiliser l'émetteur d'événements, vous pouvez tout aussi bien l'intégrer dans une fonction et l'appeler récursivement. Ce qui suit affichera combien de millisecondes il a fallu avant que l'objet nw
ne soit configuré. Sur mon système, cela variait entre 43 et 48 millisecondes. Utiliser une fonction récursive n'était pas différent. Si vous ajoutez ceci au code ci-dessus, vous verrez tout ce qui est connecté à la console.
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');
L'exécution de votre fonction de noeud principal est-elle effectuée une fois que WebKit a chargé une option? –
@RahatMahbub J'espérais qu'il existe une façon officielle (peut-être non documentée) de le faire uniquement via Node, comme un événement global.Cela aurait du sens, mais s'il n'y en a pas, alors rappeler de la page html est la seule option, je suppose. – estus
@estus Il y a un moyen de le faire mais je ne pense pas que ce soit une manière particulièrement soignée. Je peux l'ajouter à ma réponse si tu veux. – Harry