【发布时间】:2016-06-01 07:46:26
【问题描述】:
我正在尝试开发一个 Firefox 插件,可以将任何页面上的文本音译成特定语言。实际上它只是我迭代并使用此代码的一组 2D 数组
function escapeRegExp(str) {
return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}
function replaceAll(find, replace) {
return document.body.innerHTML.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}
function convert2latin() {
for (var i = 0; i < Table.length; i++) {
document.body.innerHTML = replaceAll(Table[i][1], Table[i][0]);
}
}
它可以工作,我可以忽略 HTML 标签,因为它只能是英文,但问题是性能。当然,它非常非常贫穷。由于我没有 JS 经验,所以我尝试 google 并发现 documentFragment 可能有帮助。
也许我应该使用另一种方法?
【问题讨论】:
-
您的
Table是动态的还是静态的?如果是动态的,它为什么会改变?它多久改变一次?Table包含什么样的内容(例如,英文和拉丁字符的列表(猜想convert2latin)?)?您显然是在尝试适应Table包含一些特殊字符的可能性。Table的内容来源是什么?请提供一些输入和输出的例子。我们需要知道您期望的输入和输出,以便评估解决该问题的其他潜在方法。 -
@Makyen 这是我使用的 python 测试脚本。 JS 表只是对其语法进行更改的复制粘贴。 github.com/Pugnator/JLPTrainer/blob/master/jpconvert.py 主要思想是遍历俄语文本并将每个音节转换为日语类似物。这个插件的目标是帮助人们以更简单的方式记住日文符号,而无需打磨
-
您的 Python 代码使用了不使用正则表达式的
string.replace()。您使用正则表达式进行匹配是否有原因?如果您只使用普通字符串进行匹配,它应该会更快。如果您要使用 RegExp,看起来是一个您多次执行的静态替换数组,您通常最好只创建每个 RegExp 一次并将其存储(例如在Table[i][3]中)以供使用而不是重新- 每次创建每个 RegExp(昂贵)。 -
@Makyen 不,没有具体原因。我是 web 和 JS 的新手。有人告诉我,造成巨大滞后的主要原因是每次替换时都要重建 DOM。这样它总是会滞后
-
确实如此,它应该为您提供了足够的信息来显着提高性能。
标签: javascript performance firefox-addon