2012-03-31 12 views
38

tengo de HTML siguiente:Cómo cambiar sólo nodo de texto en el elemento

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

Y quiero cambiar a título de etiqueta Title con jQuery. Así que hago

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

Y es reemplazar todo el HTML interno (con abbr etiqueta)

Por lo tanto, lo que la forma más fácil de reemplazar sólo Name?

+0

Parece un duplicado de ** [En jQuery, ¿cómo puedo cambiar el texto de un elemento sin cambiar sus elementos secundarios?] (Http://stackoverflow.com/questions/4106809) ** – hippietrail

Respuesta

58

Si utiliza contents() método también volverá nodos de texto. Desde jQuery no tiene métodos nodo de texto, convertir último nodo a un nodo DOM

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

Demostración: http://jsfiddle.net/yPAST/1/

+1

Supongamos que no lo hizo gusta manipular solo 1 etiqueta –

+0

Interesante .. Tengo solo una etiqueta por entrada, por lo que es apropiado para mí – MikDiet

+2

Nota: la propiedad 'textContent' * no * está disponible en IE antes de la versión 9. –

1

Puede seleccionar sólo el elemento abbr, almacenar, y luego vuelva a colocar todo el contenido con el elemento almacenado más el título cambiado:

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

Ver este fiddle

+0

Lo hago de manera similar, gracias – MikDiet

1

puede utilizar replace lograr esto

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

comprobarlo: http://jsfiddle.net/DyzMJ/

+0

No sé qué etiqueta será .. puede ser 'Nombre', puede ser otra cosa .. – MikDiet

1

solución Evans añadió a jQuery fn de hacer es usar cómodo:

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

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

34

Disculpa la última respuesta ... Pero he aquí una manera de hacerlo utilizando solo jQuery:

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

Has guardado el día. Gracias :) –

+1

Esto funcionó para mí en IE10 y jquery 1.4 – dxrsm

+1

Tenga en cuenta que una cadena para 'replaceWith' se trata como HTML; si contiene etiquetas, se analizará para elementos DOM. – holmis83

0

Esta es la solución que funcionó para la mayoría de los navegadores

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

Ésta estuvo cerca, pero no dio problemas en IE8 desde textContent no es compatible

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

Nota: la propiedad 'textContent' está * no * disponible en IE antes de la versión 9. –

0

si está manipulando más de 1 etiqueta, puede seleccionar cada etiqueta y reemplazar el texto con jquery:

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

y para la segunda etiqueta:

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

y así sucesivamente ...

Cuestiones relacionadas