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