如何只改变元素中的文本节点
我有下一个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");
等等 …