Commenti

Tabs UJS con i data-behaviour

Ho scoperto l'UJS in concomitanza della sua introduzione massiccia su Rails: ne sono rimasto immediatamente affascinato. Un coupling ancora meno stretto tra contenuto e comportamenti dinamici della pagina, utilizzando come strumento di comunicazione gli attributi HTML5 data-*? Fantastico! :)

Ho cercato da quel momento di impegnarmi a generare codice JS quanto più unobtrusive possibile; il vantaggio è evidente dopo i primi tentativi: nel tempo, arrivi a comporre una comoda libreria di comportamenti riutilizzabili in altri contesti senza nessun codice JS custom da introdurre.

Esempio: una tabbed interface

Quante volte vi sarà capitato di dover impostare una vista a tab? Io sono arrivato a questa soluzione, che considero difficilmente battibile, sia per chiarezza che per brevità:

 1 $ ->
 2 
 3   $tab_scope_contents = {}
 4 
 5   $("[data-behaviour=tab]").each ->
 6     $tab = $(this)
 7     $tab_content = $($tab.attr("href") || $tab.find("a").attr("href")).hide()
 8     scope = $tab.data("tab-scope")
 9     $related_tabs = $("[data-tab-scope=#{scope}]")
10     $tab_scope_contents[scope] = ($tab_scope_contents[scope] || $()).add $tab_content
11 
12     $tab.click ->
13       $related_tabs.removeClass("selected-tab")
14       $tab.addClass("selected-tab")
15       $tab_scope_contents[scope].hide()
16       $tab_content.show()
17       false
18 
19     $related_tabs.eq(0).click()

Come si utilizza? Semplice: supponiamo di avere un HTML del genere:

1 <ul>
2   <li><a href="#primo">Primo tab</a></li>
3   <li><a href="#secondo">Secondo tab</a></li>
4   <li><a href="#terzo">Terzo tab</a></li>
5 </ul>
6 
7 <div id="primo">Primo contenuto!</div>
8 <div id="secondo">Secondo contenuto!</div>
9 <div id="terzo">Terzo contenuto!</div>

E' sufficiente aggiungere, per ogni tab handle, un attributo data-behaviour="tab" per specificare che vogliamo da quel link un comportamento di tipo "tab", e un attributo data-tab-scope="nome-dello-scope" per specificare a quale gruppo di tab appartenga:

1 <ul>
2   <li><a href="#primo"   data-behaviour="tab" data-tab-scope="tabset1">Primo tab</a></li>
3   <li><a href="#secondo" data-behaviour="tab" data-tab-scope="tabset1">Secondo tab</a></li>
4   <li><a href="#terzo"   data-behaviour="tab" data-tab-scope="tabset1">Terzo tab</a></li>
5 </ul>

Boom. Il gioco è fatto. Ora, ovunque tu voglia tab, basta aggiungere due attributi all'HTML.

Cosa ne pensate?