从jsdom迁移到phantomJS ? (基本的DOM创建)[英] Migrate from jsdom to phantomJS ? (basic DOM creation)

问题描述

m. Bostock指出,Nodejs的JSDOM对SVG的支持不完整,对我来说至关重要,不支持getBBox().此外,他建议切换到Nodejs的phantomjs.我检查了一下,但这种方法对我来说是新的.

我的nodejs + jsdom脚本创建一个虚拟dom,我的D3J播放,如下:

var jsdom = require('jsdom');
jsdom.env(                             // creates virtual page
  "<html><body></body></html>",        // create my DOM hook,
  [ 'http://d3js.org/d3.v3.min.js',    // add my online dependencies ...
  '../js/d3.v3.min.js',                // ... & local ones
  '../js/jquery-2.1.3.min.js'],

  function (err, window) {
           //my normal JS or nodejs code here !
  }
);

如何将此nodejs + jsdom迁移到nodejs + phantomjs?

推荐答案

由于您想从node.js执行此操作,因此您应该使用phantomjs桥,例如 phantomjs -Node ( phantom npm模块).

当您不打开phantomjs中的页面时,您实际上是在大约:空白页面上工作的,您需要添加' - local to-remote-url-access = yes'命令行选项phantomjs流程,以便可以加载远程资源.也许--web-security=false,--ssl-protocol=any和ignore-ssl-errors=true是必要的.

要将其他脚本注入DOM,您需要使用 injectJs() injectJs() injectJs() injectJs() 用于本地文件 includeJs() 用于远程文件.此外,您无法直接访问phantomjs中的DOM,因为它具有两个上下文.沙盒页面上下文( page.evaluate() )无访问权限因此,如果需要,您将需要明确传递它们.

var phantom = require('phantom');
var async = require('async');

function run(page, ph) {
    page.evaluate(function () {
        // page context: DOM code here
        return document.title;
    }, function (title) {
        // node code here
        console.log('Page title is ' + title);
        ph.exit();
    });
}

var remoteScripts = [ "http://d3js.org/d3.v3.min.js" ];
var localScripts = [ "../js/d3.v3.min.js", "../js/jquery-2.1.3.min.js" ];
phantom.create('--local-to-remote-url-access=yes', '--web-security=false', function (ph) {
    ph.createPage(function (page) {
        async.series(remoteScripts.map(function(url){
            return function(next){
                page.includeJs(url, function(){
                    next();
                });
            };
        }), function(){
            async.series(localScripts.map(function(url){
                return function(next){
                    page.injectJs(url, function(){
                        next();
                    });
                };
            }), function(){
                run(page, ph);
            });
        });
    });
});

您可以使用 async 将脚本列表加载到DOM中.我使用了series()函数.

本文地址:https://www.itbaoku.cn/post/1739894.html