如何使用jsdom从节点REPL解析DOM

how to parse a DOM with jsdom from a node REPL

本文关键字:REPL 解析 DOM 节点 何使用 jsdom      更新时间:2023-09-26

我正在尝试编写一些DOM解析代码,以便在节点REPL环境中运行。以下是SSCCE:

"use strict";
var jsdom = require("jsdom");
var html="<a></a>";
function parse(html, x) {
    jsdom.env(html, function(errors, window) {
        x.window = window;
    });
}
var x = {};
parse(html, x);
console.log(x.window);

其想法是,在调用parse函数后,我将在x对象中获得解析后的DOM。

当我把上面的代码放在文件j.js中并从REPL加载时,我得到:

> .load j.js
> "use strict";
'use strict'
> var jsdom = require("jsdom");
undefined
> var html="<a></a>";
undefined
> function parse(html, x) {
...     jsdom.env(html, function(errors, window) {
.....         x.window = window;
.....     });
... }
undefined
> var x = {};
undefined
> parse(html, x);
undefined
> console.log(x.window);
undefined
undefined
> 

为什么代码未能分配x.window属性?

jsdom.env回调将异步求值。这意味着在大多数情况下(可能总是)console.log(x.window)x.window = window;分配之前执行。

最简单的修复方法是传递一个回调函数,该函数在分配后执行:

...
function parse(html, x, done) {
    jsdom.env(html, function(errors, window) {
        x.window = window;
        done();
    });
}
var x = {};
parse(html, x, function() {
    console.log(x);
});