2010-12-07 81 views
1

我试图从运行简单的例子代码:与jsdom奇怪的错误 - Node.js的

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(); 

误差修改:

[email protected]:~/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) 

我有稳定的node.js 0.2.5的Ubuntu 10.10。 WTF?

回答

7

对于jsom来说是正常的,它的工作正在进行中,DOM API是巨大的,重新实现所有的浏览器怪癖需要很多时间。

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

但之后,它的乌龟一直下降。

Twitter的例子是否这样做window.top.location,事实证明,jsdom没有定义window.top和BOOM!

修复......是啊,海龟。错误不会停止,如果您有兴趣修复它,请打开<npm folder>/jsdom/0.1.21/package/lib/jsdom/level2/languages/javascript.js,在那里您可以记录代码并修复window对象,直到它工作。

+0

哦,狗屎。我道歉,jsdom工作正常,开发完成。使用PHP解析网页会更好。 – Kir 2010-12-07 17:38:17

3

作为一个澄清在这里,你真正的问题在这里:jsdom(html,{},{})。 jsdom()的第二个参数是一个级别(level1/core,level2/core,level2/html等)。通过传递一个空对象,你基本上可以告诉jsdom方法在没有相应的W3c级别的情况下运行。