HTML5. Zaawansowane programowanieHTML5. Zaawansowane programowanie

HTML5 zawitał na dobre pod strzechy wraz z najnowszymi wersjami popularnych przeglądarek. Oczywiście, nie wszystko jest już wspierane (na to WHATWG daje światu czas do 2022 r.), jednak nawet tylko część aktualnie zaimplementowana w najważniejszych przeglądarkach na rynku daje niesamowite możliwości.

Chciałbyś rysować na stronie (wektorowo czy też bitmapy?), chciałbyś mieć lepszą komunikację między zakładkami? Między stronami? Między sesjami (bez użycia ciasteczek)? Chcesz używać WebSocketów? A może policzyć coś w osobnym wątku bez blokowania interfejsu?

Tak, nadal mówię o programowaniu za pomocą natywnego JavaScript. Bez wtyczek. Bez kompilatorów. Bez problemów. Z użyciem nowych API dostarczanych przez specyfikacje HTML5.

Starczy reklamy technologii. O tym, że HTML5 będzie przyszłością sieci już chyba nie trzeba nikogo przekonywać. Natomiast na pewno warto zareklamować książkę „HTML5. Zaawansowane programowanie” autorstwa Petera Lubbersa, Briana Albersa i Franka Salima. Nie jest to książka, z której początkujący nie-programista nauczy się programować. Nie ta pozycja, nie taki cel postawili sobie autorzy. Natomiast każdy webdeveloper dobrze radzący sobie z programowaniem dostanie bardzo czytelny i przyjemny w lekturze przegląd nowych możliwości JavaScriptu. Każdy rozdział dotyczy innego API (m. in. canvas, websocket, web workers itp.). Nie jest to jedynie lista dostępnych pól nowych obiektów, ale konkretne „żywe” przykłady. Bardzo podobały mi się także ramki z dodatkowymi uwagami autorów – przestrogi przed możliwymi pułapkami, rady i pomocne uwagi.Continue reading

Wraz z nadejściem HTML5 i jego wielu rewolucyjnych API nastała era rzeczy, które dawniej wydawały się trudne / bardzo trudne / niewykonalne (niepotrzebne skreślić).

Jedną z takich funkcji jest możliwość rysowania za pomocą JavaScriptu na płótnie (ang canvas). Służy do tego znacznik <canvas /> oraz odpowiednie API przypominające podobne rozwiązania z innych języków programowania.

Rysowanie ekranu na płótnie

Nie, nie miałem aż tak wiele czasu, aby napisać to samemu. Miałem jednak trochę, aby wygoogle’ować ciekawą bibliotekę. Padło na bardzo przyjemną w użyciu html2canvas. Kod tej biblioteki przed spakowaniem ma prawie 3k linii, co trochę zniechęca do pisania tego własnoręcznie.

Do zastosowania biblioteki zachęca także przyjazna licencja (MIT) oraz kilka bardzo przydatnych funkcji. Zobaczmy jednak prosty przykład zastosowania:

html2canvas(document.body, {
    onrendered: function(canvas) {
        document.body.appendChild(canvas);
    }
});

demo onlineContinue reading

Choć sama inicjatywa spotkań front-endowców w postaci meet.js nie jest w Polsce nowa, to w Trójmieście takie spotkanie odbyło się po raz pierwszy.

Powiedzieć, że zainteresowanie było duże, to skłamać. Początkowo planowane w pubie Polufka, kameralne spotkanie, przerodziło się w jeden z większych eventów około programistycznych, jakie w ostatnim czasie odbywały się w naszym grodzie. Ostatecznie zdecydowano o przeniesieniu prezentacji do Gdańskiego Inkubatora Przedsiębiorczości.

Miałem niekrytą przyjemność przedstawienia tematu „Modularny JavaScript”. Był to mój debiut na tego typu spotkaniach i bardzo dziękuję za responsywność publiczności. Mam nadzieję, że to nie ostatnie słowo meet.js w tej części naszego kraju.Continue reading

Już kilkukrotnie poruszałem temat tworzenia modułów (czasem nawet „klas”) w JavaScripcie. Tym razem coś nowego – asynchroniczne definiowanie modułów. W skrócie AMD (ang. asynchronous module definition). Coraz więcej znanych frameworków i bibliotek wykorzystuje właśnie to podejście (choćby Dojo i jQuery).

W tym wpisie spróbuję pokazać dlaczego powstało takie rozwiązanie oraz przedstawić kilka prostych zastosowań.

Na początek warto:

W Dojo Toolkit jest cały zestaw widgetów pozwalających budować bardzo nowoczesne aplikacje webowe. W ty wpisie zajmę się dwoma (spokrewnionymi) kontrolkami:

  • dijit.form.FilteringSelect
  • dijit.form.ComboBox

autouzupełnianie dijit.form.FilteringSelect

Co one robią?

Co z nimi nie tak, skoro mam zamiar im poświęcić cały wpis? Kolejno – są to komponenty zastępujące zwykły HTML-owy znacznik <select />. Są bardzo przyjazne dla oka, pozwalają nie tylko na wybór pozycji z listy dostępnych, ale także na wpisywanie własnych (mechanizm podpowiedzi), dodatkowo bardzo dobrze współdziałają z data store. Słowem – używać, nie umierać ;).

Jednak posiadają jedną dużą wadę funkcjonalną – aby rozwinąć listę trzeba kliknąć dokładnie,tylko i wyłącznie w strzałeczkę sugerującą rozwijanie.

demo online

Continue reading

