2011-02-09 11 views
5

Sé que esto debería ser una tarea simple, pero estoy teniendo problemas para seleccionar una última palabra de los elementos del encabezado y envolverla en un lapso para que pueda agregar cambios de estilo.¿Cómo envuelvo un lapso alrededor de la última palabra del texto interno de un elemento, usando jQuery?

Esto es lo que tengo hasta ahora

$('.side-c h3').split(/\s+/).pop().wrap('<span />'); 

Cualquier ayuda sería muy apreciada

+1

Probablemente ya has pensado bien, pero probablemente sería más fácil hacer esto del lado del servidor, ya que muchos lenguajes de programación web tienen muchas funciones de alto nivel para tratar con manipulación de texto, mientras que jQuery se entiende (como dijo Stephen) para tratar con nodos DOM. (Hombre, esa fue una larga sentencia de larga duración.) – eykanal

+0

Estoy de acuerdo con @eykanal, a menos que esté construyendo un plugin jQuery de algún tipo que será utilizado por otros desarrolladores. – Stephen

Respuesta

15

El problema es que jQuery objetos nodos DOM envoltura. Cada palabra en el elemento no es un nodo DOM en sí, por lo que necesitará un poco más de trabajo para separar el texto y volver a unirlo. También necesita contabilizar múltiples nodos seleccionados por jQuery. Pruebe esto:

$('.side-c h3').each(function(index, element) { 
    var heading = $(element), word_array, last_word, first_part; 

    word_array = heading.html().split(/\s+/); // split on spaces 
    last_word = word_array.pop();    // pop the last word 
    first_part = word_array.join(' ');  // rejoin the first words together 

    heading.html([first_part, ' <span>', last_word, '</span>'].join('')); 
}); 
+0

¡funciona! pero reescribe los títulos para todos ellos en la página –

+0

Oh, tienes múltiples '.side-c h3'? Reescribiré mi respuesta. – Stephen

+0

Una actualización final. Deberías ser bueno para ir con esta nueva muestra. Avísame si quieres que se explique esto. – Stephen

0

Hmm, esto no es particularmente fácil. La forma más ortodoxa de hacerlo es con DOMNode.splitText:

$('.side-c h3').each(function(){ 
    var oldNode = this.firstChild, 
     newNode = oldNode.splitText(oldNode.data.lastIndexOf(' ') + 1), // don't wrap the space 
     span = document.createElement('span'); 

    this.replaceChild(span, newNode); 
    span.appendChild(newNode); 
}); 

See jsfiddle.

2

Esto lo hace:

$('.side-c h3').each(function(){ 
    var $this = $(this), text=$this.text().trim(), words = text.split(/\s+/); 
    var lastWord = words.pop(); 
    words.push('<span>' + lastWord + '</span>'); 
    $this.html(words.join(' ')); 
}); 
Cuestiones relacionadas