Esta es la primera vez que publico, así que avíseme si no proporciono los detalles suficientes.Cómo ordenar correctamente varios acordeones con jQuery
Tengo una página que contiene varios acordeones. Quería usar varios acordeones porque quería que los usuarios pudieran tener varias secciones abiertas al mismo tiempo, lo que no es nativo de acordeón.
También quiero que los usuarios puedan ordenar esos acordeones. La forma en que la página está configurada actualmente, los usuarios pueden ordenar el acordeón sin problemas.
Cuando el usuario va a ordenar los acordeones, tengo un script que cerrará todos los acordeones existentes, almacenará sus identificadores en una matriz y luego los volverá a abrir cuando el usuario termine de ordenar. Esa parte también funciona bien.
El problema se produce cuando intenta colocar la sección que está ordenando entre dos secciones que estaban abiertas anteriormente. No parece que jQuery pueda decir fácilmente dónde comienza una sección y dónde termina cuando están cerradas programáticamente. Tenga en cuenta que si ya estaban cerrados, funciona como se esperaba.
He intentado varios enfoques para este problema, incluyendo agregar un separador div entre las secciones, así como destruir los acordeones y luego reiniciarlos después de que la clasificación haya finalizado en vano.
Sospecho que el problema ocurre porque cuando se toca por primera vez el acordeón, las secciones están abiertas. Pero en ese momento, cierro todas las secciones y aunque la sección se cierra, hace que esas secciones salten esporádicamente cuando tratas de poner una sección entre dos.
También he notado que la altura del contenido del acordeón influye. En mi ejemplo a continuación, el primer div causa problemas cuando está abierto y usted trata de ordenarlos pero los otros lo hacen menos.
Aquí está el código que tengo. El jQuery es la biblioteca básica jQuery y las cosas que escribí Incluí en línea para mayor simplicidad:
<html>
<head>
<link href="/css/flick/jquery-ui.css" media="screen" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/js/jquery-ui.js"></script>
<script type="text/javascript">
$(document).ready(function() {
// Add Accordion stuff
$(".accordion").accordion({
autoHeight: false,
active: false,
collapsible: true
}); // end $(".accordion").accordion
// Add sortables
$('.sortable').sortable({
start: function(e, ui) {
container = $(e.target);
var parent_id = container.parent().parent().attr('id');
expanded_ones = new Array();
var count = 0;
var summary = '';
var child = '';
var active = '';
// now close all other sections
$.each($('#' + parent_id + ' .accordion'), function() {
// get the child element since that has the div id I need
child = $(this).children('div');
// get the active information to see if it is open or closed
active = $(this).accordion('option', 'active');
// check to see if this one is expanded
if(parseInt(active) == active) {
// store this id so we can open it later
expanded_ones[count] = $(child).attr('id');
count++;
// and close the accordion
$(this).accordion({ active: false });
} // end if(parseInt(active) == active)
}); // end $.each($('#' + parent_id + ' .accordion'), function()
}, // end start: function(e, ui)
stop: function(e, ui) {
container = $(e.target);
var parent_elem = '';
// expand the ones that were originally expanded
for(var i = 0; i < expanded_ones.length; i++) {
parent_elem = $('#' + expanded_ones[i]).parent();
$(parent_elem).accordion('option', 'active', 0);
} // end for(var i = 0; i < expanded_ones; i++)
} // end stop: function(e, ui)
}); // end $('.sortable').sortable
}); // end $(document).ready(function() {
</script>
</head>
<body>
<div id="outer">
<div class="box">
<div class="accordion_wrapper sortable" rel="sections">
<div id="accordion_a" class="section_accordion">
<div class="accordion">
<h4>Accordion A</h4>
<div id="accordion_a_content">
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
<p>Stuff</p>
</div>
</div>
</div>
<div id="accordion_b" class="section_accordion">
<div class="accordion">
<h4>Accordion B</h4>
<div id="accordion_b_content">
Stuff
</div>
</div>
</div>
<div id="accordion_c" class="section_accordion">
<div class="accordion">
<h4>Accordion C</h4>
<div id="accordion_c_content">
Stuff
</div>
</div>
</div>
<div id="accordion_d" class="section_accordion">
<div class="accordion">
<h4>Accordion D</h4>
<div id="accordion_d_content">
Stuff
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
Gracias por el asesoramiento. Terminé implementando algo similar y funciona muy bien. – lokisapocalypse