Javascript 如何从传递到CasperJS中求值的函数调用另一个函数

Javascript 如何从传递到CasperJS中求值的函数调用另一个函数,javascript,scope,phantomjs,casperjs,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() {

以下是我试图做的:

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

但它永远无法评估图像的功能。我在这里遗漏了什么?

好吧,我从来没有使用过CasperJS,但是从我在文档中读到的内容来看,我相信这是因为
evaluateImages
函数在页面上下文中不存在

我不确定这里的最佳实践是什么,但是您似乎可以从evaluate回调返回原语,因此您可以在技术上执行以下操作:

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 () {
    yourNS.evaluateImages(yourNS.getAllImages());
});
然后,您可以执行以下操作:

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 () {
    yourNS.evaluateImages(yourNS.getAllImages());
});
编辑:

在比较时,我需要处理页面上下文中的所有图像 它们中的每一个都与页面中的其他元素一起

也许您可以先在页面的上下文中定义一个模块:

this.evaluate(function () {
    window.yourNS = {
        evaluateImages: function (images) {
            //do something with images
        },
        getAllImages: function () {
            return document.getElementsByTagName('img');
        }
    };
});
然后,您可以执行以下操作:

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 () {
    yourNS.evaluateImages(yourNS.getAllImages());
});

嗯,我从未使用过CasperJS,但是从我在文档中读到的内容来看,我相信这是因为
evaluateImages
函数在页面上下文中不存在

我不确定这里的最佳实践是什么,但是您似乎可以从evaluate回调返回原语,因此您可以在技术上执行以下操作:

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 () {
    yourNS.evaluateImages(yourNS.getAllImages());
});
然后,您可以执行以下操作:

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 () {
    yourNS.evaluateImages(yourNS.getAllImages());
});
编辑:

在比较时,我需要处理页面上下文中的所有图像 它们中的每一个都与页面中的其他元素一起

也许您可以先在页面的上下文中定义一个模块:

this.evaluate(function () {
    window.yourNS = {
        evaluateImages: function (images) {
            //do something with images
        },
        getAllImages: function () {
            return document.getElementsByTagName('img');
        }
    };
});
然后,您可以执行以下操作:

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 () {
    yourNS.evaluateImages(yourNS.getAllImages());
});

是的,这是正确的,那么如何在页面的上下文中使用多个函数呢?我需要在页面上下文中进行大量计算,我不希望有一个巨大的函数,而是希望有几个函数。我应该把“支持”功能放在我正在传递给页面上下文的功能中吗?@HommerSmith我更新了答案,但是我不确定这是CasperJS的最佳实践。谢谢您的编辑。是的,我已经这样做了,返回srcs属性,但这没有帮助。我需要处理页面上下文中的所有图像,因为我正在将它们与页面中的其他元素进行比较…非常聪明。我一到家就试试这个。谢谢,没错,那么我如何在页面上下文中使用多个函数呢?我需要在页面上下文中进行大量计算,我不希望有一个巨大的函数,而是希望有几个函数。我应该把“支持”功能放在我正在传递给页面上下文的功能中吗?@HommerSmith我更新了答案,但是我不确定这是CasperJS的最佳实践。谢谢您的编辑。是的,我已经这样做了,返回srcs属性,但这没有帮助。我需要处理页面上下文中的所有图像,因为我正在将它们与页面中的其他元素进行比较…非常聪明。我一到家就试试这个。谢谢