如何只改变元素中的文本节点

我有下一个html:

<label for="user_name"> <abbr title="required">*</abbr> Name </label> 

我想用jQuery将Title更改为Title 。 所以我呢

 $('label[for=user_name]').html('Title') 

它将取代所有的内部html(带有abbr标签)

那么,什么是最简单的方法来replace只有Name

如果使用contents()方法,它也会返回文本节点。 由于jQuery没有文本节点方法,因此将最后一个节点转换为DOM节点

 $('label[for="user_name"]').contents().last()[0].textContent='Title'; 

演示: http : //jsfiddle.net/yPAST/1/

对不起,迟到的回复…但是这是一个只使用jQuery的方法:

 $('label').contents().last().replaceWith("Title"); 

这可能不是最漂亮的方式,但这是有效的:

 var $label = $('label[for=user_name]'); $label.html($label.html().replace("Name", "Title")); 

您只能selectabbr元素,存储它,然后用存储的元素加上更改的标题replace整个内容:

 ​$('label[for="user_name"]').each(function(){ var a = $(this).children('abbr'); $(this).html(a).append('Title'); }); 

看到这个小提琴

你可以使用replace完成这个

  var html = $('label[for=user_name]').html().replace('Name','Testing'); $('label[for=user_name]').html(html); 

检查它: http : //jsfiddle.net/DyzMJ/

埃文斯解决scheme添加到jquery fn,使其使用舒适:

 // get/change node content not children jQuery.fn.content = function( n ){ var o = $(this).clone(); var c = o.children().remove(); if (typeof n === "string" ){ o.html(n); $(this).html(c).append(n); } return o.html(); } 

用法: $('myselector').content('NewContentString');

这是适用于大多数浏览器的解决scheme

 $('label[for="user_name"]').contents().last()[0].nodeValue = 'Title'; 

这一个接近,但由于textContent不支持,在ie8中给了问题

 $('label[for="user_name"]').contents().last()[0].textContent='Title'; 

如果你操作多个标签,你可以select每个标签并用jqueryreplace文本:

 $('label[for="user_name"]').contents().last().replaceWith("Title"); 

和第二个标签:

 $('label[for="user_lastname"]').contents().last().replaceWith("Title2"); 

等等 …