2015-09-06 55 views
0

我有一个Chrome扩展程序,它取代了网页上的某些词组。它使用2维数组。 [i] [1]替换[i] [0]中提供的文本。如何根据需要只调用一次该函数?

for (var i = 0; i < array.length; i++) { 
    findAndReplaceDOMText(document.body, { 
     preset: 'prose', 
     find: array[i][0], 
     replace: array[i][1] 
    }); 
} 

此代码工作正常但因为它调用,而不仅仅是一次findAndReplaceDOMText功能多次似乎计算昂贵。是否可以将函数内部的for循环移动到只包装findreplace params?如果是这样的话会是什么样子?我只能尝试这个控制台错误。

编辑:该函数遍历DOM,查找包含find处提供的正则表达式短语的所有可见人类可读文本,并用replace处提供的字符串替换。

+4

那并发症etely取决于该功能的功能。 – SLaks

+1

使用循环[标签](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label)。 – Vidul

+1

@SLaks他正在使用[此项目](https://github.com/padolsey/findAndReplaceDOMText) – fixmycode

回答

1

不修改函数的行为,你不能。 可能做的是分离查找和替换通行证。

你的字符串存储在一种难以横向的方式,让我们平坦出来:

var flatFind = array.map(function(elem){ 
    return elem[0] 
}) 

var flatReplace = array.map(function(elem){ 
    return elem[1] 
}) 

然后,你需要创建一个包含所有的搜索字符串正则表达式的字符串:

var searchString = "/("+flatFind.join("|")+")/g" 

然后将它传递给函数,使用函数找到匹配的索引:

findAndReplaceDOMText(document.body, { 
    preset: 'prose', 
    find: searchString, 
    replace: function(portion, match){ 
     var idx = flatFind.indexOf(match) 
     if(idx > -1) return flatReplace[idx] 
     else throw "hey, there's no replacement string for this!" 
    } 
}) 
+0

为了安全起见'array [i] [0]'需要一些转义。 – Oriol

+0

你是对的,但这是@rorykoehler确定,让我们假设它只是短语 – fixmycode

+1

感谢你。这非常有教育意义。我将此标记为正确的答案,因为它比@ Matmarbon的答案更详细,尽管答案基本相同。 – rorykoehler

1

您可以尝试使用replace参数作为函数。 find-configuration-property然后需要是由您的搜索字符串(如/first|second|third/g)构建的正则表达式(RegExp -object)。最后不要忘记g-修饰符。

因为replace -configuration-property然后创建一个函数,检查哪个字符串发生(你得到它作为你的函数的第二个参数)。根据匹配,您返回相应的值(例如,如果match"first",则返回"1st"。如果match"second",则返回"2nd"等)。

+0

感谢这是我正在寻找的 – rorykoehler

相关问题