必要はありません.each
- のバージョンを使用して.text
、ミューテーター関数を取り、.each
一致する各要素に対して暗黙的に実行できます。mutator 関数に元のテキストが渡され、戻り値が元の場所に戻されます。
replaceIn = function() {
$('.post em').text(function(ix, txt) {
return txt.replace(/\b(in)\b/g, 'hello');
});
}
http://jsfiddle.net/alnitak/ZUQ4W/を参照してください
一致する要素内に HTML がないため、.text
代わりに使用しました。.html
正規表現と/g
フラグを使用して、「in」のすべての\b
出現が置換されるようにし、マーカーが単語全体のみに一致するようにすることに注意してください。
の文字列バージョンはreplace
、文字列内の最初の一致のみを置き換えることができます。もちろん、それがあなたの意図であれば、代わりにそれを自由に使用してください!
また、子孫を持つ要素で this (または を使用するバリアント) を使用する場合は、非常に注意する必要があります。これ.html
は、外側の要素が内側の要素の前に処理され、外側の要素に対する操作が子孫に予期しない変更を加える可能性があるためです。リーフ ノードのみが変更されるように、セレクターを賢く選択してください。
避けるべきもう 1 つの正当な理由.html()
は、要素をシリアル化してから再度逆シリアル化すると.html()
、その要素に設定されているプロパティやイベントが失われることです。可能な限り、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/を参照してください