javascript - PhantomJS:如何访问全局函数和变量?

标签 javascript scope phantomjs global

我正在尝试通过 PhantomJS 运行 .js 并使用页面上下文中的一些全局函数或变量。

这是一个最小的例子:

var page = require('webpage').create(); // or: var page = new WebPage();

// reroute page's console to global console
page.onConsoleMessage = function(msg) { console.log(msg) }

function Foo(x) { return "bar"+x }

page.open( 'https://www.example.com/', function(){

    console.log(Foo(1)); // works OK

    page.evaluate( function(){

        console.log('test'); // works OK (message appears because we rerouted 
                             // the page's console to global console output)

        console.log(Foo(2)); // does NOT work, Foo is unknown
    });

    console.log(Foo(3)); // works OK
    phantom.exit();

});

请注意 Foo() 函数在页面 evaluate() 函数的上下文中是如何未知的。

我尝试了多种方法,例如在 Foo 定义下方执行 page.Foo2 = Foo;,然后在 evaluate 中执行> 上下文我称之为 Foo2(2),但是没有。

或者 page.Foo2 = function(x) { return Foo(x) } 但同样无济于事。也不要通过调用 this.Foo2(2) 而只是调用 Foo2(2) (如果这有意义的话)。

如何访问 page 范围之外的函数或变量?

最佳答案

您可以在沙箱上下文中声明一个函数:

page.open( 'https://www.example.com/', function(){

    page.evaluate( function(){

        function Foo(x) { return "bar"+x }

        console.log(Foo(2));
    });

    phantom.exit();
});

或者,如果您也需要在全局上下文中使用它,您可以将其发送到沙箱中:

function Foo(x) { return "bar"+x }

page.open( 'https://www.example.com/', function(){

    console.log(Foo(1));

    page.evaluate( function(Foo){

        console.log(Foo(2));

    }, Foo);

    console.log(Foo(3));

    phantom.exit();
});

关于javascript - PhantomJS:如何访问全局函数和变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46932306/

相关文章:

javascript - 将 JavaScript 函数传递给对象内的另一个函数会丢失对象变量范围

javascript - Ruby 作用域,从函数返回 Proc

jquery - 从 HTML 按钮自动化命令行

ubuntu - Rspec 在 Ubuntu 上非常慢,但在 Mac 上很快

javascript - 禁用内容安全策略

javascript - 嵌套循环有问题

javascript - 如何刷新/重新加载应用程序/pdf 的嵌入?

javascript - 如何在加载页面时显示 Bootstrap 3 弹出窗口然后隐藏

javascript - 作为参数传入的函数 - 访问其他参数?

node.js - openshift 服务器中的 casperjs