我需要更改我的正文內容中的指定文本。更改正文文本(快速方式)
我目前做這種方式:
findAndReplace: function(str, value) {
document.body.innerHTML = document.body.innerHTML.replace('%'+str+'%', value);
}
有沒有更有效的方法?它在大頁面上變得非常緩慢。
我需要更改我的正文內容中的指定文本。更改正文文本(快速方式)
我目前做這種方式:
findAndReplace: function(str, value) {
document.body.innerHTML = document.body.innerHTML.replace('%'+str+'%', value);
}
有沒有更有效的方法?它在大頁面上變得非常緩慢。
你要求瀏覽器在那裏做所有的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正則表達式逃逸」的發現將處理這樣做,對你各種實現)
兩個原因,這可能會更快:
你不是要求發動機產生的HTML每個頁面上的元素,破壞元素,並重新創建它們
你不是無謂地更新文本節點的內容(但同樣,配置文件中的測試是否真的值得)
它也可以防止你的腳本出現問題,例如,如果你連接了事件處理程序,然後你的處理程序不在那裏了。有了上述,他們是不動的。
它現在完美運行,非常感謝你! – Xilef 2014-11-21 19:12:25
@Felix:不用擔心,很高興幫助。 – 2014-11-21 23:10:02
HTML的外觀如何?你想要替換什麼?你的頁面有多大?有更好的方法可以針對替代品嗎? – 2014-11-21 18:58:42
不,我不能給他們一個ID或其他任何東西 – Xilef 2014-11-21 19:00:17
一個更有效的方法是針對一個特定的元素,並改變,只有使用'document.getElementById'而不是'document.body'。你爲什麼不給他們一個ID? – FishBasketGordo 2014-11-21 19:01:25