Как изменить только текст node в элементе

У меня есть следующий html:

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

И я хочу сменить подпись надписи на Title с помощью jquery. Поэтому я делаю

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

И он заменит все внутренние html (с тегом abbr)

Итак, что самый простой способ заменить только Name?

Ответ 1

Если вы используете метод contents(), он также вернет текстовые узлы. Поскольку jQuery не имеет текстовых методов node, преобразуйте последние node в DOM node

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

Демо: http://jsfiddle.net/yPAST/1/

Ответ 2

Извините за поздний ответ... Но вот способ сделать это, используя только jQuery:

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

Ответ 4

Вы можете выбрать только элемент abbr, сохранить его, а затем заменить весь контент на сохраненный элемент плюс измененный заголовок:

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

Смотрите fiddle

Ответ 5

вы можете использовать replace выполнить

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

проверить: http://jsfiddle.net/DyzMJ/

Ответ 6

Решение 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');

Ответ 7

Это решение, которое работало для большинства браузеров

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

Этот приблизился, но дал проблемы в ie8, поскольку textContent не поддерживается

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

Ответ 8

Если вы манипулируете более чем 1 меткой, вы можете выбрать каждую метку и заменить текст на jquery:

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

и для второй метки:

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

и т.д.