node.js:jsdom 的问题 - jQuery 对象返回未定义

Posted

技术标签:

【中文标题】node.js:jsdom 的问题 - jQuery 对象返回未定义【英文标题】:node.js: problems with jsdom - jQuery object returns undefined 【发布时间】:2012-08-18 06:38:03 【问题描述】:

我有兴趣为其中一个项目进行一些服务器端 DOM 操作,因此我决定查看node.js,尤其是jsdom。我对 node.js 完全陌生,所以我的错误可能很明显,但无论如何我都无法在任何地方找到我的问题的解决方案......

首先我在Windows本地运行node,也使用在线IDEcloud9

值得一提,因为我在为 node 安装最新的 jsdom 包(即 0.2.15)时遇到了麻烦,因为必需的依赖项 contextify 在 Windows 下无法编译(需要 C++ 和 Python,而且我发现 npm 没有支持构建 C++ 包)。所以我采取了两种替代方法:

    我安装了一个不依赖于 contextify 的旧版本,即 jsdom@0.2.1。这是我目前拥有的 npm 列表

    └─┬ jsdom@0.2.1
      ├── cssom@0.2.5
      ├── htmlparser@1.7.6
      └── request@2.10.0
    

    当我尝试运行取自 jsdom github repo cloud9 的简单测试脚本时返回此警告

    The "sys" module is now called "util". It should have a similar
    

    我试图解决这个问题,将所有提到的 sys 替换为 util,错误消失了......(仍然不确定这是正确的做法......)。所以,最后当我尝试运行这个 sn-p

    var jsdom = require("jsdom");
    
    jsdom.env("http://nodejs.org/dist/", [
      'http://code.jquery.com/jquery-1.5.min.js'
    ],
    function(errors, window) 
      console.log("there have been", window.$("a").length, "nodejs releases!");
    );
    

    我发现window.$ === undefined。尝试在 cloud9 上使用节点 v0.6.x 和节点 v0.4.x 以及在本地使用节点 v0.8.7 运行。

    我尝试做的另一件事是安装最新的 jsdom@0.2.15,从 here 上获取已编译的 contextify,安装 bindings 并将其添加到 contextify/node_modules,因为 contextify 依赖于它。我根本无法让它工作=(没有浪费太多时间,因为这似乎是一种错误的方法,并且 contextify 不是最新的。

    这里是 npm 列表

    └─┬ jsdom@0.2.15
      ├─┬ contextify@0.1.2
      │ └── bindings@1.0.0
      ├── cssom@0.2.5
      ├── htmlparser@1.7.6
      └── request@2.10.0
    

另外,这是我的cloud9 workspace,不要害羞。

任何帮助表示赞赏。也许还有其他更好的方法来完成我想要的。

谢谢。

【问题讨论】:

这并不是一个真正的答案,而是一个提示,我确实有机会使用它,但github.com/MatthewMueller/cheerio 似乎比 jsdom 更有趣,jsdom 速度很慢,只能解析格式良好的 html。 谢谢@3on!我能够在不到半分钟的时间内安装它并开始与cheerio 混在一起!我肯定会仔细看看。一直在搞乱 jsdom 我知道有更好的方法 ;) 【参考方案1】:

Cheerio 是不久前推出的一个新模块,它比 jsdom 更易于使用,并且可以访问许多可以使用 jsdom 运行的问题。

jsdom 很棒,但如果你需要解析无效的 HTML,你必须使用 html5 解析器模块,它非常难以使用,它超级慢,而且对开发人员不友好。

还有PhantomJS要考虑:http://phantomjs.org我的bootstrap开始使用jQuery。https://github.com/sgentle/phantomjs-node(这是这样的hack,我无语了)

【讨论】:

谢谢! :) 在与 contextify 和 jsdom 混了几个小时之后。这令人耳目一新。

以上是关于node.js:jsdom 的问题 - jQuery 对象返回未定义的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs 学习笔记 - 借助 JSDOM 使用 jQuery

Node.js:如何将 JS 变量值从脚本传递到终端?

Node.js写爬虫系列之第1章

Nodejs 学习笔记 jquery 使用

querySelectorAll()在与jsdom一起使用时返回空节点列表

使用 node.js 在 Windows 上抓取网站