jQuery: creare elementi dell'interfaccia usando un approccio object-oriented basato sugli eventi

jQuery ci permette di associare dei dati agli eventi. Usando tali dati possiamo creare elementi della UI basati sugli eventi, come ad esempio un accordion.

I dati degli eventi

I dati degli eventi vengono associati direttamente all'oggetto event sotto forma di oggetti. Esempio:


$('#test').bind('click', {property: 'Test'}, function(event) {
	var str = event.data.property; // 'Test'
	$(this).text(str);
});

Questi oggetti possono anche contenere riferimenti ad elementi jQuery.

Eventi personalizzati

Gli eventi personalizzati vengono creati per espletare funzioni particolari. La sintassi è la stessa di quella usata per gli eventi tradizionali:


$('#test').bind('inviewport', function(event) {
	//...
});

Questi eventi possono essere invocati con i metodi trigger() e triggerHandler().

Come funziona un accordion

Quando si clicca su un'intestazione di un accordion accadono tre azioni:

  1. Se il contenuto è nascosto, si usa slideDown()
  2. Se il contenuto è visibile, si usa slideUp()
  3. I restanti contenuti devono essere nascosti eccetto quello corrente.

Solitamente si usa questo approccio procedurale:


$('h3', 'div.accordion').each(function() {

	var $header = $(this);
	var $content = $header.next();
	
	$header.click(function() {
	
		$('div.accordion-content').slideUp(600);
		
		if($content.is(':hidden')) {
		
			$content.slideDown(600);
		
		} else {
		
			$content.slideUp(600);
		
		}
	
	
	});

});

Il problema di questo approccio è che non è né flessibile né riutilizzabile.

L'oggetto Accordion

Ecco un'implementazione OO basata sugli eventi:


var Accordion = {
    Elements: {
        titles: $('h3', 'div.accordion')
    },
    Events: {
        open: function(evt) {
            if (evt.data.element.is(':hidden')) {
                evt.data.element.slideDown(600);
            } else {

                this.close();

            }
        },
        close: function(evt) {

            if (evt.data.element.is(':visible')) {
                evt.data.element.slideUp(600);

            } else {

                this.open();

            }
        },
        bind: function() {

            Accordion.Elements.titles.each(function() {

                var $header = $(this);
                var $content = $header.next();

                $header.bind('open', {
                    element: $content
                }, Accordion.Events.open);
                $header.bind('close', {
                    element: $content
                }, Accordion.Events.close);

            });

        }
    },
    
    fn: {
        
        attachEvents: function() {
            
            Accordion.Events.bind();
 
            Accordion.Elements.titles.on('click', function() {
                
                $('div.accordion-content').slideUp(600);
                $(this).trigger('open');

            });                
            
            
        }
    },
    
    init: function() {
        
        Accordion.fn.attachEvents();
    }
};


Accordion.init();

Abbiamo memorizzato i contenuti di ciascun blocco nell'oggetto event di ciascuna intestazione. In questo modo gli elementi sono messi in cache e pronti all'uso.

Abbiamo inoltre creato due metodi helper per lo sliding dei contenuti utilizzando i dati degli eventi. Il risultato finale è una robusta implementazione che può essere adattata a differenti casi d'uso.

Torna su