2014-11-21 70 views
-1

我需要更改我的正文內容中的指定文本。更改正文文本(快速方式)

我目前做這種方式:

findAndReplace: function(str, value) { 
    document.body.innerHTML = document.body.innerHTML.replace('%'+str+'%', value); 
} 

有沒有更有效的方法?它在大頁面上變得非常緩慢。

+0

HTML的外觀如何?你想要替換什麼?你的頁面有多大?有更好的方法可以針對替代品嗎? – 2014-11-21 18:58:42

+0

不,我不能給他們一個ID或其他任何東西 – Xilef 2014-11-21 19:00:17

+0

一個更有效的方法是針對一個特定的元素,並改變,只有使用'document.getElementById'而不是'document.body'。你爲什麼不給他們一個ID? – FishBasketGordo 2014-11-21 19:01:25

回答

2

你要求瀏覽器在那裏做所有的DOM元素,爲它們創建HTML,將HTML交給JavaScript層,從JavaScript層接受新的HTML,銷燬所有舊元素,並從新字符串中完全重建頁面。

如果你要替換的文本只發生爲元素中的文本(不標籤,如<div not-here>but yes here</div>),你可能有更好的運氣做一個遞歸DOM散步:

walk(document.body, new RegExp('%' + str + '%', "g"), "the replacement"); 
function walk(node, target, replacement) { 
    var child, text, newText; 

    switch (node.nodeType) { 
    case 1: // Element 
     for (child = node.firstChild; 
      child; 
      child = child.nextSibling) { 
     walk(child, target, replacement); 
     } 
     break; 

    case 3: // Text node 
     text = node.nodeValue; 
     newText = text.replace(target, replacement); 
     if (text != newText) {    // Profile to see if this test matters 
      node.nodeValue = text; 
     } 
     break; 
    } 
} 

注意,我我在那裏使用了一個正則表達式,否則只有第一次被替換。請注意,如果str包含正則表達式中特殊的任何字符(例如^.,*等),則需要轉義它們。 (搜索「的JavaScript正則表達式逃逸」的發現將處理這樣做,對你各種實現)

兩個原因,這可能會更快:

  1. 你不是要求發動機產生的HTML每個頁面上的元素,破壞元素,並重新創建它們

  2. 你不是無謂地更新文本節點的內容(但同樣,配置文件中的測試是否真的值得)

它也可以防止你的腳本出現問題,例如,如果你連接了事件處理程序,然後你的處理程序不在那裏了。有了上述,他們是不動的。

+1

它現在完美運行,非常感謝你! – Xilef 2014-11-21 19:12:25

+0

@Felix:不用擔心,很高興幫助。 – 2014-11-21 23:10:02