2014-10-02 17 views
7

Sayfamı oluşturmak istiyorum ve belirli bir olay tetiklendiğinde tetiklemek istediğimden PhantomJS'den değerlendirme işlevinden çıkıyorum.page.evalu page.evaluate içinde nasıl çalıştırılır?

Böyle bir şey denedim: page.render tanımsız gibi görünüyor, çünkü

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

Bu, benim örnekte çalışmıyor. Belki de objenin işlevlerini serileştirmeyen argümanlar için bir serileştirici var mı?

Bu mümkün mü? Sorunum için bir çözüm bilen var mı?

Değerlendirme işlevimde bir süre döngü oluşturabileceğimi ve sonlandırılmasını engelleyebileceğimi biliyorum ve bu sayfa daha sonra dışarıda işler. Ben bundan hoşlanmıyorum.

+0

Büyük soruya ve büyük cevap. Teşekkürler! –

cevap

16

page.evaluate() korumalı alanlıdır. Girdiğiniz işlev sayfa bağlamında değerlendirilir ve başarılı bir şekilde iletilmesi için tüm argümanların serileştirilmesi gerekir. page veya phantom sayfa bağlamına geçemezsiniz. docs aşağıdaki ki:

Not: argümanları ve evaluate işlevine geri dönüş değeri, basit bir ilkel nesne olmalıdır. Başparmak kuralı: JSON üzerinden serileştirilebiliyorsa, o zaman iyi olur.

Kapanışlar, işlevler, DOM düğümleri vb. çalışmıyor!

Bu page.onCallback için budur:

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 }); 
}); 
İlgili konular