【问题标题】:Strange errors with jsdom - node.jsjsdom 的奇怪错误 - node.js
【发布时间】:2011-05-21 15:51:45
【问题描述】:

我正在尝试从示例中运行简单的代码:

require.paths.unshift('/etc/npm'); // path to modules
var httpAgent = require('http-agent'),
    jsdom = require('jsdom'),
    sys = require('sys');

var agent = httpAgent.create('www.twitter.com', ['', 'about']);

agent.addListener('next', function (e, agent) {
  var body = agent.body;
  var window = jsdom.jsdom(body, {},{}).createWindow();
  jsdom.jQueryify(window, 'http://code.jquery.com/jquery-1.4.2.js', function (window, jquery) {
    agent.next();
  });
});

agent.addListener('stop', function (agent) {
  sys.puts('the agent has stopped');
});

agent.start();

但它在这一行返回了很多错误:

var window = jsdom.jsdom(body, {},{}).createWindow();

错误:

kir@nas:~/node$ node test.js

/usr/local/lib/node/.npm/jsdom/0.1.21/package/lib/jsdom/browser/index.js:197
  if (!dom.HTMLDocument.write) {
                       ^
TypeError: Cannot read property 'write' of undefined
    at Object.browserAugmentation (/usr/local/lib/node/.npm/jsdom/0.1.21/package/lib/jsdom/browser/index.js:197:24)
    at Object.jsdom (/usr/local/lib/node/.npm/jsdom/0.1.21/package/lib/jsdom.js:15:25)
    at EventEmitter.<anonymous> (/home/kir/node/test.js:12:22)
    at EventEmitter.emit (events:27:15)
    at Object.emit (/usr/local/lib/node/.npm/http-agent/0.1.0/package/lib/http-agent.js:180:41)
    at /usr/local/lib/node/.npm/http-agent/0.1.0/package/lib/http-agent.js:145:14
    at IncomingMessage.<anonymous> (/usr/local/lib/node/.npm/request/0.10.0/package/lib/main.js:89:7)
    at IncomingMessage.emit (events:41:20)
    at HTTPParser.onMessageComplete (http:107:23)
    at Client.onData [as ondata] (http:848:27)

我有 Ubuntu 10.10 和稳定的 node.js 0.2.5。什么鬼?

【问题讨论】:

    标签: jquery node.js


    【解决方案1】:

    对于 jsom 来说很正常,它正在进行中,DOM API 非常庞大,重新实现所有浏览器怪癖需要很长时间。

    但首先你的调用jsdom.jsdom(body, {},{}).createWindow(); 是错误的,第二个参数应该是一个完全配置的DOM 对象,如果你不提供一个只需传递null 使其回退到一个默认的。

    但在那之后,乌龟就一直往下走。

    例如 Twitter 是这样做的 window.top.location,结果证明 jsdom 没有定义 window.top 和 BOOM!

    解决这个问题...是的,海龟。错误不会停止,如果您有兴趣一直修复它,请打开&lt;npm folder&gt;/jsdom/0.1.21/package/lib/jsdom/level2/languages/javascript.js,在那里您可以记录代码并对window 对象进行修复,直到它工作为止。

    【讨论】:

    • 哦,该死。我很抱歉,jsdom 工作正常,开发完成。使用PHP解析网页会更好。
    【解决方案2】:

    在此澄清一下,您真正​​的问题出在此处:jsdom(html, {}, {})。 jsdom() 的第二个参数是一个级别(level1/core、level2/core、level2/html 等)。通过传递一个空对象,您实际上是在告诉 jsdom 方法在没有相应 W3c 级别的情况下运行。

    【讨论】:

      猜你喜欢
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 2015-09-15
      • 2014-11-11
      • 2014-01-05
      • 2011-07-08
      • 2010-11-17
      相关资源
      最近更新 更多