如何发布Node.js中的事件PhantomJS包装从页面到节点?

我从包装库中的这个例子开始。

const instance = await phantom.create(); const page = await instance.createPage(); 

要发布从Node.js到PhantomJS的动作 – 包括发射一个事件 – 我可以这样做:

 await page.evaluate(function() { // Code } 

但是相反呢。 我想在nodeJS的页面上监听一个事件。 我写了这个承诺,等待一个事件:

 class PageEventPromise extends Promise { constructor(page, event) { super(function(resolve, reject) { let callback = function() { let args = []; args.push.apply(args, arguments); page.off(event, callback); resolve(args); } page.on(event, callback); }); } } 

我想要听取特定元素的DOM更改。 我在网页上下文中设置了一个MutationObserver

 await page.evaluate(function() { var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if(mutation.type != "childList") return; for (var i=0,l=mutation.addedNodes.length; i<l; i++) { const node = mutation.addedNodes[i]; self.dispatchEvent(new Event("logEntry", {text: node.innerHTML})); } }); }); var config = { attributes: !true, childList: true, characterData: !true }; observer.observe(document.querySelector("div.ace_layer.ace_text-layer"), config); }); 

我可以看到我在setTimeoutcallback中抛出的错误警告,但事件没有触发。

所以这一行:

 self.dispatchEvent(new Event("logEntry", {text: node.innerHTML})); 

不会触发分配给page实例的事件。

所以,如果我分配任意事件:

 page.on("eventName", function() {/* callback**/}); 

如何从网页上下文中触发它?

UPDATE

我认为这解决了你的问题,而不是投票: http : //phantomjs.org/api/webpage/handler/on-callback.html

phantom模块检查:

 let phantom = require('phantom'); function nodeFnc(data) { // to be called when an event inside page occurs console.log('data from page: '+ data); } (async function() { let ph = await phantom.create(); let page = await ph.createPage(); await page.property( 'onCallback', function(data, nodeFnc) { nodeFnc(data); // this will be called when event occurs }); await page.evaluate( function() { setTimeout( function() { // timeout event window.callPhantom('from inside the page!'); }, 5000): }); })(); 

====================== 投票答案 ========================

虽然这不能直接回答你的问题,但它可能有助于解决你的问题。

您可以监听HTML内部DOM的更改,当发生某些事情时,将HTML内部的全局variablesSTATUS从0更改为1.从节点页面,您正在等待此更改:

 /** * @param {function} checkCond - returns promise with value of ready(true or false) */ function wait( checkCond ) { return new Promise( function( resolve, reject ) { function r() { checkCond().then(ready=>{ if ( ready === true ) return resolve(); setTimeout(function() {r();}, 1); // The condition is checked every millisecond. }); } r(); }); } wait( ()=>{ return page.evaluate( function() { return STATUS; }); }); // returns when STATUS is true