我想渲染我的页面并在evaluate函数中退出PhantomJS,因为我想在触发特定事件时触发它。
我尝试过这样的事情:
page.evaluate(page, function (page, phantom) {
//do some stuff on my page
//i want to execute this in an eventhandler of my page though thats not the problem
page.render('imgName.png');
page.render('pdfName.pdf');
phantom.exit();
}, page, phantom);
这在我的示例中不起作用,因为page.render
似乎未定义。也许有一个参数的序列化器没有序列化obj的函数?
这甚至可能吗?有谁知道我的问题的解决方案?
我知道我可以在我的evaluate函数中设置一个while循环并阻止它终止,并在之后执行此页面渲染内容。我不喜欢这个。
答案 0 :(得分:16)
page.evaluate()
是沙箱。您传入的函数在页面上下文中进行评估,并且所有参数都需要可序列化,以便成功传入。您无法将page
或phantom
传递到页面上下文中。 docs说出以下内容:
注意:
evaluate
函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。闭包,函数,DOM节点等将不工作!
这是page.onCallback
的用途:
page.onCallback = function(data){
if (data.exit) {
page.render('imgName.png');
page.render('pdfName.pdf');
phantom.exit();
}
};
page.evaluate(page, function () {
//do some stuff on my page
//i want to execute this in an eventhandler of my page though thats not the problem
window.callPhantom({ exit: true });
});