gpt4 book ai didi

javascript - 是否可以将函数传递给 casper.evaluate()?

转载 作者:行者123 更新时间:2023-11-30 16:35:27 24 4
gpt4 key购买 nike

是否可以将函数传递给 casper.evaluate()

var casper = require('casper').create({
//verbose: true,
logLevel: 'debug',
pageSettings: {
loadImage: false,
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4'
}
});
...
casper.then(function(){
var config = {};
config.test = function(a, b){
return a + b;
}

var extractInfo = this.evaluate(function(config) {
return value = config.test(1, 2);
}, config);
});

这行不通,所以我假设不行,但看起来我们应该可以,因为我们可以传递对象和数组等其他内容。如果我可以将函数附加到配置并将其传递给 CasperJS,那将是一个巨大的好处。

这样,在我运行 scrape 之前,可以将辅助函数模块化并分成不同的包含等,从而使代码 super 干净!

最佳答案

不,这不是直接可能的。 documentation说如下:

Note: The arguments and the return value to the evaluate function must be a simple primitive object. The rule of thumb: if it can be serialized via JSON, then it is fine.

Closures, functions, DOM nodes, etc. will not work!

单一功能

JavaScript 当然是非常动态的,因此您可以序列化一个函数并将其作为字符串传递到页面上下文中。然后你只需要在页面上下文中评估它。

让我们以命名(为简单起见)函数 add 为例:

function add(a, b){
return a + b;
}

您可以将其作为字符串传递到页面上下文中:

this.evaluate(function(addFun){
// TODO: parse/evaluate function
}, add.toString());

new Function()

var addInternal = new Function("a", "b", addFun + "; return add(a, b);");

产生

var addInternal = function anonymous(a, b) {
function add(a, b){
return a + b;
}; return add(a, b);
}

eval()

简单地评估字符串当然更容易。

eval(addFun)

直接生成add

也可以使用这种技术评估闭包,但您需要在 eval 时提供来自页面上下文内部外部作用域的引用。

函数库

如果你想做更大的实用功能,我建议你研究一下 CasperJS 如何将 clientutils.js 包含到每个页面中(code)。

这是通过将这些函数放在一个可以注入(inject)页面的附加文件中来完成的。这可以通过 casper.page.injectJs(filename) 从本地文件同步完成或使用 casper.page.injectJs(filename, callback) 从远程文件异步获取.

当然,CasperJS 提供设置,以便将这些设置注入(inject)到每个页面中 casper.options.clientScriptscasper.options.remoteScripts .

关于javascript - 是否可以将函数传递给 casper.evaluate()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32764748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com