如何更快地解析DOM节点?

时间:2019-06-25 00:23:06

标签: javascript dom google-chrome-extension

我有一个chrome扩展内容脚本,该脚本尝试使用html节点中的textcontent来匹配对象数组中的字符串。如果存在匹配项,扩展名将用新的html替换包含该匹配项的html。

我在匹配方面遇到问题。包含字符串的数组由2367个对象组成,每个对象都包含一个name属性。

我实现了TreeWalker来将要解析的节点范围缩小到仅包含带有文字的文本的节点。

基本上,我正在尝试查找包含字符串匹配项的节点的交集。但是,我针对该问题采取的每种方法都会导致执行时间花费5分钟或更长时间和/或CPU瓶颈。我希望你们能够指出我做错了什么,或者将我发送给其他人。预先感谢!

到目前为止,我所有寻找匹配项的尝试都包括RegEx的一些实现。 replace()似乎是最费力的,但是test()并没有带来太多改善。

为了遍历节点数组和字符串对象数组,我尝试了for..of循环,for循环,带有嵌套forEach()的{​​{1}}和forEach()和嵌套的filter()

这是内容脚本的简单版本。

some()

这是const test = (players) => { let body = document.body; let bodyCopy = body.cloneNode(true) let treeWalker = document.createTreeWalker( bodyCopy, NodeFilter.SHOW_TEXT, node => { let regex = /\w+/gi if (regex.test(node.textContent)) { return NodeFilter.FILTER_ACCEPT; } else { return NodeFilter.FILTER_SKIP; } } ); let nodes = []; while (treeWalker.nextNode()) { nodes.push(treeWalker.currentNode); } const intersection = (_players, _nodes) => { let matchedPlayers = []; matchedPlayers = _players.filter(player => { return _nodes.some((node) => { let re = new RegExp(player.name.full, 'i') return re.test(node.textContent) }) }) console.log (matchedPlayers); } return intersection(players, nodes) } chrome.runtime.onMessage.addListener( function (request, sender, sendResponse) { if (request.message === "test") { console.log(request.players) test(request.players) sendResponse({ gotIt: "Got it!" }) } } ) 数组中的对象的样子

request.players

0 个答案:

没有答案