2015-09-06 57 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

相關問題