2012-04-17 2 views
5

Я новичок в nodejs. Я хочу использовать jsdom для анализа некоторых веб-страниц, которые могут содержать код скрипта внутри. Но я получил ошибку, указав, что функция или переменная не определены. Может кто-нибудь дать некоторые указания об этом.jsdom не обрабатывает скрипт внутри веб-страницы

мой код

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

и HTML страницы здесь

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

и получил сообщение об ошибке ниже

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) 

Он сообщает функции нагрузки не была определена, но это было на самом деле объявленной на веб-странице.

Может кто-нибудь дать какие-то предложения или просто скажите, что jsdom не может обработать скрипты, встроенные в страницу.

ответ

10

Вот код, который вы хотите иметь:

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

Ваш код не будет работать, так как метод jsdom.env не обрабатывает скрипты.

+0

Спасибо большое Михая, он отлично работает. – user966085

0

Пожалуйста, обратите внимание, что вы должны использовать удивительную библиотеку НПМ request

Попробуйте это:

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

yep, я использую его :-) – user966085

Смежные вопросы