开发者问题收集

全局变量在 page.open() 中无法访问-PhantomJS [重复]

2016-05-15
2129

我对 PhantomJS 和 JS 还不熟悉,无法理解为什么 querySelector 无法访问我的元素全局变量。我尝试在各种函数 () 中传递元素,但无济于事。我在下面附上了未修改的代码副本。

var page = require('webpage').create();
var args = require('system').args;

var uri = args[1];
var element  = args[2];

console.log('Arg 1: '+args[1]);
console.log('Arg 2: '+args[2]);

page.open(uri, function (status) {
    if (status !== 'success') {
        console.log('Error Opening Page');
    } else {
        window.setTimeout(function () {
            var bounds = page.evaluate(function () { 

        canvas = document.querySelector('#'+ element);

        return canvas.getBoundingClientRect(); 
            });

            page.clipRect = {
                top:    bounds.top,
                left:   bounds.left,
                width:  bounds.width,
                height: bounds.height
            };

            page.render('result.png');
            phantom.exit();
        }, 500);
    }
});

结果为

$ ./phantomjs test.js http://fabricjs.com/static_canvas c
Arg 1: http://fabricjs.com/static_canvas
Arg 2: c
ReferenceError: Can't find variable: args

  undefined:3
  :6
TypeError: null is not an object (evaluating 'bounds.top')

  phantomjs://code/test.js:23
2个回答

您可以通过参数(元素)传递它

var bounds = page.evaluate(function (element) { 
    canvas = document.querySelector('#'+ element);
    return canvas.getBoundingClientRect(); 
}, element);
Emilio Platzer
2016-05-15

是的,这是因为当您执行 page.open 时,您在另一个页面上,而前一个页面上的变量不会与第二个页面共享。

您需要解决问题的是在新页面中重新分配 args 变量。

但在您的情况下并非如此,但如果您需要共享的变量是一个值,您可以尝试在 URL 中传递该值以在新页面中恢复它。

jeremy-denis
2016-05-15