2011-03-28 16 views
12

¿Cómo puedo seleccionar la primera palabra en un div?Selector de primera palabra

Necesito poder insertar un salto de línea después de la primera palabra, o envolverlo en una etiqueta span. Necesito hacer esto para múltiples divs en una página con la misma clase.

Respuesta

28

Al reemplazar HTML, los controladores de eventos se liberarán y reemplazar el texto completo de un elemento provocará la pérdida de la marca HTML. El mejor enfoque deja intacto cualquier HTML, manipulando solo el primer nodo de texto del elemento coincidente. Para conseguir que el nodo de texto, puede utilizar .contents() y .filter():

function wrapFirstWord() { 
    // Select only the first text node 
    var node = $("div").contents().filter(function() { 
      return this.nodeType == 3; 
     }).first(), 

    // Get the text... 
     text = node.text(), 

    // ... and the first word 
     first = text.slice(0, text.indexOf(" ")); 

    if (!node.length) 
     return; 

    // Remove the first word from the text 
    node[0].nodeValue = text.slice(first.length); 

    // Add it back in with HTML around it 
    node.before('<span>' + first + '</span><br/>'); 
}; 

demostración de trabajo: http://jsfiddle.net/9AXvN/

Usando este método se asegurará de que la manipulación de la primera palabra no tendrá efectos secundarios no deseados en el resto de el contenido del elemento.


Usted puede virar fácilmente esta en como una extensión de jQuery, con un valor opcional para el número de palabras que quieres para envolver:

$.fn.wrapStart = function (numWords) { 
    var node = this.contents().filter(function() { 
      return this.nodeType == 3 
     }).first(), 
     text = node.text(), 
     first = text.split(" ", numWords).join(" "); 

    if (!node.length) 
     return; 

    node[0].nodeValue = text.slice(first.length); 
    node.before('<span>' + first + '</span><br/>'); 
}; 

demostración de trabajo: http://jsfiddle.net/9AXvN/1/

+2

+1 hombre ¡Llegué 1 minuto tarde! Solo hice lo mismo. http://jsfiddle.net/markcoleman/NdhSj/ –

+0

Gracias @Andy E, no estoy seguro de si estoy siendo lento, pero ¿cómo puedo especificar cuántas palabras están incluidas? – Evans

+3

@jdln, puede especificar el número de palabras en la llamada wrapStart(). '$ (" div "). wrapStart (2);'.Además, debes aceptar esta respuesta en lugar de la mía, ya que definitivamente es una mejor manera :) – Dogbert

1

Esto puede ayudarle a

First Word in String with jquery

$('div.message').text(function(i,txt) { 
    var name = $('div.name').text().split(' ')[ 0 ]; 
}); 
+0

Esto se romperá si hay otro HTML en el elemento 'div'. –

+0

@jdln por lo que solo tiene el elemento div junto con texto o div con otros elementos html? según @Andy E comentario – Vicky

+0

Tengo control sobre la salida html así que puedo poner un div alrededor del texto. Gracias – Evans

3

básicamente se puede hacer como esto

 
$('ELEMENT_SELECTOR').text().split(' ')[0] 
4

Esto debería funcionar:

$('div.message').each(function() { 
    var html = $(this).html(); 
    var word = html.substr(0, html.indexOf(" ")); 
    var rest = html.substr(html.indexOf(" ")); 
    $(this).html(rest).prepend($("<span/>").html(word).addClass("em")); 
}); 

JSFiddle

3

Ahora que esto ya ha sido respondido, pero soy muy nuevo para jquery y pensé que lo probaría. Comentarios por favor!

$('div.message').each(function(index) { 
    //get the first word 
    var firstWord = $(this).text().split(' ')[0]; 

    //wrap it with span 
    var replaceWord = "<span class='myClass'>" + firstWord + "</span>"; 

    //create new string with span included 
    var newString = $(this).html().replace(firstWord, replaceWord); 

    //apply to the divs 
    $(this).html(newString); 
}); 
+0

El único comentario que agregaría es que la manipulación de '$ (this) .html()' puede causar efectos secundarios no deseados porque hace que los contenidos sean eliminados y reemplazados por un nuevo conjunto de elementos. Esto significa que cualquier dato o evento vinculado a esos elementos desaparecerá. Es por eso que recomendé modificar el nodo de texto solo en mi respuesta, pero parece que esto no es una preocupación para el OP. –

+0

Gracias. Estaba trabajando en la suposición de que estábamos lidiando con divs de texto simple. –

1

En realidad, si desea utilizarlo como un plug-in, por lo que lo haría por todos los elementos en el selector, no sólo la primera, utilizar éste:

$.fn.wrapStart = function(numWords){ 
    return this.each(function(){ 
     $this = $(this); 
     var node = $this.contents().filter(function(){ 
      return this.nodeType == 3 
     }).first(), 
     text = node.text(), 
     first = text.split(" ", numWords).join(" "); 
     if (!node.length) return; 
     node[0].nodeValue = text.slice(first.length); 
     node.before('<span>' + first + '</span>'); 
    }); 
}; 

http://jsfiddle.net/rxAMF/

0
/* 
URL → https://github.com/melbon/jquery.useWord 
*/ 
$.fn.lastWord = function() { 
    var text = this.text().trim().split(" "); 
    var last = text.pop(); 
    this.html(text.join(" ") + (text.length > 0 ? " <span class='lastWord'>" + last + "</span>" : last)); 
}; 


$.fn.firstWord = function() { 
    var text = this.text().trim().split(" "); 
    var first = text.shift(); 
    this.html((text.length > 0 ? "<span class='firstWord'>"+ first + "</span> " : first) + text.join(" ")); 
}; 


$("#firstWord").firstWord(); 
$("#lastWord").lastWord(); 
Cuestiones relacionadas