Cómo seleccionar todo el contenido entre dos etiquetas en jQuery
Tengo un documento con encabezados y listas desordenadas.
¿Cómo puedo usar jQuery para seleccionar un encabezado determinado (por su nombre de clase único) Y todo el contenido entre ese encabezado y el siguiente encabezado?
Actualización:
Sus 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 id de" heading2 "y todo hasta, pero sin incluir el" h1 "con id de"heading3".
Los ejemplos de jQuery proporcionado anteriormente tendrá acceso a todo después de la primera etiqueta" h "que no es una etiqueta" h".
... o, corrígeme si me equivoco:)
<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>
7 answers
Dos métodos en particular serían muy útiles para resolver este problema: .nextUntil
, y .andSelf
. El primero agarrará todos los hermanos que siguen a su selector, y el segundo agrupará lo que coincida con su selector también, dándole un objeto jQuery que los incluye a todos:
$("#heading2")
.nextUntil("#heading3").andSelf()
.css("background", "red");
Esto resulta en lo siguiente:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-28 13:42:07
Aquí está la solución que uso para mis proyectos:
JQuery selector
(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.
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-21 18:17:37
$('#secondSelector').prevAll('#firstSelector ~ *')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-30 09:16:41
Sí, tienes razón. Esto solo evitará el selector deseado. Tal vez necesita ser más detallado:
$(firstSelector).nextAll().not(secondSelector).not($(secondSelector).nextAll()).text()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-21 18:17:03
Tal vez, con
$(selectorForFirstHeading).nextAll().not(selectorForLastHeading).text()
¿Por qué uso text()
? Porque html()
solo devolverá el interior HTML del primer elemento result.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-21 18:15:22
Siento que la respuesta aceptada necesita un poco de actualización desde el lanzamiento de jQuery 1.8 y posteriores. .andSelf()
ha sido obsoleto. En su lugar, tenemos .addBack()
. La documentación explica todo lo que necesita saber.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-27 14:14:31
Si sus 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, el siguiente elemento heading no es hijo de un elemento al mismo nivel que el primer elemento heading. 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");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-21 18:16:39