如何仅更改元素中的文本节点

时间:2012-03-31 13:43:02

标签: jquery

我有下一个HTML:

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

我想用jquery将标签标题更改为Title。所以我做了

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

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

那么,只更换Name的最简单方法是什么?

8 个答案:

答案 0 :(得分:71)

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

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

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

答案 1 :(得分:44)

对于迟到的回复感到抱歉......但是这里有一种只使用jQuery的方法:

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

答案 2 :(得分:3)

It may not be the prettiest way, but this works:

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

答案 3 :(得分:1)

您只能选择abbr元素,存储它,然后用存储的元素和更改的标题替换整个内容:

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

请参阅 fiddle

答案 4 :(得分:1)

您可以使用replace完成此操作

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

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

答案 5 :(得分:1)

将Evans解决方案添加到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');

答案 6 :(得分:1)

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

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

由于不支持textContent,因此这个问题接近但在ie8中出现了问题

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

答案 7 :(得分:0)

如果您正在操作多个标签,则可以选择每个标签并用jquery替换文本:

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

和第二个标签:

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

依旧......