我正在为Firefox开发扩展程序。
总而言之,假设这是一个应用于很多错误页面的拼写检查器。
但这非常慢,因为步骤太多。
(1)我创建了一个TreeWalker,它仅过滤非空文本节点
var tree = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, {
acceptNode: function(node) {
if (node.parentNode.nodeName !== "SCRIPT" && node.nodeValue.trim().length > 0) {
return NodeFilter.FILTER_ACCEPT;
}
}
}, false);
(2)一会儿循环浏览了TreeWalker
(3)在此while循环中,for循环使用复杂的RegEx
const dico = [
['suffix1','suffix2','correction'],
['','',''],
['','',''],
// a lot of lines
];
(4)文本已替换
dl = dico.length;
function skim(){
while (tree.nextNode()) {
for (var i=0; i < dl ; i++) {
var r1 = new RegExp("([a-zÀ-ÖÙ-öù-üœŒ]+)?(" + dico[i][0] + ")[-/·∙.•](" + dico[i][1] + ")[-/·∙.•]?(s)?(?![a-z])", "gi");
tree.currentNode.nodeValue = tree.currentNode.nodeValue.replace(r1, dico[i][3]);
}
}
}
此外,我想使用另一个突出显示拼写错误的功能,这意味着在文本节点之间添加了很多元素节点。
我该如何优化呢? :)
目前,我发现的唯一解决方案是简化字典,但是我到此结束了。并用等效项替换TreeWalker
,但速度更快。
谢谢!
答案 0 :(得分:0)
这是KostasX和Jonas Wilms的主张的更新。
那要快得多,因为它可以记住正则表达式,因此不必在每个节点上都重新创建它们。
另外,它异步迭代,以不阻塞UI。
function skim() {
dicomap.map((replace_entry)=>{
tree.currentNode.nodeValue = tree.currentNode.nodeValue.replace(replace_entry[0],replace_entry[mode]);
});
if(tree.nextNode()) setTimeout(skim);
}
skim();