2014-10-02 21 views
7

我確實想渲染我的頁面並退出PhantomJS的評估函數,因爲我想在觸發特定事件時觸發它。如何在page.evaluate中執行page.render?

我已經試過這樣的事情:

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的序列化函數?

這甚至可能嗎?有誰知道我的問題的解決方案?

我知道我可以在我的評估函數中設置一個while循環,並阻止它的終止,並在此之後將頁面呈現給外部。雖然我不喜歡這個。

+0

大的問題,極大的答案。謝謝! – 2017-01-31 15:06:34

回答

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 }); 
});