2011-02-01 8 views
11

Sto tentando di creare una fisarmonica in cui posso espandere/comprimere tutte le sezioni con un solo clic. Ho anche bisogno che l'utente apra e chiuda le sezioni con sezioni 0-n aperte alla volta. Utilizzando molte delle discussioni qui sullo stackoverflow e sui forum di jquery, ecco la soluzione che ho trovato: Ho implementato ogni sezione come se fosse una fisarmonica, dove ognuna è impostata su pieghevole = true.jquery ui fisarmonica - più fisarmoniche espandono/comprimono tutti i problemi di stile

<html> 
    <head> 
     <title>Accordion Test</title> 

     <script type="text/javascript" src="../scripts/jquery-1.4.2.min.js"></script> 
     <script type="text/javascript" src="../scripts/jquery-ui-1.8.4.custom.min.js"></script> 

     <link rel="stylesheet" href="../_templates/css/jquery-ui-1.8.6.custom.css" type="text/css" /> 
     <link rel="stylesheet" href="../_templates/css/jquery.ui.accordion.css" type="text/css" /> 
    </head> 

<body> 
     <a onClick="expandAll()">Expand All</a> 
     <br> 
     <a onClick="collapseAll()">Collapse All</a> 
      <div id="accordion1" class="accord"> 
      <h5><a href="#">section 1</a></h5> 
      <div> 
        section 1 text 
      </div> 
      </div> 

      <!-- orders section --> 
      <div id="accordion2" class="accord"> 
      <h5><a href="#">section 2</a></h5> 
      <div> 
        section 2 text 
      </div> 
      </div> 

      <!-- section 3 --> 
      <div id="accordion3" class="accord"> 
      <h5><a href="#">section 3</a></h5> 
      <div> 
        section 3 text 
      </div> 
      </div> 

      <!-- section 4 --> 
      <div id="accordion4"> 
      <h5><a href="#">section 4</a></h5> 
      <div> 
        section 4 text     
      </div> 
      </div> 


</body> 
</html> 


<script type="text/javascript"> 

$(function() { 
    $('#accordion1').accordion({ 
     header: 'h5', 
     collapsible: true, 
     autoHeight: false 
    }); 
}); 
$(function() { 
    $('#accordion2').accordion({ 
     header: 'h5', 
     collapsible: true, 
     autoHeight: false, 
     active: false 
    }); 
}); 
$(function() { 
    $('#accordion3').accordion({ 
     header: 'h5', 
     collapsible: true, 
     autoHeight: false, 
     active: false 
    }); 
}); 
$(function() { 
    $('#accordion4').accordion({ 
     header: 'h5', 
     collapsible: true, 
     autoHeight: false, 
     active: false 
    }); 
}); 

</script> 

<script type="text/javascript"> 
$(document).ready(function() { 

}) 

function expandAll() { 
    alert("calling expandAll"); 
    $("#accordion1, #accordion2, #accordion3, #accordion4") 
     .filter(":not(:has(.ui-state-active))") 
     .accordion("activate", 0); 
} 

function collapseAll() { 
    alert("calling collapseAll"); 
    $("#accordion1, #accordion2, #accordion3, #accordion4") 
     .filter(":has(.ui-state-active)") 
     .accordion("activate", -1); 
} 

</script> 

Il problema che sto funzionando in, è quando si fa clic l'intestazione di una sezione aperta, la sezione è crollato come previsto, ma il colpo di testa ancora la classe "ui-stato-focus", fino a quando ho clicca altrove sulla pagina. Quindi quello che vedo nell'interfaccia utente è che l'intestazione della sezione appena chiusa ha lo stesso colore di sfondo del mio effetto hover, finché non faccio clic altrove, e passa al colore "predefinito, non focalizzato".

Inoltre, quando utilizzo il collegamento Comprimi tutto, tutto sembra perfetto in Firefox. In IE, l'intestazione dell'ultima sezione ha la stessa colorazione hover-focus.

Qualche suggerimento? Devo in qualche modo forzare la fisarmonica a perdere la concentrazione quando è chiusa? Come potrei realizzarlo?

