Die jQuery UI Widgets Tabs und
Accordion könnten - bis auf
die Ausrichtung ihrer Reiter (Tabs horizontal, Accordion vertikal) -
identisch sein. Sind sie aber nicht. Während das Tabs-Widget das Laden
von Inhalten per Ajax direkt unterstützt, ist dies beim
Accordion-Widget nicht vorgesehen. Es ist jedoch möglich, dies durch
einen beforeActivate Event-Handler und bestimmte Einstellungen zu
realisieren.
Struktur des Accordion
<div id="ID">
<h3><a href="URL">TITLE</a></h3>
<div></div>
...
</div>
ID ist die DOM-Id des Accordion. Der TITLE des Reiters wird in
einen a-Tag eingefasst, dessen href-Attribut den URL
definiert, von dem wir den Inhalt des Accordion-Panel per Ajax
abrufen. Der div-Container für den Panel-Content ist leer, dieser
wird per Ajax gefüllt.
Instanziierung des Accordion
$('#ID').accordion({
beforeActivate: function (event,ui) {
var url = ui.newHeader.find('a').attr('href');
if (url)
ui.newPanel.load(url);
},
active: false,
collapsible: true,
heightStyle: 'content'
});
Das Laden des Panel-Inhalts per Ajax realisiert der
beforeActivate-Handler, den wir bei der Instanziierung des
Accordion-Widget definieren (Zeilen 2-6). Wir nutzen den
beforeActivate-Handler und nicht den activate-Handler, da er
vor dem Öffnen des Reiters gerufen wird. D.h. zum Zeitpunkt des
Öffnens ist der Inhalt bereits geladen, was einen flüssigen Ablauf
ergibt.
Die Setzungen
active: false
collapsible: true
bewirken in dieser Kombination, dass zunächst alle Reiter geschlossen
bleiben, denn das initiale Öffnen feuert nicht die
beforeActivate- und activate-Events. Das initiale Öffnen
realisieren wir durch das Auslösen eines Click-Event nach der
Accordion-Instanziierung (s.u.).
Die Setzung
bewirkt, dass die Höhe des Panel automatisch an den geladenen Inhalt
angepasst wird. Dies ist wichtig, da der Inhalt vorab nicht bekannt
ist.
Öffnen des ersten Accordion-Reiters
$('#ID a:first').trigger('click');
Den ersten Accordion-Reiter öffnen wir durch das Auslösen eines
Click-Event, so als hätte der Anwender auf den ersten Reiter geklickt.
Auf diese Weise ist sichergestellt, dass der beforeActivate-Handler
gerufen und damit der Inhalt geladen wird.
Links: