javascript - 如何从evaluate()访问注入(inject)的.js文件中的函数?

标签 javascript phantomjs

使用 PhantomJS 调用 page.evaluate() 时是否可以引用嵌入式 JavaScript 文件中的函数?

例如我想调用 my.js 文件中包含的函数 someFunctionInMyJs:

var page = require('webpage').create();
page.injectJs('my.js')
page.open('http://...', function() {
    var x = page.evaluate(function() {
       var y = someFunctionInMyJs();
       return y;
    });

    phantom.exit();
});

这可能/有替代方法吗?

my.js 看起来像这样:

function someFunctionInMyJs() {
    return 'Hi there!';
}

我得到的错误是:

ReferenceError: Can't find variable: someFunctionInMyJs

my.js 位于我调用 PhantomJS 的文件夹中。

最佳答案

问题是您将一个脚本注入(inject)到页面中,此时该脚本为 about:blank ,然后打开您想要的页面。您需要将脚本注入(inject)到 page.open 回调中。每次导航到另一个页面时都必须执行此操作。

page.open('http://...', function() {
    page.injectJs('my.js')
    var x = page.evaluate(function() {
       var y = someFunctionInMyJs();
       return y;
    });

    phantom.exit();
});

您还可以尝试通过 page.onInitialized 注入(inject) (injectJs) 您的脚本处理程序,例如,如果您的脚本交换 XMLHttpRequest 的实现。

如果这仍然不起作用,则您的函数可能不是全局的,在这种情况下您必须将其设为全局函数。编辑 my.js 将您的函数定义为

window.someFunctionInMyJs = function() {
    return 'Hi there!';
};

关于javascript - 如何从evaluate()访问注入(inject)的.js文件中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26146448/

相关文章:

ruby-on-rails - 使用binding.pry时如何指示phantomjs避免超时

python - 使用 Splinter + PhantomJS (Python) 访问表单

javascript - 如何使用 PhantomJS (1.9.8) 将点击事件发送到 div 或按钮?

javascript - Phantom JS 没有点击按钮,但如果我使用任何其他浏览器它就可以工作

JavaScript 在 Firefox 的 iMacros 插件中的多个宏之间切换

javascript - 如何向现有的 jQuery AJAX 单击功能添加加载微调器

javascript - 在html5中将图像颜色更改为灰度

javascript - 为什么 Vue.js 使用 VDOM?

javascript - Jquery 小部件触发的事件未被处理或触发

node.js - 如何使用 phantomjs 作为 npm 包