2013-10-11 64 views
1

這裏計算函數調用另一個功能是什麼,我試圖做的:如何從傳遞在CasperJS

var casper = require('casper').create(); 

casper.start('mysite.html', function() { 
}); 

/* Casper configuration */ 

casper.on('remote.message', function(msg) { 
    this.echo('remote message caught: ' + msg); 
}) 

function getAllImages() 
{ 
    // Get all images 
    var images = document.getElementsByTagName('img'); 
    evaluateImages(images); 
} 

function evaluateImages(images) 
{ 
    console.log("I am in evaluateImages"); 
} 

// Then find all pictures 
casper.then(function() { 
    var product_image = this.evaluate(getAllImages); 
}); 

casper.run(); 

但它永遠不會獲取evaluteImages功能。我在這裏錯過了什麼?

回答

2

嗯,我從來沒有使用CasperJS,但是從我在文檔中讀到的內容來看,我相信這是因爲evaluateImages函數在頁面上下文中不存在。

我不知道什麼是這裏最好的做法,但似乎你可以返回從評估回調元,所以你可以在技術上做這樣的事情:

function getAllImages() { 
    // Get all images 
    var images = document.getElementsByTagName('img'); 

    //Return an array that contains all images src attribute 
    return Array.prototype.map.call(images, function (img) { 
     return img.src; 
    }); 
} 

然後,你可以這樣做:

var images = this.evaluate(getAllImages); 

evaluateImages(images); 

編輯:

我需要治療在頁面上下文的所有影像,因爲我比較他們每個人是在頁面的其他元素 ...

也許你可以定義頁面的上下文模塊第一:

this.evaluate(function() { 
    window.yourNS = { 
     evaluateImages: function (images) { 
      //do something with images 
     }, 
     getAllImages: function() { 
      return document.getElementsByTagName('img'); 
     } 
    }; 
}); 

然後,你可以這樣做:

this.evaluate(function() { 
    yourNS.evaluateImages(yourNS.getAllImages()); 
}); 
+0

是的,這是正確的,所以我怎麼能在頁面的上下文中使用一種以上的功能?我需要在頁面上下文中做相當多的計算,而且我不想有一個巨大的函數,但有幾個函數。我應該把「支持」功能放在我傳遞給頁面上下文的那個裏面嗎? –

+0

@HommerSmith我更新了答案,但我不確定這是CasperJS的最佳做法。 – plalx

+0

感謝您的編輯。是的,我已經做到了,返回srcs屬性,但這沒有幫助。我需要處理頁面上下文中的所有圖像,因爲我將它們與頁面中的其他元素進行比較...... –