2009-06-19 15 views
8

Quiero crear una matriz de todos los elementos HTML dentro de un div que contiene cadenas de texto, tales comoelementos de investigación con texto usando jQuery

<p>some string</p>. 

no quiere agarrar de las cuerdas, me quiere que los elementos de la matriz sean los elementos (en el ejemplo, sería el nodo p). No sé de antemano cuáles serán las cadenas, por lo que no puedo buscar valores de cadenas para que coincidan. Tampoco quiero que los nodos de texto vacíos terminen en la matriz.

Gracias!

Respuesta

10
$("#my_div *").filter(function() 
{ 
    var $this = $(this); 
    return $this.children().length == 0 && $.trim($this.text()).length > 0; 
}) 

Esta versión no volverá elementos primarios que contiene los elementos que tienen los textos, sólo los elementos último nivel.

puede no ser el más rápido, pero funciona bastante bien en la página web StackOverflow :)

+1

De mi prueba, esta fue la solución que solo devolvió los elementos que contienen el texto, no sus padres también. Gracias! –

+0

Buena solución, más simple y más limpio que el mío :) –

+1

$ ('\ *: not (: has (\ *))' puede ser una mejor manera de seleccionar nodos sin hojas (niños) ... definitivamente menos tipeo. – Dave

1

Usted podría pasar por la children y agarrar todo lo que tiene un .text() valor != ""

+0

Eso suena como un buen plan, pero no lo sé jQuery suficientemente bien como para entender cómo construir la sintaxis que hace lo que describes. ¿Puedes dar un ejemplo? Gracias. –

0

d es el div con el que quiere encontrar cosas
V es una matriz vacía
i usted tiene que empezar a cabo en 0.

El $ .trim se utiliza para que no obtenga nodos que son solo espacios en blanco.

$("*",d).filter(function() { 
    return $.trim($(this).text()) != "" 
    }).each(function() { 
    v[i] = $(this).text(); 
    i++; 
    }); 

También se puede usar v.push ($ (this)) ... que es algo que me olvidó por completo.

+0

Esto parece prometedor, lo intentaré. Si solo quiero los elementos, no el texto real sería la asignación final: v [i] = $ (this); ? –

+0

Depende de si desea que sea un objeto jQuery o no. Si quieres que sea un objeto jQuery, sería $ (esto). Si solo quieres el elemento DOM, simplemente sería esto. – Thomas

+0

Y en realidad, ni siquiera necesitarías hacer eso ... todo lo que tendrías que hacer es eliminar el .each(), ya que el único propósito era sacar el texto. (Perdón, estaba algo distraído cuando hice el último comentario. – Thomas

1
var array = []; 
var divSelector = "div.mine"; 

$(divSelector).contents().each(function() 
{ 
    // If not an element, go to next node. 
    if (this.nodeType != 1) return true;  

    var element = $(this); 
    if ($.trim(element.text()) != "") 
    array.push(element); 
}); 

array es la matriz de elementos que tienen algo de texto en ellos.

0
$(function() { 
     var array = new Array(); 
     $("#testDiv *").each(function(x, el) { 

      if ($.trim($(el).text()) != '') { 
       array.push(el); 
      } 
     }); 
     alert(array.length); 
    }); 
2

Usted puede hacer uso del no y los selectores vacías para obtener los elementos no vacíos mientras que la conversión a una matriz se puede lograr utilizando llegar

$("#theDiv > :not(:empty)").get(); 

El selector anterior se lleva todos los elementos secundarios de "theDiv" y que no están vacíos (es decir, tienen hijos o texto) y luego convierte el conjunto coincidente en una matriz.

Si desea que sólo los elementos que tienen texto dentro de ellos, esto debería funcionar ...

$("#theDiv > :not(:empty, :has(*))").get(); 

para deshacerse de elementos que tienen espacios en blanco se puede hacer uso de filtro de

$("#theDiv > :not(:has(*))").filter(function() { 
       return $.trim(this.innerHTML).length > 0; 
     }).get(); 
+1

Esto no funcionará si quiere elementos que SÓLO tienen texto dentro. Esto también devuelve cualquier elemento que tenga hijos, incluso si ninguno de esos niños tiene texto dentro de ellos. –

+1

Otra nota, esto solo funcionaría en los hijos inmediatos del div también (no estoy seguro de si este es el comportamiento deseado o no). Quite el> para verificar todos los antepasados. El * tampoco sirve para nada en este caso. –

+0

Se actualizó con respecto a la selección de elementos que solo tienen texto en el interior. Gracias por elegir * He actualizado mi respuesta según corresponda –

7

Un selector personalizado podría ser útil en su caso:

jQuery.expr[':'].hasText = function(element, index) { 
    // if there is only one child, and it is a text node 
    if (element.childNodes.length == 1 && element.firstChild.nodeType == 3) { 
     return jQuery.trim(element.innerHTML).length > 0; 
    } 
    return false; 
}; 

Después de eso, simplemente puede hacer esto:

$('#someDiv :hasText') // will contain all elements with text nodes (jQuery object) 
$('#someDiv :hasText').get() // will return a regular array of plain DOM objects 

Supongo que solo está tratando de seleccionar elementos que tienen SOLO texto dentro de ellos.

+1

Gran respuesta, solo un error tipográfico menor - nodeType debe ser verificado en lugar de nodeValue ... –

+0

Buena llamada, error –

0

Utilice: contiene selectora:

var matches = new Array(); 
$('#start_point *:contains(' + text + ')').each(function(i, item) { 
matches.push(item); 
} 
+0

Dijo que no tiene ningún texto específico para buscar. –

Cuestiones relacionadas