Javascript 使用PhantomJS渲染图形并拍摄快照

Javascript 使用PhantomJS渲染图形并拍摄快照,javascript,phantomjs,Javascript,Phantomjs,我想生成一个图表以添加到电子邮件中。我正在考虑使用PhantomJS来做这件事。我使用的是PhantomJS的2.0版。我想加载d3.js(在cloudfare上)和c3.js(在本地js文件中)。我错过了一些东西。当我使用PhantomJS运行脚本时,它在窗口对象上返回未定义的d3 我下面的代码不起作用: var page = require('webpage').create(); var fs = require('fs'); page.viewportSize = { width: 40

我想生成一个图表以添加到电子邮件中。我正在考虑使用PhantomJS来做这件事。我使用的是PhantomJS的2.0版。我想加载d3.js(在cloudfare上)和c3.js(在本地js文件中)。我错过了一些东西。当我使用PhantomJS运行脚本时,它在窗口对象上返回未定义的d3

我下面的代码不起作用:

var page = require('webpage').create();
var fs = require('fs');
page.viewportSize = { width: 400, height : 400 };
page.content = '<html><body><canvas id="surface"></canvas> <button>Hello world</button> </body></html>';
page.includeJs("https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js");
var c3_js = "./c3.min.js";
page.includeJs(c3_js);

page.onLoadFinished = function(status) {
  var c3 = page.evaluate(function() {
          return window;
  });

  console.log(c3.d3);

  page.render('test.png');
  phantom.exit();
};
var page=require('webpage').create();
var fs=需要('fs');
page.viewportSize={宽度:400,高度:400};
page.content='Hello world';
第页,包括https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js");
var c3_js=“/c3.min.js”;
第页,包括(c3_-js);
page.onLoadFinished=功能(状态){
var c3=page.evaluate(函数(){
返回窗口;
});
控制台日志(c3.d3);
page.render('test.png');
phantom.exit();
};

您的代码有很多问题:

  • 是一个异步函数,因此您需要将需要JavaScript的代码放入回调中(您根本没有)

  • 您需要为本地文件(c3.js)使用

  • 无法从页面上下文返回
    窗口
    ,因为它不是可以序列化的基本对象。从:

    注意:参数和
    evaluate
    函数的返回值必须是一个简单的原语对象。经验法则:如果可以通过JSON对其进行序列化,那么就可以了

    闭包、函数、DOM节点等将无法工作

    您可以在页面上下文中(在
    page.evaluate()
    的内部)执行所有操作,也可以将内容的一些表示返回到外部。如果决定在页面上下文中执行此操作,则应查看各种事件侦听器,如
    page.onConsoleMessage
    ,以查看来自页面上下文和
    page.onCallback
    的控制台消息


    • 您的代码有很多问题:

      • 是一个异步函数,因此您需要将需要JavaScript的代码放入回调中(您根本没有)

      • 您需要为本地文件(c3.js)使用

      • 无法从页面上下文返回
        窗口
        ,因为它不是可以序列化的基本对象。从:

        注意:参数和
        evaluate
        函数的返回值必须是一个简单的原语对象。经验法则:如果可以通过JSON对其进行序列化,那么就可以了

        闭包、函数、DOM节点等将无法工作

        您可以在页面上下文中(在
        page.evaluate()
        的内部)执行所有操作,也可以将内容的一些表示返回到外部。如果决定在页面上下文中执行此操作,则应查看各种事件侦听器,如
        page.onConsoleMessage
        ,以查看来自页面上下文和
        page.onCallback
        的控制台消息