wtorek, 15 maja 2012

jQuery - odc. 4

Tym razem chciałbym przedstawić trochę zapisków o bibliotece jQuery UI (pierwsza część). HTML dawniej nie lubiałem z uwagi na brak większości popularnych bardziej złożonych kontrolek, które by się dało łatwo stylować i konfigurować. Również dzisiaj w samym czystym HTML5 też jeszcze takich komponentów raczej nie ma (choć pojawia się trochę nowych kontrolek rysowanych przez przeglądarki do nowych typów <input>, progress, listę z danymi, itd.). Ale jak spojrzałem na widgety oferowane przez jQuery UI, to muszę przyznać jestem pod wrażeniem, z jednej strony prostoty, z drugiej strony łatwości używania, konfigurowania, stylowania, obsługą themes! To jest to! W tym temacie mam nie tylko skojarzenia z XAML (np. Silverlight, Windows 8) ale i z WinJS (Windows 8), tak więc nie mogło obejść się bez komentarzy z mojej strony.

http://jqueryui.com

  • css/ui-lightness/jquery-ui-x.y.z.custom.css
  • js/jquery-a.b.c.min.js
  • js/jquery-ui-x.y.z.custom.min.js

Kontrolki !!! (widgets)

Accordion, Tabs, Dialog, …

<div id=”accordion”>

<div>

        <h3>header 1</h3>

        <div>content 1</div>

</div>

<div>

<h3>header 2</h3>

<div>content 2</div>

</div>

<div>

<h3>header 3</h3>

<div>content 3</div>

</div>

</div>

$(“#accordion”).accordion({ header: “h3”});    //aktywacja kontrolki accordion na danym <div>

Aby osadzić kontrolkę operujemy na wskazanym <div>, który powinien zawierać w sobie odpowiednią strukturę. Jest to bardzo intuicyjne. W WinJS jest podobnie, ale tam zdaje się nie tworzyło się rozbudowanych w środku <div>, a parametry mogą być przekazywane w sposób deklaratywny za pomocą dedykowanego atrybutu.

Stylowanie kontrolek - obsługa themes

ThemeRoller - ustawianie parametrów i podgląd, galeria, download

dostajemy folder z nazwą themy, w którym zawarta jest tak samo nazwany plik CSS + folder z grafiką

Stylowanie i szablonowanie kontrolek od zawsze jeden z największych dobrodziejstw XAML. Tutaj stylowanie polega na podmianie odpowiednich stylów CSS. Podobnie zrealizowano to w WinJS, choć tam zdaje się rozszerzono selektory dla CSS i można też stylować także prymitywne kontrolki np. kolor krzyżyka w polu tekstowym. A jak jest z szablonami?

Opcje, zdarzenia

$(‘#dialog’).dialog({

beforeClose: function() {

       alert(‘Before Close’);

       return false; //blokuje zamknięcie okna

},

autoOpen: false,

with: 500,

modal: true,

buttons: {

      “Ok”:  function()  {

            $(this).dialog(“close”);

      },

      “Cancel”: function() {

            $(this).dialog(“close”);

      }

}

});

Zdarzenia można też obsługiwać przez bind()

Zdarzenia jako parametry w obiekcie konfiguracyjnym lub funkcję bind() z podstawowego jquery. Bardzo prosta i intuicyjna obsługa. Okno dialogowe z logiką można zdefiniować w jednym obiekcie.

Metody - o nazwie kontrolki z pierwszym parametrem będącym nazwą komendy

.dialog(“open”);

.dialog(“close”);

.dialog(“disable”);

.dialog(“enable”);

.dialog(“option”, options)

Metody są ok, choć zastanawia mnie czemu wybrano przekazywanie ich jako string. Zawsze można popełnić tutaj literówkę.

UI Widgets

1.  Dialog

<div id=”dialog” title=”Title”>

<p>Message</p>

</div>

