Web Workers中的CSS选择?

时间:2016-03-31 04:07:35

标签: javascript html dom css-selectors web-worker

我想从Web Worker中的HTML字符串中提取数据。

我想澄清我不想操纵DOM 。我正在向Web Worker发送一个HTML字符串,然后它应该从HTML中提取数据,然后返回提取的数据。

在浏览器中,我可以这样做:

  var html = $("<body><div>...more html...</div></body>");

  var extractedText = $(".selector", html).text();

我的问题:

如果给出相同的HTML字符串,那么Web Worker环境中上述代码的等价物是什么?在Web Worker等中没有jQuery,没有DOMParser,没有querySelector ..还有其他选择吗?

为什么:

我正在浏览浏览器中的页面,并且不想阻止UI线程,因为它的工作非常繁重。

我已经看过jsdom,cheerio等,但却无法弄清楚如何让它们发挥作用。

关于建议的重复项:

我已经审核了两个建议的重复项,它们是我在搜索此问题的答案之前已阅读过的重复项。它们解决了XML解析而不是HTML解析,也没有解决如何在Web Workers中使用CSS选择。

2 个答案:

答案 0 :(得分:0)

简短回答:

  

您不能在Web worker中进行任何类型的HTML / CSS操作,包括查询。

答案很长:

有很多DOM。有一个主要的DOM,它在页面上呈现,但浏览器所做的一切都涉及HTML或XML树,包括querySelector和朋友,需要浏览器为该树构建一个DOM。 (另见:DocumentFragment

Mozilla的一位开发人员谈到了他们无法在工作线程上构建任何DOM的一些原因(在this question上通过nabble找到):

  

您假设DOM实现代码中没有一个使用任何类型的非DOM对象,或者如果这些对象完全是线程安全的话。事实并非如此,至少在Gecko。

     

在这种情况下的问题不是在多个线程上触及的DOM对象。问题是不同线程上的两个DOM对象都触及了一些全局第三个对象。

     

例如,XML解析器必须做一些Gecko只能在主线程上完成的事情(DTD加载,随意;还有一些我之前见过但不记得的其他东西)。

因此。我们显然不能使用querySelector,createElement或者在worker中有用的任何东西,那么我们能做些什么呢?

当然,构建我们自己的DOM解析器/选择器模块!

不是真的。尝试在您的工作人员中加入htmlparser2的副本,也许可以通过browserify(使这项工作成为自己的问题)。有了它,并且CSSselect允许querySelector - 就像选择一样,你应该准备好了。

诚然,你不能使用jQuery,但是对于简单的查询需求,他们(以及querySelector / querySelectorAll)应该绰绰有余。

答案 1 :(得分:0)

您可以在worker内部进行dom选择,但您需要创建一个API,该API将使用发布消息在主踏步和worker之间更改数据(因为您不能直接在worker中使用DOM)。局限性在于您将需要在它们之间传递字符串,因此您将无法返回Dom节点,除非您有一些代码可以根据主脚踏区的数据在worker中创建DOM节点。

由于JavaScript是动态的,因此创建动态包装程序应该很容易,该包装程序将为您创建所有这些功能,并允许调用querySelelector('.foo')并公开所有Dom API。使用代理对象,您甚至可以允许工人使用正确的代码使用querySelelector('.foo').innerHTML = 'hello';

有一个库可以使Google Comlink的API的创建更加轻松。如果您不想使用库,则可以检查此代码,该git Web终端使用类似RPC的代码向工作人员公开同构git函数(受Jason's Miller的启发 workerize)。

快速搜索使该项目看起来很有前途"Worker DOM",它应该为您提供worker中的DOM api(我几乎可以肯定使用我提出的解决方案),但是我没有检查它,并且我没有确定如何运作。

通过一些工作,您甚至可以在worker中使用jQuery,这将是开源项目的好项目。