2012-03-31 4 views
38

У меня есть следующий HTML:Как изменить только текстовый узел в элементе

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

И я хочу, чтобы изменить метку подписи к Title с JQuery. Так что я

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

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

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

+0

Похож на дубликат ** [В jQuery, как я могу изменить текст элемента без изменения его дочерних элементов?] (Http://stackoverflow.com/questions/4106809) ** – hippietrail

ответ

58

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

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

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

+1

Предположим, нравится манипулировать только 1 меткой –

+0

Интересно .. У меня есть только одна метка для каждого ввода, поэтому мне подходит – MikDiet

+2

Примечание: свойство 'textContent' * не * доступно в IE до версии 9. –

1

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

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

Смотрите эту fiddle

+0

Я делаю это похоже, спасибо – MikDiet

1

вы можете использовать replace достижения этой цели

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

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

+0

Я не знаю, какой ярлык будет .. может быть «Name», может быть что-то еще .. – MikDiet

1

решения Evans добавлено в JQuery сноски, чтобы это использовать удобный:

// 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');

34

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

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

Вы сохранили этот день. Спасибо :) –

+1

Это работало для меня в IE10 и jquery 1.4 – dxrsm

+1

Обратите внимание, что строка 'replaceWith' обрабатывается как HTML; если он содержит теги, он будет разбираться с элементами DOM. – holmis83

0

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

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

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

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

Примечание: свойство 'textContent' * не * доступно в IE до версии 9. –

0

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

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

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

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

и так далее ...