2009-10-09 19 views
14

Consideremos código HTML siguiente:¿Cómo obtener un texto antes del elemento dado usando jQuery?

<p> 
    Some text followed by <span>a span element</span> 
    and another text followed by <b>a bold text</b>. 
</p> 

¿Cómo puedo obtener el texto antes de las span y b elementos usando jQuery?

Intenté $("span").prev() y $("b").prev() pero funcionó porque el texto no es un elemento. También probé $("span").parent(), pero coincidió con todo el párrafo, mientras que solo quiero una parte.

¿Podría aconsejar alguna solución? Gracias de antemano :-)

+0

casi duplicado de: http://stackoverflow.com/questions/1017330/extract-the-text-in-a-element-with-jquery – peirix

+3

No es tan similar. Aquí quiero extraer solo el texto que aparece directamente antes del elemento dado, no el texto completo. – czuk

Respuesta

21

¿Qué hay de su recogida en una matriz en lugar de dos llamadas a $:

var texts = $('span, b').map(function(){ 
    return this.previousSibling.nodeValue 
}); 
texts[0]; // "Some text followed by " 
texts[1]; // " and another text followed by " 

Referencias:

+0

Excelente respuesta. Bien razonado y referenciado. – KyleFarris

+0

Gracias por la solución. Sin embargo, no puedo hacerlo funcionar en este escenario. 'var c = jQuery ('span');' y posterior 'c.previousSibling' devuelve' null' pero 'c.context.previousSibling' está bien. ¿Por qué? – czuk

+0

Digo, no use ese escenario ('c.context'). Usa el código en mi respuesta. –

3

Me temo que tendrá que usar expresiones regulares para eso. Con el fin de obtener el texto antes del elemento span usar algo como esto:

var txt = $('span').parent().html(); 
var regex = /(.*)<span>/; 
txt = txt.match(regex)[1]; 

Modificar la expresión regular para que coincida con otras partes de la cadena también.

+0

+1 ¡me ganaste! – Jared

+2

Esto no funcionará porque text() no devuelve ningún html. En segundo lugar, incluso si lo cambia a usar html(), el elemento de destino puede no ser el primer tramo en el elemento primario. – Borgar

+0

Esto es solo una demostración de cómo puedes hacerlo. No hay una manera fácil de obtener este texto eliminando todos los contenidos etiquetados. Tienes que usar expresiones regulares. – RaYell

0

que han llegado con una siguiente solución:

var c = $("span").context.previousSibling; 
alert(c.data); 

Pero no estoy seguro de qué tan seguro es cuando se utilizan diferentes navegadores?

+0

¿Por qué no solo usa mi solución? Hace lo mismo pero sin acceder a '.context'. –

+0

Esta es una solución alternativa. Su solución no se puede usar (no pude) en todas las situaciones. – czuk

1
var textBefore = $('span')[0].previousSibling.nodeValue; 

Estaba buscando una solución a esto, y me confundí por qué tenía que mapear a una matriz. El contexto no funcionaba para mí. Finalmente descubrí cómo escribirlo.

Esta es la solución más básica. Al poner el [0], el elemento se convierte en elementNode, lo que le permite llamar al código anterior de Brother. No es necesario colocarlo en una matriz usando la función de mapa a menos que sea más conveniente.

Cuestiones relacionadas