PhantomJS Передача переменной в page.evaluate по ссылке

1

Я искал 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 между этими двумя?

Теги:
phantomjs
pass-by-reference

1 ответ

0
Лучший ответ

если есть какой-то способ передачи сообщений или 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, но обратите внимание, что он по-прежнему отмечен как "экспериментальный" в документах.

  • 0
    Моей первой целью была отправка данных извне (из sanbox /valu) внутрь в режиме реального времени, что невозможно. Но с помощью вашего ответа я думаю, что смогу выполнить всю оценку в interval блоке и каждый раз отправлять / получать данные.
  • 0
    Это не совсем невозможно ... Вы можете создать своих собственных слушателей событий для изменения данных на странице, а затем использовать page.callPhantom для их отправки обратно, но да, page.evaluate + setInterval намного надежнее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню