DOM web worker 内部的操作

DOM manipulation inside web worker

我知道workers不能直接操作文档,但是DOMAPI方法呢?他们去哪儿了?!

例如,如果我发出接收 HTML 片段的请求,如果只需要解析它以便从特定节点检索一些数据,我应该怎么做?!

绝对没有办法在网络工作者上使用虚拟DOM?!

起初您可能认为解析 XML 的正确方法是 XMLHttpRequest,在 10 例中有 9 例是正确的。但是,在当前的 Web Worker 规范中,我们无法访问 XMLHttpRequest。另一种方法是使用一些流行的 XML 解析库之一:

https://github.com/isaacs/sax-js

http://xmljs.sourceforge.net/index.html or https://www.npmjs.com/package/xmljs

HTML 就是 XML,所以你可以用这种方式解析你的数据。使用上面 npmjs 中的 xmljs 的示例:

var XmlParser = require("xmljs");
var fs = require("fs");


var p = new XmlParser({ strict: true });
var xml = fs.readFileSync("./SOAP1.xml"); // XML in the examples direct 
var xmlNode = p.parseString(xml, function(err, xmlNode) {
    if(err) {
        console.error(err);
        return;
    }
    var nodes = xmlNode.path(["Envelope", "Body", "GetstockpriceResponse", "Price"], true);
    console.log(nodes.map(function(n) { return n.text; }));
});

浏览器支持

DOMParserdocument.implementation 通常用于在浏览器中将 HTML 解析为 DOM。在 worker 上下文中均不可用。

在 Firefox 中,这是不可能的,因为有人决定所有线程只有一个 DOM 解析器实例。看到这个错误:https://bugzilla.mozilla.org/show_bug.cgi?id=677123

在google chrome中也不起作用。

解决方法 - 外部库

没错,由于浏览器开发人员没有意识到 DOM 和 XML 解析将成为 WebWorkers 的主要用途之一,我们将不得不回退到外部库。最好的选择似乎是 JSDOM, but you'll need to figure out how to browserify it.


这是我对 DOMParser 的失败尝试,我保留它以备将来关于此主题的实验:https://jsfiddle.net/svaqb2wn/2/

您可以在 Web Worker 中使用 DOM 实现之一 运行: