Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript在大型字典中循环会产生无响应的脚本_Javascript_Dictionary_Firefox Addon - Fatal编程技术网

Javascript在大型字典中循环会产生无响应的脚本

Javascript在大型字典中循环会产生无响应的脚本,javascript,dictionary,firefox-addon,Javascript,Dictionary,Firefox Addon,我正在制作一个firefox插件,在html文本中添加单词和其他单词。这段代码是有效的,但是当遍历一个庞大的字典时,我得到了一个无响应的脚本错误 提高这个循环速度的最佳方法是什么 将字典拆分为更小的对象?还是设定一个新的目标 var brands={“manykeys”:“manyvalue”}; 函数replaceWord(){ 对于(var关键品牌){ htmlreplace(键,键+”(“+品牌[键]+”); } } 函数htmlreplace(a,b,element){ 如果(!elem

我正在制作一个firefox插件,在html文本中添加单词和其他单词。这段代码是有效的,但是当遍历一个庞大的字典时,我得到了一个无响应的脚本错误

提高这个循环速度的最佳方法是什么

将字典拆分为更小的对象?还是设定一个新的目标

var brands={“manykeys”:“manyvalue”};
函数replaceWord(){
对于(var关键品牌){
htmlreplace(键,键+”(“+品牌[键]+”);
}
}
函数htmlreplace(a,b,element){
如果(!element)element=document.body;
var节点=element.childNodes;

对于(var n=0;n我没有尝试过,但这样做可能会奏效:

function replaceWord(){
    for (var key in brands){
        (function(key) {
            setTimeout(function() {
                htmlreplace(key, key + " (" + brands[key] + ")");
            }, 0);
        })(key);
    }
}

我们的想法是,当浏览器有时间的时候,您可以推迟替换,而不是单独执行,让浏览器在思考时冻结。

需要考虑一些因素。这在很大程度上取决于您是否可以更改。您可以做的一个更大的改进是使用数组而不是键/值对象。

var brands = [
['manykeys0000','manyvalues0000'],
['manykeys0001','manyvalues0001'],
['manykeys0002','manyvalues0002'],
['manykeys0003','manyvalues0003'],
['manykeys0004', ...
];

function replaceWord(){
    var i, n = brands.length;
    for (i = 0; i < n; ++i) {
        htmlreplace(brands[i][0], brands[i][0] + " (" + brands[i][1] + ")");
    }
}
Chrome和Firefox上的快速基准测试相结合,速度提高了30-40%


要测试的其他编辑:

var r=new RegExp(a,'g');
移动到
replaceWord()
,并将其作为第一个参数传递到
htmlreplace()
,而不是
a

function replaceWord(){
    var i, n = brands.length;
    for (i = 0; i < n; ++i) {
        var r = new RegExp(brands[i][0], 'g');
        htmlreplace(r, brands[i].join(' (') + ')', elem);
    }
}
实现自定义
setZeroTimeout()
,但不确定它将如何影响您的案例


除此之外,请使用浏览器中的分析工具,例如,它可能更适合您在代码中所做的工作。

代码中的瓶颈不是字典大小,除非它确实很大,而是DOM遍历

获取一次文本节点,然后使用它们

var textnodes=$x(“//text()”,document.body)
函数$x(p,上下文){
如果(!context)context=文档;
var i,arr=[],xpr=document.evaluate(p,context,null,XPathResult.UNORDERED\节点\快照\类型,null);
对于(i=0;item=xpr.snapshotItem(i);i++)arr.push(item);
返回arr;
}

你应该会看到速度有了相当大的提高。

我强烈怀疑是正则表达式减慢了速度。在没有它的情况下试试看速度差异。呃。Chrome mangling可能不太适合Firefox插件。谢谢。我想知道我的字典是否太大,因为我的代码仍然冻结。但这是一个很好的答案.
var body = document.body;

...
    htmlreplace(brands[i][0], brands[i][0] + " (" + brands[i][2] + ")", body);

function htmlreplace(a, b, element) {    
    var nodes = element.childNodes, len = nodes.length;
    for (var n=0; n < len; ++n) {
function replaceWord(){
    var i, n = brands.length;
    for (i = 0; i < n; ++i) {
        var r = new RegExp(brands[i][0], 'g');
        htmlreplace(r, brands[i].join(' (') + ')', elem);
    }
}
window.postMessage();