PhantomJS Передача переменной в page.evaluate по ссылке
Я искал в течение 2 дней, но все еще без изменений, мне нужно иметь foo
переменная по ссылке внутри page.evaluate
но кажется невозможным.
var foo = 42;
setInterval(function(){
console.log('outer '+foo++);
},1000);
page.open(url, function() {
var pe = page.evaluate(function(foo) {
setInterval(function(){
console.log('inner inner '+foo);
},1000);
},foo);
setInterval(function(){
console.log('inner '+foo);
},1000);
}.bind(foo));
и внешнее и внутреннее обновляются, но inner inner
foo является статическим. Я также пытался связать, но он возвращает эту ошибку:
SyntaxError: Expected token ']'
undefined:2 in evaluateJavaScript
phantomjs://platform/webpage.js:390 in evaluate
phantomjs://code/foo.js:37
:0
phantomjs://platform/webpage.js:286 in _onPageOpenFinished
Изменить: Только что выяснил, что функция оценки является песочницей, мне просто любопытно, есть ли какой-то способ передачи сообщений или IPC между этими двумя?
1 ответ
есть ли какой-то способ передачи сообщений или IPC между этими двумя?
Действительно есть - page.evaluate
может вернуть простую переменную или сериализованный объект во внешний контекст:
var value_from_sandbox = page.evaluate(function(){ return 42; });
Вы не указываете это явно в своем вопросе, но из примеров кода, которые я беру, вы хотите отслеживать некоторую переменную на активной странице. Это возможно:
page.open(url, function() {
// Set interval function in PhantomJS scope
// that will extract a variable from the page once a second
setInterval(function(){
var foo = page.evaluate(function() {
return document.getElementById('foo').innerHTML;
}
console.log(foo);
}, 1000);
});
Есть еще один способ позвонить "домой" из песочницы: page.callPhantom
, но учтите, что в документах он все еще был помечен как "экспериментальный".