不需要.each
- 您可以使用.text
版本,該版本採用增變函數並在每個匹配元素上執行隱式的.each
。增變函數傳遞原文,並且返回值被放回原來的位置:
replaceIn = function() {
$('.post em').text(function(ix, txt) {
return txt.replace(/\b(in)\b/g, 'hello');
});
}
見http://jsfiddle.net/alnitak/ZUQ4W/
我用.text
代替.html
因爲有匹配的元素內部沒有HTML。
注意與/g
標誌使用正則表達式,以確保所有出現的「在」替換和\b
標記,以確保它僅匹配整個單詞。
字符串版本replace
只能替換字符串中的第一個匹配項。當然,如果這是您的意圖,請隨時使用它!
另請注意,如果您在具有後代的元素上使用此元素(或使用.html
的變體),則必須非常小心,因爲外部元素在內部元素之前得到處理,外部元素上的操作可能會對後代進行意外更改。明智地選擇你的選擇器,以便只改變葉節點!
另一個很好的理由,以避免.html()
是,如果你連載的元素,然後用.html()
然後再次deserialise它已經被設置元素上的任何屬性或事件都將丟失。儘可能使用HTML字符串操作對DOM進行更改而不使用!
爲了安全起見,使用此:
replaceIn = function() {
$('.post em').contents().filter(function() {
return this.nodeType === 3;
}).each(function() {
// NB: DOM level 3 uses .textContent in preference to .nodeValue
this.nodeValue = this.nodeValue.replace(/\b(in)\b/g, 'hello');
});
}
這使得絕對相信,任何嵌套元素(例如一個index
標籤!)不能被修改。
見http://jsfiddle.net/alnitak/rZU5d/
感謝您的支持,它的確如我所願。 +1的額外信息。在實際的頁面中,我試圖替換它上面的文本不包含任何html標記,所以在這裏使用'.text'就可以了。 – dev 2013-02-14 12:28:27
有關不使用的詳細說明:+1 – Cerbrus 2013-02-14 13:24:45