我已经声明了一个全局变量var linkArray=[]
,但它没有在phantomJS
函数中被拾取。错误消息为:phantom stdout: ReferenceError: Can't find variable: linkArray
。我怎样才能找到这个?我尝试用window.linkArray
声明它,但由于这是一个无头应用程序,然后我得到一个不同的错误,ReferenceError: window is not defined
。
因此,我需要一种方法使var linkArray=[]
全局化。
var phantom = require('phantom');
var linkArray=[];
phantom.create(function (ph) {
ph.createPage(function (page) {
var main_file="file:///C:/whatever/index.html";
page.open(main_file, function (status) {
console.log("opened " + main_file +"\n",status+"\n");
page.evaluate(function () {
for (var i=0; i < document.getElementsByTagName('a').length; i++) {
linkArray.push(document.getElementsByTagName('a')[i].href)
}
return linkArray;
}
, function (result) {
console.log(result)
ph.exit();
});
});
});
}, {
dnodeOpts: {
weak: false
}
});
答案 0 :(得分:2)
PhantomJS有一个页面上下文和外部上下文。页面上下文是沙箱,因此您需要将变量显式传递给它。它按值传递。 docs说:
在网页的上下文中评估给定的函数。执行是沙盒,网页无法访问幻像对象,它无法探测自己的设置。
但请注意 note 。
注意: evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。
闭包,函数,DOM节点等不起作用!
要解决此问题,必须将外部变量传递到页面上下文(evaluate
)并返回
page.evaluate(function(linkArray) {
// page context, linkArray is a local variable now
for (var i=0; i < document.getElementsByTagName('a').length; i++) {
linkArray.push(document.getElementsByTagName('a')[i].href)
}
return linkArray;
}, function finished(result) {
// outer context
console.log(result)
linkArray = result;
ph.exit();
}, linkArray); // pass values for the page context as last parameters