2012-04-17 16 views
5

Soy nuevo en nodejs. Quiero usar jsdom para analizar algunas páginas web que pueden contener código de script dentro. Pero recibí el error, dijo que la función o variable no estaba definida. ¿Alguien puede dar algunas indicaciones sobre esto?jsdom no procesa el script dentro de la página web

mi código

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

y la página HTML aquí

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

y el mensaje de error tiene a continuación

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) 

En ella se informa a la función de las cargas no se ha definido, pero en realidad era declarado en la página web.

¿Alguien puede dar algunas sugerencias, o simplemente decirme jsdom no puede procesar los scripts incrustados en la página.

Respuesta

10

Aquí está el código que desea tener:

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

Su código no funcionará porque el método jsdom.env no procesa secuencias de comandos.

+0

Gracias un montón Mihai, que funciona bien. – user966085

0

Tenga en cuenta que debe utilizar una biblioteca de NPM impresionante request

Prueba esto:

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

sí, lo estoy usando :-) – user966085

Cuestiones relacionadas