traversing prev first child jquery css-selectors traversal

prev - parents jquery



Cómo seleccionar todo el contenido entre dos etiquetas en jQuery (7)

Tengo un documento con encabezados y listas desordenadas.

¿Cómo puedo usar JQuery para seleccionar un título dado (por su nombre de clase único) Y todo el contenido entre ese encabezado y el siguiente?

Actualizar:

Tus sugerencias son geniales, pero no son lo que estoy buscando. En el siguiente código, por ejemplo, me gustaría acceder solo al "h1" con el id de "heading2" y todo hasta, pero sin incluir el "h1" con id de "heading3".

Los ejemplos de jQuery proporcionados arriba accederán a todo después de la primera etiqueta "h" que no es una etiqueta "h".

... o, corrígeme si estoy equivocado :)

<h1 id="heading1">...</h1> <ul>...</ul> <p>...</p> <ul>...</ul> <p>...</p> <h1 id="heading2" >...</h1> <ul>...</ul> <p>...</p> <ul>...</ul> <p>...</p> <h1 id="heading3" >...</h1> <ul>...</ul> <p>...</p> <ul>...</ul> <p>...</p>


Aquí está la solución que uso para mis proyectos:

selector jQuery

(function ($) { $.fn.between = function (elm0, elm1) { var index0 = $(this).index(elm0); var index1 = $(this).index(elm1); if (index0 <= index1) return this.slice(index0, index1 + 1); else return this.slice(index1, index0 + 1); } })(jQuery);

Uso

$(''body'').between($(''#someid''), $(''#someid2'')).each(function () { // Do what you want. });


Dos métodos en particular serían muy útiles para resolver este problema: .nextUntil , y .andSelf . El primero atrapará a todos los hermanos que sigan a tu selector, y este último agrupará todo lo que coincida con tu selector, dándote un objeto jQuery que los incluye a todos:

$("#heading2") .nextUntil("#heading3").andSelf() .css("background", "red");

Esto resulta en lo siguiente:


Quizás, con

$(selectorForFirstHeading).nextAll().not(selectorForLastHeading).text()

¿Por qué uso text() ? Porque html() solo devolverá el HTML interno del primer elemento de resultado.


Si tus elementos están en el mismo nivel, algo como esto:

<h1 id="heading1">...</h1> <ul>...</ul> <p>...</p> <ul>...</ul> <p>...</p> <h1 id="heading2" >...</h1>

Es decir, su próximo elemento de encabezado no es hijo de un elemento en el mismo nivel que el primer elemento de encabezado. Puedes probar este código:

// This will get all the following siblings of <h1 id="heading1"> except those that are headings themselves var elements = $(''#heading1'').nextAll().not("h1");


Si, tienes razón. Esto solo evitará el selector deseado. Tal vez necesita ser más detallado:

$(firstSelector).nextAll().not(secondSelector).not($(secondSelector).nextAll()).text()


Siento como si la respuesta aceptada necesitara un poco de actualización desde el lanzamiento de jQuery 1.8 y posterior. .andSelf() ha quedado en desuso. En su lugar, tenemos .addBack() . La documentation explica todo lo que necesita saber.


$(''#secondSelector'').prevAll(''#firstSelector ~ *'')