Я искал 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 является static.I также пытался привязать, но он возвращает эту ошибку:
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 между этими двумя?
если есть какой-то способ передачи сообщений или 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);
});
Существует еще один способ вызвать "home" из песочницы: page.callPhantom
, но обратите внимание, что он по-прежнему отмечен как "экспериментальный" в документах.
interval
блоке и каждый раз отправлять / получать данные.page.callPhantom
для их отправки обратно, но да, page.evaluate + setInterval намного надежнее.