如何从在CasperJS中传递给evaluate的函数中调用另一个函数

时间:2013-10-11 17:09:42

标签: javascript scope phantomjs 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功能。我在这里缺少什么?

1 个答案:

答案 0 :(得分:4)

好吧,我从未使用过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());
});