2012-04-17 31 views
5

Tôi mới làm quen với các nút. Tôi muốn sử dụng jsdom để phân tích một số trang web có thể chứa mã script bên trong. Nhưng tôi đã nhận lỗi nói rằng hàm hoặc biến không được xác định. Bất cứ ai có thể đưa ra một số hướng dẫn về điều này.jsdom không xử lý tập lệnh bên trong trang web

mã của tôi

var jsdom = require('jsdom'); 

jsdom.env({ 
    html: 'http://10.200.0.10:8080/test/a.html', 
    scripts: [ 
    'http://code.jquery.com/jquery-1.5.min.js' 
    ], 
    done: function(errors, window) { 
    var $ = window.$; 
    window.onload(); 
    console.log(window.a); 
    } 
}); 

và trang html đây

<html> 
<head> 
    <script> 
    var a = 0; 
    function loads(){ 
     a=1000; 
    } 
    </script> 
</head> 
<body onload='loads()'> 
</body> 
</html> 

và nhận được thông báo lỗi dưới đây

dfddddfdf 
undefined:1: ReferenceError: loads is not defined 
loads() 
^ 
ReferenceError: loads is not defined 
    at unknown source 
    at /root/node_modules/jsdom/node_modules/contextify/lib/contextify.js:10:24 
    at /root/node_modules/jsdom/lib/jsdom/level1/core.js:1024:50 
    at /root/testnode.js:18:12 
    at Array.0 (/root/node_modules/jsdom/lib/jsdom.js:199:39) 
    at EventEmitter._tickCallback (node.js:192:40) 

node.js:201 
     throw e; // process.nextTick error, or 'error' event on first tick 
      ^
ReferenceError: loads is not defined 
    at unknown source 
    at /root/node_modules/jsdom/node_modules/contextify/lib/contextify.js:10:24 
    at /root/node_modules/jsdom/lib/jsdom/level1/core.js:1024:50 
    at /root/testnode.js:18:12 
    at Array.0 (/root/node_modules/jsdom/lib/jsdom.js:199:39) 
    at EventEmitter._tickCallback (node.js:192:40) 

Nó báo cáo tải chức năng đã không được xác định, nhưng nó thực sự là được khai báo trong trang web.

Bất kỳ ai có thể đưa ra một số gợi ý hay chỉ đơn giản là cho tôi biết jsdom không thể xử lý các tập lệnh được nhúng trong trang.

Trả lời

10

Dưới đây là đoạn code mà bạn muốn có:

var fs = require('fs'); 
var jsdom = require('jsdom'); 
var doc = jsdom.jsdom(fs.readFileSync("a.html"), null, { 
      features: { 
      FetchExternalResources : ['script'], 
      ProcessExternalResources : ['script'], 
      MutationEvents   : '2.0', 
     } 
    }); 

var window = doc.createWindow(); 
jsdom.jQueryify(window, "http://code.jquery.com/jquery-1.5.min.js", function() { 
    console.log(window.a); 
    console.log(window.$().jquery); //jquery version 
}); 

Mã của bạn sẽ không hoạt động vì phương pháp jsdom.env không xử lý kịch bản.

+0

Cảm ơn Mihai rất nhiều, nó hoạt động tốt. – user966085

0

Xin lưu ý rằng bạn nên sử dụng một thư viện NPM tuyệt vời request

Hãy thử điều này:

var http = require('http'), 
    jsdom = require('jsdom'), 
    request = require('request'); 

var server = http.createServer(function (request, response) { 
    getPage("http://isohunt.com/torrents/?iht=-1&ihq=life+is+beautiful", function (body) { 
     jsdom.env({ 
      html: body, 
      scripts: ['http://code.jquery.com/jquery-1.6.min.js'] 
     }, function(err, window){ 
      var $ = window.jQuery; 
      //your code goes here 

     }); 
    }) 
}); 
server.listen(3000); 

function getPage(someUri, callback) { 
    request({uri : someUri}, function (error, response, body) { 
     callback(body); 
    }); 
} 
+0

vâng, tôi đang sử dụng nó :-) – user966085

Các vấn đề liên quan