2012-03-31 13 views
38

ich als nächstes html haben:Wie nur Textknoten in Element ändern

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

Und ich will Etikettenbeschriftung zu Title mit Jquery ändern. So mache ich

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

Und sie alle inneren html ersetzen (mit abbr tag)

Also, was ist der einfachste Weg zu ersetzen, nur Name?

+0

Sieht aus wie ein Duplikat von ** [In jQuery Wie kann ich den Text eines Elements ändern, ohne seine untergeordneten Elemente zu ändern?] (Http://stackoverflow.com/questions/4106809) ** – hippietrail

Antwort

58

Wenn Sie contents() Methode verwenden, wird es auch Textknoten zurück. Da jQuery nicht Textnode Methoden haben, konvertieren letzten Knoten zu einem DOM-Knoten

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

Demo: http://jsfiddle.net/yPAST/1/

+1

Nehmen wir an, er hat nicht mag nur 1 Etikett manipulieren –

+0

Interessant .. Ich habe nur ein Etikett pro Eingang, so ist es für mich geeignet – MikDiet

+2

Hinweis: die 'textContent' -Eigenschaft ist * nicht * in IE vor Version 9 verfügbar. –

1

Sie können nur das abbr Element auswählen, speichern, und dann mit dem gespeicherten Element und die geänderte Beschriftung den gesamten Inhalt ersetzen:

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

Sehen Sie diese fiddle

+0

Ich mache es ähnlich, danke – MikDiet

2

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

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

oops !! gleiche Antwort, die ich gepostet habe .. so spät zu bekommen :( – Jigs

+0

haha ​​keine Sorgen :) –

1

Sie können replace verwenden erreichen dies

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

es überprüfen: http://jsfiddle.net/DyzMJ/

+0

Ich weiß nicht, welches Label wird .. kann "Name" sein, kann etwas anderes .. – MikDiet

1

Evans Lösung jquery fn zu machen hinzugefügt komfortabel es ist zu verwenden:

// 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(); 
} 

Usage: $('myselector').content('NewContentString');

34

Sorry für die späte Antwort ... Aber hier ist eine Möglichkeit, dies nur mit jQuery:

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

Sie haben den Tag gespeichert. Danke :) –

+1

Dies funktionierte für mich in IE10 und jquery 1.4 – dxrsm

+1

Beachten Sie, dass eine Zeichenfolge zu 'replaceWith' wie HTML behandelt wird; Wenn es Tags enthält, wird es nach DOM-Elementen geparst. – holmis83

0

Dies ist die Lösung, die

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

Dieser kam in der Nähe der meisten Browser gearbeitet, aber gab Probleme in IE8, da textcontent nicht

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

Hinweis: Die Eigenschaft 'textContent' ist im IE vor der Version 9 * nicht * verfügbar. –

0

, wenn Sie mehr manipulieren als 1 Etikett Sie können jedes Etikett auswählen und Text durch jquery ersetzen:

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

und für das zweite Label:

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

und so weiter ...

Verwandte Themen