REST (ang. Representational State Transfer) jest wzorcem narzucającym dobre praktyki tworzenia architektury aplikacji rozproszonych. RESTful Webservices (inaczej RESTful web API) jest usługą sieciową zaimplementowaną na bazie protokołu HTTP i głównych zasad wzorca REST. W tym wpisie postaram się pokazać (bardzo) podstawowe założenia.

Ważnym założeniem REST jest istnienie zasobów (ang. resources) jako źródeł danych a także żądana akcja. Ale może po kolei…

Zapomniane metody HTTP w Ajaksie

Komunikując się z serwerem najczęściej korzysta się z dwóch metod:

  • GET
  • POST

Co więcej, często wykorzystuje się je nieprzemyślany sposób (aby nie powiedzieć losowy). Nigdy nie wiadomo, czy żądanie doda, usunie, nadpisze czy tylko pobierze dane z serwera. A szkoda, bo przecież o ile ładniej jest patrzeć w konsole Firebuga i po samym rodzaju metody odczytywać jakiego rodzaju operacja została wywołana.

Tytułowe „zapomniane” metody to (jest ich więcej, ale nie są potrzebne dla tego wpisu):

Dojo posiada pokaźny zbiór widgetów (dijit – Dojo widget). W tym wpisie zajmiemy się kontrolką `dijit.Dialog’ oraz (nieistniejącym domyślnie) zdarzeniem `onMove’. Owe zdarzenie zostanie utworzone z wykorzystaniem istniejących mechanizmów dojo.

Proste okienko

Na początek pokażę kod prostego okienka `dijit.Dialog’:

dojo.require("dijit.Dialog");
dojo.ready(function(){
    var dialog = new dijit.Dialog({
        title: "Okienko",
        style: "width: 200px; height: 200px;",
        content : "Witaj świecie"
    });
    dialog.startup();
    dialog.show();
});
dojo.require("dijit.Dialog");
dojo.ready(function(){
	var dialog = new dijit.Dialog({
		title: "Okienko",
		style: "width: 200px; height: 200px;",
		content : "Witaj świecie"
	});
	dialog.startup();
	dialog.show();
});

demo online

Do konstruktora przekazałem tylko kilka parametrów. Aby zapoznać się z pozostałymi zapraszam do dokumentacji*. W kodzie zamieszczonym powyżej oczywiście nie ma jeszcze obsługi zdarzenia `onMove’. Aby je dodać wykorzystam mechanizm `dojo.subscribe‚.

Wykorzystanie `dojo.subscribe’ do przechwycenia przesunięcia

Skoro mamy okno, przechwyćmy moment, w którym zostanie przesunięte. Kontrolka okienka publikuje informacje o swoim przemieszczeniu w kanale ‚/dnd/move/stop‚. Wystarczy zatem zasubskrybować ten kanał:

dojo.require("dijit.Dialog");
dojo.ready(function()
{
    var dialog = new dijit.Dialog({
        title: "Okienko",
        style: "width: 200px; height: 200px;",
        content : "Witaj świecie"
    });
    dojo.subscribe('/dnd/move/stop', function(mover)
    {
        alert('Poruszyłeś mnie!');
    });
    dialog.startup();
    dialog.show();
});

demo online

OK, już mamy prymitywną obsługę „zdarzenia” `onMove’. Jakie są główne problemy:

  • na ten sam kanał publikują wszystkie wigety, a więc nie mamy obsługi konkretnie `onMove’ tego okienka,
  • nie jest to zbyt piękne rozwiązanie, raczej proteza.

Dodanie metody `onMove’

Aby ulepszyć poprzednie rozwiązanie musimy po pierwsze rozpoznawać konkretne okno. Po drugie musimy po rozpoznaniu wywołać metodę `onMove’. Kod jest dużo prostszy niż by się to wydawało:

dojo.require("dijit.Dialog");
dojo.ready(function()
{
    function createDijitDialogWithOnMoveEvent(title, content)
    {
        var dialog = new dijit.Dialog({
            title: title,
            style: "width: 200px; height: 200px;",
            content : content,
            onMove : function() {}
        });
       dojo.subscribe('/dnd/move/stop', function(mover)
       {
           // rozpoznanie okna
           if (mover.node.id === dialog.id)
           {
               dialog.onMove();
           }
       });
       dialog.startup();
       dialog.show();

       return dialog;
    }
    var x = createDijitDialogWithOnMoveEvent("dijit.Dialog.onMove", "Witaj świecie!");
    dojo.connect(x, 'onMove', function()
    {
        alert('poruszyłeś mnie!');
    });
});

demo online

Każdy widget dojo posiada swój unikalny id. Pozwala to podczas odczytywania z kanału sprawdzić, czy mamy do czynienia z tym oknem, o które aktualnie nam chodzi.

Następnie przypisanie odpowiedniej funkcji obsługi zdarzenia jest już formalnością. Opis mechanizmy dojo.connect/disconnect można znaleźć w jednym z wcześniejszych wpisów:

*A niech będzie – tu się wyżyję. Dojo Toolkit do wersji 1.6 posiadał bardzo przyjemną i ułatwiającą życie dokumentację (linkowany przykład `dijit.Menu’) w postaci opis-przykład-kod do skopiowania. W 1.7 stwierdzono chyba, że życie programisty nie może być takie piękne i zdecydowanie zepsuto IMVHO bardzo przydatne zasoby – dla kontrastu ten sam dijit, dokumentacja w wersji 1.7 – spróbuj uruchomić przykład lokalnie.

EDIT (2013-02-06): W wersji 1.8 naprawiono wyżej opisane błędy.