2015-03-23 4 views
1

Я использую PhantomJS, чтобы закрепить снимок экрана панели управления и сохранить его в виде файла PNG. Это отлично работает, но когда я добавляю дополнительные аргументы (line, dFrom, dTo) и хочу использовать их внутри page.evaluateJavaScript(), он не работает. Есть ли способ использовать переменные PhantomJS внутри функции JavaScript?Используйте переменную PhantomJS внутри функции page.evaluateJavaScript

var page = require('webpage').create(), 
system = require('system'), 
address, output, size, line, dFrom, dTo; 

address = system.args[1]; 
output = system.args[2]; 
line = "All"; 
dFrom = null; 
dTo = null; 

if (system.args.length > 2) 
{ 
    line = system.args[3]; 
    dFrom = system.args[4]; 
    dTo = system.args[5];   
} 

page.viewportSize = { width: 1200, height: 1800 }; 

page.open(address, function (status) { 
    if (status !== 'success') { 
     console.log('Unable to load the address!'); 
     phantom.exit(); 
    } else { 
     page.evaluate(function() { 
      var body = document.body; 
      body.style.backgroundColor = '#fff'; 
      body.querySelector('div#nav-section').style.display = 'none'; 
      body.querySelector('div#to-hide-btns').style.display = 'none'; 
      body.querySelector('div#main-section').style.overflow = 'hidden'; 
     }); 
     page.evaluateJavaScript(function() { 
      selectedLine = line; 
      dateFrom = dFrom; 
      dateTo = dTo; 
      onCriteriaChange(); 
     }); 
     window.setTimeout(function() { 
      page.render(output, {format: 'png', quality: '100'}); 
      console.log('done'); 
      phantom.exit(); 
     }, 2000); 
    } 
}) 

Если изменить его на это работает:

page.evaluateJavaScript(function() { 
    selectedLine = "S01"; 
    dateFrom = "3/1/2015"; 
    dateTo = "3/10/2015"; 
    onCriteriaChange(); 
}); 

ответ

3

page.evaluate() и его братья и сестры дверь в контексте песочницы страницы. Функция, которую вы передаете в нее, не имеет доступа к переменным, определенным снаружи. Вам необходимо явно передать эти значения в контексте страницы:

page.evaluate(function(line, dFrom, dTo) { 
    selectedLine = line; 
    dateFrom = dFrom; 
    dateTo = dTo; 
    onCriteriaChange(); 
}, line, dFrom, dTo); 

Вы также не можете передавать произвольные объекты. Они должны быть сериализации:

Примечание: аргументы и возвращаемое значение функции оценки должна быть простой примитивный объект. Эмпирическое правило: если оно может быть сериализовано через JSON, тогда это нормально.

Закрытие, функции, узлы DOM и т. Д. Не сработают!