$(function() {

$(“#dialog).dialog({ autoOpen: false });

 

$(“#button”).click(function() {

        $(“#dialog).dialog(“open”);

});

});

Opcje: modal, resizable, draggable - logiczne, position: “top”, itd.

Kontrolka powstała, by obejść systemowe okno komunikatu wywoływane funkcją alert. Swego w jednym projekcie robiliśmy coś takiego w jednym projekcie odpowiednio stylując ChildWindow w Silverlight. Windows 8 też ma swoje nowe okno dialogowe.

2. Progressbar

<div id=”progress”></div>

$(‘#progress’).progressbar({ value: 40 });

CSS:

.ui-progressbar  {

height: 10px;

}

.ui-progressbar-value {

background-image: url(“xxx.gif”);

}

var value = 100;

function countdown() {

value-- ;

$(“#progress”).progressbar(“option”, “value”, value);

$(“#countdown”).text(value);

if (value > 0) {

       setTimeout(countdown, 100);

}

else {

       $(“#countdown”).text(“finished”);

       $(“#progress”).hide();

}    

}

W HTML5 mamy już <progress>. Po co jquery ma własny do tego komponent? Ale pamiętajmy, że jQuery było wcześniej, poza tym daje łatwe stylowanie. W Windows 8 w HTML5 zdaje się dla pasków postępu jest używany właśnie standardowy <progress> odpowiednio ostylowany. Czy kontrolki rysowane przez przeglądarki można dowolnie stylować?

3.Slider

<div id=”slider”></div>

$(“#slider”).slider({ min:0,  max:100,  value:100,  slide: function (event, ui) {

$(“#label”).css({ opacity: ui.value/100});

} });

W HTML5 jest zdaje się <meter>, ale pojawiają się tu podobne pytania jak wcześniej przy tego typu duplikacjach. WinJS też ma zdaje się swoją kontrolkę.

4.Tabs

<div id=”tabs”>

<ul>

         <li><a href=”#tab1”>tab1</a></li>

         <li><a href=”#tab2”>tab2</a></li>

         <li><a href=”#tab3”>tab3</a></li>

         <li><a href=”page.htm”>tab4</a></li>

</ul>

<div id=”tab1”>

         <p>content1</p>

</div1>

<div id=”tab2”>

         <p>content2</p>

</div1>

<div id=”tab3”>

          <p>content3</p>

</div1>

</div>

$(“#tabs).tabs();

Kontrolka z tabami zawsze bardziej kojarzyła mi się z aplikacjami desktopowymi, choć w webowych też nawet dość często można ją spotkać. Bardzo fajny komponent, nic dodać, nic ująć. WinJS kierując się filozofią Metro nie oferuje takiej kontrolki. W Silverlight desktopowym taki komponent oczywiście też jest.

5. Accordion

$(‘#accordion’).accordion();

Opcje

  • autoHeight: bool  - automatyczna wysokość zakładek,
  • collapsable: bool  - zamykanie wszystkich zakładek

Zdarzenia

  • change

Metody

  • accordion(“activate”, false);
  • accordion(“activate”, 1); //aktywacja drugiej zakładki (po załadowaniu)
  • accordion(“activate”, “#b”); //aktywacja sekcji o podanym id (po załadowaniu)

Pierwsze skojarzenie dla mnie - taka kontrolka jest w Silverlight Toolkit. Tutaj może prostsza, ale robi wrażenie.

6. Autocomplete

<div>

<label for=”search”>Search</label>

<input id=”search” type=”text” />

</div>

var items = [“item 1”, “item 2”, “item 3”, …];

$(“#search”).autocomplete( {

source: items //lub adres zdalny np. “productsjson.ashx”,

minLength: 2, //minimalna liczba znaków potrzebna do wpisania

delay: 1500 //czas w ms dla rozpoczęcia requestu

});

Gdy mamy { value: “value1”, label: “label1” } w podpowiedziach wyświetlane są wartości label, po wybraniu wyświetla się wartość value

Taka kontrolka jest w Silverlight i muszę przyznać, że obsługa kontrolki jQuery jest jakby nawet bardziej prosta i intuicyjna.

7. Button //stylowany button o wyglądzie niezależnym od rodzaju elementu

<div id=”buttons”>

<button>button</button>

<input type=”submit” value=”save”/>

<a href=”#”>link</a>

</div>

$(“#buttons”).children()

                     .button({icons: {primary: “icon1”, secondary: “icon2”}})

                     .click(function (){

                          alert($(this).val());

                          });

W theme jQuery zasoby z obrazkami o postaci:

.ui-icon { …, background-image: url(images/ui-icon.png); }

stosowane są też CSS Sprites

<div id=”radios”>

<input type=”radio” id=”option1”  name=”option”/><label for=”option1”>Option1</label>

<input type=”radio” id=”option2” name=”option”/><label for=”option2”>Option2</label>

<input type=”radio” id=”option2” name=”option”/><label for=”option2”>Option2</label>

</div>

<div id=”checks”>

<input type=”checkbox” id=”option1” name=”option”/><label for=”option1”>Option1</label>

<input type=”checkbox” id=”option2” name=”option”/><label for=”option2”>Option2</label>

<input type=”checkbox” id=”option2” name=”option”/><label for=”option2”>Option2</label>

</div>

$(“#radios”).buttonset();  //przypina stylowane “normalne” przyciski zachowujące się jak radio

$(“#checks”).buttonset(); //analogicznie z zachowaniem check

Stylowany button, tego chyba zawsze brakowało.  HTML dostarcza kilka kontrolek, ale czy np. przycisk przeglądarki można dowolnie stylować?

8. DatePicker

<div>

<input type=”text” id=”dateselection” />

</div>

$(“#dateselection”).datepicker(“setDate”, new Date(2012, 5, 15));

Lokalizacja:  development-bundle/ui/i18n/jquery.ui.datepicker-xx.js - skrypty ustawiające odpowiednie opcje np. nazwy dni, przycisków, format daty

Opcje

  • showAnim: “bounce”,
  • numberOfMonths
  • showWeek //numer tygodnia z lewej
  • changeMonth
  • changeYear
  • showButtonPanel //dolny panel
  • minDate
  • maxDate

Pole <input> dla daty i czasu wprowadza HTML5, nie określając jak te kontrolki mają wyglądać. Wszystko więc w rękach producentów przeglądarek. JQuery oferuje własny komponent. WinJS w Windows 8 używa systemowej kontrolki.

Wigdety w jQuery UI robią wrażenie. Mogłoby ich być jeszcze więcej np. DataGrid. Cały czas pojawia mi się też pytanie o natywne kontrolki z HTML5, które czasami się dublują.

Brak komentarzy: