Javascript 如何将函数从节点Horseman传递到'evaluate'函数?
使用Node Horseman,我们可以在节点内部使用PhantomJS。如果我们想在页面的上下文中执行一段JS代码,我们将执行以下操作:Javascript 如何将函数从节点Horseman传递到'evaluate'函数?,javascript,node.js,web-scraping,web-crawler,Javascript,Node.js,Web Scraping,Web Crawler,使用Node Horseman,我们可以在节点内部使用PhantomJS。如果我们想在页面的上下文中执行一段JS代码,我们将执行以下操作: var Horseman = require('node-horseman'); var horseman = new Horseman(); horseman.open(pageUrl) .status() .evaluate(function () { // Js Code goes here
var Horseman = require('node-horseman');
var horseman = new Horseman();
horseman.open(pageUrl)
.status()
.evaluate(function () {
// Js Code goes here
})
.close();
现在,假设我们想将“从外部”传递给求值函数。例如,如果我执行以下操作
var Horseman = require('node-horseman');
var horseman = new Horseman();
function someFunction() {}
horseman.open(pageUrl)
.status()
.evaluate(function () {
someFunction();
})
.close();
var Horseman = require('node-horseman');
var url = require('url');
var horseman = new Horseman();
horseman.open(pageUrl)
.status()
.evaluate(function () {
// try to use url somehow here
})
.close();
当我在evaluate中调用someFunction
时,找不到它
另一个例子,假设我执行以下操作
var Horseman = require('node-horseman');
var horseman = new Horseman();
function someFunction() {}
horseman.open(pageUrl)
.status()
.evaluate(function () {
someFunction();
})
.close();
var Horseman = require('node-horseman');
var url = require('url');
var horseman = new Horseman();
horseman.open(pageUrl)
.status()
.evaluate(function () {
// try to use url somehow here
})
.close();
它也不能识别那里的
url
对象。我确实理解这个问题,代码是在页面的上下文中运行的。但是,是否有某种方法可以从外部传递这些内容,以便我们可以在evaluate内部使用它们?您对页面上下文中运行的代码的看法是正确的。您可以将其视为打开浏览器控制台并将Evalue函数中的所有内容粘贴到那里
如果将someFunction()粘贴到控制台中,JS运行时将抛出一个错误:someFunction未定义。这是因为它从未在页面上下文中定义
实际上,有一种从外部传递函数的变通方法,但只有当函数不依赖于节点上下文中的其他函数和全局对象时,它才会起作用
以下是一个例子:
function someFunction() {
return document.title;
}
horseman.open('http://google.com')
.evaluate(function (someFunction) {
eval('var sf = ' + someFunction);
return sf();
}, someFunction.toString())
.log() //Will print out "Google"
.close();
url实际上是一个node.js模块。您可以尝试将其替换为任何类似的客户端JS库,然后使用以下命令之一将其注入:
horseman
.injectJs(file)
或
解决方法:
.evaluate(fn, [arg1, arg2,...])
这很模糊。请说明如何在问题代码中应用这一点。