+0

Questa non è una soluzione per una fisarmonica. Nell'esempio vengono utilizzate più fisarmoniche. – jmav

risposta

3

Dopo aver tentato di scavalcare i miei stili jquery-ui sulla pagina e aver tentato di hackerare il fisarmonica javascript per rimuovere la classe di messa a fuoco ui-state, è venuta alla luce una soluzione semplice.

Poiché la mia pagina sta visualizzando il comportamento previsto quando faccio clic in un altro punto della pagina, ho usato blur() per perdere lo stato attivo.

Per risolvere il problema collassare tutti in IE, ho aggiunto 1 riga al mio metodo collapseAll().

function collapseAll() { 
    alert("calling collapseAll"); 
    $("#accordion1, #accordion2, #accordion3, #accordion4") 
     .filter(":has(.ui-state-active)") 
     .accordion("activate", -1); 
    $(".ui-accordion-header").blur(); 
} 
3

Soluzione per implementare la fisarmonica con tutti i pannelli aperti. I pannelli sono statici e non possono essere chiusi.

Non inizializzare il div in fisarmonica con il widget della fisarmonica!

$("#accordion").addClass("ui-accordion ui-widget ui-helper-reset") 
    .find('h3') 
    .addClass("current ui-accordion-header ui-helper-reset ui-state-active ui-corner-top") 
    .prepend('<span class="ui-icon ui-icon-triangle-1-s"/>') 
    .next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content-active"); 
2

questa è la mia risposta ~ speranza il suo aiuto

per più aperto che si può fare in questo modo utilizzando UI jQuery esistente è sufficiente aggiungere un opzioni beforeActivate:

il mio codice qui sotto:

$("#accordion").accordion({ 
     header: "> div > h3", 
     autoHeight: false, 
     collapsible: true, 
     active: false, 
     beforeActivate: function(event, ui) { 
      // The accordion believes a panel is being opened 
      if (ui.newHeader[0]) { 
       var currHeader = ui.newHeader; 
       var currContent = currHeader.next('.ui-accordion-content'); 
      // The accordion believes a panel is being closed 
      } else { 
       var currHeader = ui.oldHeader; 
       var currContent = currHeader.next('.ui-accordion-content'); 
      } 
      // Since we've changed the default behavior, this detects the actual status 
      var isPanelSelected = currHeader.attr('aria-selected') == 'true'; 

      // Toggle the panel's header 
      currHeader.toggleClass('ui-corner-all',isPanelSelected).toggleClass('accordion-header-active ui-state-active ui-corner-top',!isPanelSelected).attr('aria-selected',((!isPanelSelected).toString())); 

      // Toggle the panel's icon 
      currHeader.children('.ui-icon').toggleClass('ui-icon-triangle-1-e',isPanelSelected).toggleClass('ui-icon-triangle-1-s',!isPanelSelected); 

      // Toggle the panel's content 
      currContent.toggleClass('accordion-content-active',!isPanelSelected)  
      if (isPanelSelected) { currContent.slideUp('fast'); } else { currContent.slideDown('fast'); } 

      return false; // Cancels the default action 
     } 
    }); 

rinvio da: jQuery UI accordion that keeps multiple sections open?

e fu nction crollo ed espandere

function accordion_expand_all() 
{ 
    var sections = $('#accordion').find("h3"); 
    sections.each(function(index, section){ 
    if ($(section).hasClass('ui-state-default') && !$(section).hasClass('accordion-header-active')) { 
     $(section).click(); 
    } 
    }); 

} 

function accordion_collapse_all() 
{ 
    var sections = $('#accordion').find("h3"); 
    sections.each(function(index, section){ 
    if ($(section).hasClass('ui-state-active')) { 
     $(section).click(); 
    } 
    }); 
} 

il gioco è fatto ..

+0

Soluzione molto bella! Mi piace! Buon lavoro! –

0

Si può provare questo piccolo, plug-leggero.

Avrà poche opzioni disponibili che possiamo modificare secondo i nostri requisiti.

URL:http://accordion-cd.blogspot.com/

Problemi correlati