如何在page.evaluate中执行page.render?

时间:2014-10-02 13:27:05

标签: javascript phantomjs

我想渲染我的页面并在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循环并阻止它终止,并在之后执行此页面渲染内容。我不喜欢这个。

1 个答案:

答案 0 :(得分:16)

page.evaluate()是沙箱。您传入的函数在页面上下文中进行评估,并且所有参数都需要可序列化,以便成功传入。您无法将pagephantom传递到页面上下文中。 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 });
});