我正在使用phantomjs来执行下面的代码。 我无法弄清楚这里有什么问题。
function process(arg1, arg2) {
var webpage = require('webpage').create();
webpage.onConsoleMessage = function(msg) {
// something
};
webpage.onError = function(msg, trace) {
// something
};
webpage.open(entityResolvedFilePath, function(status) {
if (status !== 'success') {
abort(ErrorCode['HTML_LOAD_FAILURE']);
} else {
injectScriptsToWebpage(webpage);
if (inputParams['myExpression']) {
var outerWebPagescope=webpage;
window.wepPage=webpage;
webpage.evaluate(function() {
if (hasRequiredNoides(document)) {
//do something
}
else {
//outerWebPagescope.onCallback(); this also doesn't works
wepPage.onCallback();
}
});
}
else {
webpage.onCallback();
}
}
});
webpage.onCallback = function() {
webpage.evaluate(function(inputParams) {
//do something
});
};
}
当我在webpage.aun中调用webpage.evaluate时,它会创建一个新的函数范围,所以我通过创建引用 outerWebPagescope 来访问外部变量,但是我无法访问它。 据我所知,闭包这应该有用。
任何人都可以解释我这个。 不知怎的,我无法通过使用phantomjs调试回调代码,该代码从未在浏览器中命中我的调试器。
答案 0 :(得分:0)
在PhantomJS中,page.evaluate
内部的函数不仅仅是一个闭包,它存在另一个上下文(网页)的内部节点,其中所有外部变量和函数都不存在,而是一个网页' s可以使用DOM。
如果我了解您的意图,您希望从网页的上下文中与外部上下文进行交互。有两种方法:
•您可以return
来自page.evaluate
的数据,但它必须是一个简单的可序列化对象或数组。
•您可以调用一个特殊的效用函数window.callPhantom
注入网页,以便进行这种互动:
page.evaluate(function(){
if (typeof window.callPhantom === 'function') {
window.callPhantom({ hello: 'world' });
}
});
page.onCallback = function(data) {
console.log('CALLBACK: ' + JSON.stringify(data));
// Prints 'CALLBACK: { "hello": "world" }'
};
文档:http://phantomjs.org/api/webpage/handler/on-callback.html