Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Node.js PhantomJS包装器中将事件从页面发布到节点?_Javascript_Node.js_Phantomjs - Fatal编程技术网

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

Javascript 如何在Node.js PhantomJS包装器中将事件从页面发布到节点?,javascript,node.js,phantomjs,Javascript,Node.js,Phantomjs,我从包装器存储库开始 const instance = await phantom.create(); const page = await instance.createPage(); 要将一个操作从Node.js发布到PhantomJS(包括发出事件),我可以这样做: await page.evaluate(function() { // Code } 但反过来呢。我想从nodeJS中的页面收听事件。我写下了等待事件的承诺: class PageEventPromise ext

我从包装器存储库开始

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);
});
不会触发分配给
页面
实例的事件

因此,如果我指定任意事件:

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

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

更新

我认为这解决了您的问题,无需进行投票:

使用
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中的全局变量状态从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

是的,这叫做投票,如果没有人给我答案,我会这么做。实际上,我已经这样做了,我现在缓冲对数组的更改。
/**
 * @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