从 jsdom 迁移到 phantomJS ? (基本 DOM 创建)

2023-12-13

M. Bostock 指出,nodejs 的 jsdom 对 svg 的支持不完整,而且,对我来说至关重要的是,不支持getBBox()。另外,他建议改用nodejs的PhantomJS。我检查了一下,但这种方法对我来说是新的。

我的nodejs + jsdom脚本创建了一个虚拟DOM,我的d3js用它来播放,如下所示:

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-节点 (phantomnpm 模块)。

当你不在 PhantomJS 中打开页面时,你实际上是在一个 about:blank 页面中工作,你需要为底层 PhantomJS 进程添加 '--local-to-remote-url-access=yes' 命令行选项,以便可以加载远程资源。或许--web-security=false, --ssl-protocol=any and ignore-ssl-errors=true可能有必要。

要将其他脚本注入 DOM,您需要使用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()功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 jsdom 迁移到 phantomJS ? (基本 DOM 创建) 的相关文章

随机推荐

  • Clickonce 应用程序的本地安装位置

    我需要知道 clickonce 应用程序安装在哪里 有没有办法通过C 找到这个 作为参考 物理文件最终位于此目录中 Win XP 中的 C Documents and Settings userprofile Local Settings
  • GTK# 中的 Gtk 主题 (Windows)

    我正在尝试更改 GTK 中的主题 操作系统 Windows IDE Xamarin 但我遇到了下一个问题 我只能找到一个正确渲染的主题 它是 Orta 一切都很好 除了滞后和冻结 这是我的代码 string Resource File Or
  • 如何在Python openCV中显示16位4096强度图像?

    我有以灰度 16 位 tiff 格式编码的图像 他们使用 16 位颜色深度的变体 其中最大强度为 4 096 我相信 openCV 中的默认最大强度是 65 536 因此使用以下代码我的图像显示为黑色 import cv2 image cv
  • GAE - 包含外部 python 模块而不将它们添加到存储库中?

    我目前正在开发一个基于 python 的 Google App Engine 项目 具体来说 我在该应用程序中使用 Flask 我想知道包含外部 python 模块的可接受方法是什么 特别是在存储库方面 据我所知 出于多种原因 将其他人的代
  • 无法使用 JRuby 构建 gem 本机扩展

    我将 ruby 版本从 ruby 1 9 3 p125 更改为 JRuby 1 7 0 preview1红宝石构建 当我执行时jruby S bundle install在我的项目中 有一些错误如下 Using bson 1 6 2 Ins
  • 当我们从ios中的json中获取Key时,如何检查Key的值是数组还是对象

    我有2个案例需要解析JSON首先是 post filter data Items ItemID 50cb4e46b5d30b0002000009 ItemName Fruit salad test ItemPrice 122 0 ItemD
  • Rust 对临时值的引用不会报告错误

    我有以下代码 derive Debug pub enum List lt a gt Nil Cons i32 a List lt a gt let x Cons 1 Cons 2 Nil println x 效果很好 我不明白为什么这段代码
  • mysql concat 有没有性能更好的替代方案?

    我正在尝试对两个表应用联接 需要在其上应用联接的列的值不相同 因为我需要使用 concat 但问题是它需要很长时间才能运行 所以这是一个例子 我有两张桌子 表 MasterEmployee 字段 varchar 20 id varchar
  • 根据模板操作,掩模如何影响模板值?

    OpenGL 参考 pdf 中的文档 OpenGL 3 3 和 4 5 规范 对于应用遮罩时存储的模板值会发生什么情况不太清楚 例如如果我有以下掩码 glStencilMask 0x06 并存储在模板缓冲区中已经有这个值 0x06 如果模板
  • 解析 PL/SQL 代码以检查语法和语义错误

    请考虑以下场景 我有一个文本区域 and a Button on UI 用户将在中输入 PL SQL 块文本区域 当用户按下Button 我想检查该块中的语法和语义错误 而不需要执行 it 我真的很想要一个不需要再安装任何东西的解决方案 环
  • Android 中如何让按钮闪烁?

    如果用户 在我的测验游戏中 选择错误答案 则具有正确答案的按钮应呈绿色闪烁 到目前为止我是这样做的 if answerTrue for int i 0 i lt 2000 i i 250 handler postDelayed rbl bl
  • 在java中,一天的开始时间是几点?

    一天的开始时间是几点 比如 01 01 2010 是 00 00 00 000 吗 或者那是午夜 edit 这可能是一个愚蠢的问题 但我很困惑 因为我使用了 Calendar set Calendar HOUR 0 但这给了我 12 00
  • 如何在 segue 展开之前执行条件检查

    VC1继续VC3它有一个键盘和预先确定的可接受输入标签的最低数字 用户可以在此字符串的末尾添加一个数字或删除一个数字 当按下 Accept 键时 string toInt 被传递给VC1Segue 是通过 IBAction func unw
  • hibernate:三元关联映射

    技术说明 Hibernate注释 3 4 0 GA 爪哇1 5 table 用户角色分支columns 用户 ID 角色 ID 分支 ID 对于公司的不同分支机构 用户被分配不同的角色 现在我有一个 java pojo 类 public c
  • 如何向 Hive(0.13.1) 表插入数据?

    我使用的是 Hive 版本 0 13 1 尝试将数据插入现有表时 使用以下查询时出现错误 CREATE TABLE table1 order num int payment type varchar 20 category varchar
  • 过渡不透明度和可见性

    我有一个元素是visibility hidden直到悬停在上方 并在不透明度上进行过渡以实现良好的淡入淡出 问题是淡入淡出只能以一种方式工作 因为当元素立即变成visibility hidden它隐藏了不透明度过渡 我该如何解决这个问题 编
  • 命名查询中的 Hibernate 错误

    我正在尝试从当前日期位于任何给定月份的第一天和最后一天之间的表中提取信息 我收到运行时错误 命名查询中的错误 Department byDate 我向您提供了我认为可能导致问题的代码 如果需要任何其他代码 请在评论中告诉我 我的命名查询如下
  • 在WPF中动态添加文本框

    我正在动态创建一个文本框 我的网格中有 2 列 如果其他文本框值 茶 我想向该行添加新文本框 我想创建新的文本框以更改相应行的文本框值 我无法使用标签来获取此处选定的行 因为我已经出于某种目的使用了 Tag 我对Tag不太了解 无论如何 如
  • 无法在 javascript onreadystatechange 中读取自定义 http 标头?

    当我尝试读取自定义 http headers i am hetting null 时 泽西岛身份验证资源 Path redirect public class RedirectDemo POST Consumes MediaType APP
  • 从 jsdom 迁移到 phantomJS ? (基本 DOM 创建)

    M Bostock 指出 nodejs 的 jsdom 对 svg 的支持不完整 而且 对我来说至关重要的是 不支持getBBox 另外 他建议改用nodejs的PhantomJS 我检查了一下 但这种方法对我来说是新的 我的nodejs