Dojo Toolkit: AJAX a animace

V třetí části týkající se javascriptového frameworku Dojo se podívame na práci s AJAXem a na používání animací. V obou případech si můžete vybrat mezi jednoduchým (pohodlným) způsobem volání na jedné straně a mocným (flexibilním) API na straně druhé.
Seriál: Seznamte se s Dojo Toolkitem (4 díly)
- Začínáme používat Dojo Toolkit 29. 5. 2009
- Začínáme používat Dojo Toolkit (pokračování) 11. 6. 2009
- Dojo Toolkit: AJAX a animace 15. 6. 2009
- Dojo Toolkit: pokročilé techniky 22. 6. 2009
Nálepky:
Tento článek je překladem anglického originálu vydaného na portálu Dev.Opera. První a druhou část překladu jsme vydali nedávno.
AJAX: přenos dat
dojo.xhr
nabízí jednoduché, ale mocné API k AJAXu. V novějších verzích Dojo Toolkitu najdete jednoduchou metodu dojo.xhr()
, která interně volá metody, jež znáte z předchozích verzí: dojo.xhrGet
, dojo.xhrPost
, dojo.xhrPut
a dojo.xhrDelete
.
dojo.xhrGet( {
url:"/path/to/remote.html",
load:function(data) {
dojo.byId("updateArea").innerHTML = data;
}
});
S pomocí těchto volání dokážete řadu věcí, ať již získání obsahu vzdáleného souboru zavoláním GET na server a vložení výsledku do právě zobrazené stránky (viz příklad výše) nebo takové progresivní vylepšení klasického formuláře a odeslání jeho dat pomocí POST na server, jak můžete vidět níže:
<!-- jednoduchý formlář: -->
<form id="sampleForm" action="submit.php" method="POST">
<input type="text" name="username" />
<button type="submit">login</button>
</form>
<script type="text/javascript">
dojo.addOnLoad(function() {
var form = dojo.byId("sampleForm"); // ulož odkaz na formulář
dojo.connect(form, "onsubmit", function(e) {
// napoj se a vyřaď z provozu klasické odeslání formuláře
e.preventDefault();
// odešli formulář
dojo.xhrPost( {
form: form,
load: function(data) {
// nastav obsah prvku formuláře na HTML odpověď serveru
form.innerHTML = data;
}
});
});
});
</script>
Jednoduchý PHP skript pro zpracování odeslaných dat a odeslání „nějaké“ odpovědi může vypadat následovně:
<?php
print "Poslali jste:";
print_r($_POST);
?>
Všechny metody dojo.xhr*
přijímají jako jediný argument jednoduchý objekt (hash), obsahující potřebnou sadu parametrů. Nemusíte si tak pamatovat pořadí parametrů, stačí znát jejich jména:
url
: Cílová adresa.handleAs
: Výchozí hodnota jetext
, ale můžete nastavit, jakým způsobem bude callback data přijímat. Nabízí se možnosti:text
,javascript
,json
neboxml
timeout
: Čas (v milisekundách), po který se má na data čekat, před signalizováním chyby.load
: Funkce, která se má zavolat po obdržení odpovědi. Funkce obdrží data odpovědi jako svůj první parametr.error
: Funkce sloužící k obsluze chyb.sync
: Logická hodnota signalizující, zda tentoXMLHttpRequest
má být blokující nebo běžet na pozadí. Výchozí hodnotou jefalse
, což značí asynchronní operaci.handle
: Funkce, která se zavolá jak v případě úspěchu, tak v případě chyby. Obdržený objekt buď obsahuje data nebo jetypeof
„Error“. Někomu se může hodit.form
: Formulář v podobědomNode
(nebo řetězec s ID formuláře), který se použije jako zdroj dat k odeslání. Jak jste viděli v příkladu výše, parametrurl:
je získán zaction
atributu formuláře. Můžete ale použít alternativní URL, pokud kroměform:
zadáte i parametrurl:
.content
: Objekt typu JSON obsahující data k odeslání.
Později si řekneme o „magii“ schované za dojo.hitch
a dojo.partial
, které nám nabídnou více flexibility nad kontextem (scope), ve kterém proběhnou funkce load:
, error:
a handle:
.
FX: mocné a flexibilní API pro animace
Základní dojo.js
obsahuje jednoduchou metodu fade
a vedle ní mocnou metodu animateProperty
, která zajistí animování jakékoliv vlastnosti kaskádových stylů.
ČTĚTE K TÉMATU: Vytváříme animace na webu: knihovna od Opery
Všechny animační metody vrací instanci objektu dojo._Animation
, který nabízí kontrolu nad vlastním probíháním sekvence. K vytvoření a spuštění animace typu fade (pomalé blednutí a následné kompletní zmizení objektu nebo v opačném případě jeho postupné objevování) docílíte následujícím kódem:
dojo.addOnLoad(function() {
dojo.fadeOut( {
node:"someNode", // odkaz na node - id
}).play();
});
Instance dojo._Animation
mají metody play()
, stop()
, status()
, gotoPercent()
a pause()
. S výjimkou dojo.anim
používají všechny pro předání parametrů objekt (hash). Ukažme si použití několika obvyklých parametrů:
var anim = dojo.fadeOut( {
node: "someNode", // node, se kterým pracujeme
duration: 3000, // čas v ms pro spuštění animace
easing: function(n) {
// lineární "easing" funkce, popisuje průběh změny hodnoty
return n;
},
delay: 400, // prodleva v ms mezi zavoláním .play() a spuštěním animace
rate: 10 // framerate
});
anim.play();
Ve volitelné komponentě dojo.fx.easing
najdete víc jak 30 „easing“ funkcí. Nezapomeňte zavolat dojo.require()
, abyste je mohli použít:
dojo.require("dojo.fx.easing");
dojo.addOnLoad(function() {
dojo.fadeOut( {
node:"someNode",
easing: dojo.fx.easing.bounceOut // "odrážení" od koncového bodu animace
}).play();
});
V jednotlivých fázích animačního cyklu jsou vyvolány také příslušné události. V následujícím příkladu si je ukážeme:
dojo.addOnLoad(function() {
dojo.fadeOut( {
node:"someNode",
beforeBeing: function() {
console.log("animace začne, jakmile doběhne kód této události");
},
onBegin: function() {
console.log("animace právě začala");
},
onEnd: function() {
console.log("animace proběhla");
},
onPlay: function() {
console.log("animace začala zavoláním play()");
},
onStop: function() {
console.log("animace byla ukončena");
}
onAnimate: function(val) {
// volá se v každém kroku animace
console.log("aktuální hodnota: ", val);
}
})
});
Nejčastěji používaná událost je onEnd
. Předpokládejme, že chcete nechat nějaký obsah postupně zmizet (fade), nahradit pomocí AJAXu a pak jej opět postupně zobrazit:
var n = dojo.byId("someNode");
dojo.fadeOut( {
node: n,
onEnd: function() {
dojo.xhrGet( {
url: "newContent.html",
load: function(data) {
n.innerHTML = data;
dojo.fadeIn({ node: n }).play();
}
})
}
}).play();
Parametr node:
může být buď odkaz na prvek DOM, nebo řetězec, který předáváte metodě dojo.byId
. V tomto příkladu jsme si uložíli odkaz na prvek DOM do proměnné „n“ a využili jej následně v naší callback funkci.
Pro pokročilé animace můžete použít i dojo.connect
(byl představen v první části):
// vytvoření jednoduché smyčky
var fadein = dojo.fadeIn({ node: "someNode" });
var fadeOut = dojo.fadeOut({ node: "someNode" });
// zavolej fadeout.play(), kdykoliv je vyvolána událost onEnd u fadein:
// a spusť znovu fadein, kdykoliv je vyvolána událost onEnd u fadeout:
dojo.connect(fadein, "onEnd", fadeout, "play");
dojo.connect(fadeout, "onEnd", fadein, "play");
// spustí smyčku
fadeout.play();
Fade je užitečný, ve skutečnosti se jedná o jednoduchý wrapper okolo dojo.animateProperty
. Při mizení animuje vlastnost opacity:
// simuluj fadeIn
dojo.animateProperty( {
node:"someNode",
properties: {
opacity: 1
}
}).play();
// totéž jako:
// dojo.fadeIn({ node: "someNode" }).play();
Ovšem animateProperty
je mnohem mocnější a flexibilnější. Můžete s ní animovat neomezený počet vlastností na jednom DOM prvku:
dojo.animateProperty( {
node:"someNode",
properties: {
// předpokládá se, že jste předali koncovou hodnotu:
opacity:0,
// nastavení počáteční a koncové hodnoty:
marginLeft: {
start:5, end:250
}
// začátek se dopočítá, používá se jednotka "em"
padding: {
end:5, unit:"em"
}
}
}).play();
I zde můžete použít stejné události a parametry z dojo._Animation
. Hash properties
může obsahovat několik formátů. Pokud předáte hodnoty start:
i end:
, proběhne animace mezi nimi. Pokud předáte pouze end:
, bude start:
hodnota dopočítána na základě aktuální hodnoty vlastnosti DOM prvku. Pokud předáte jen jednu celočíselnou hodnotu, bude použita jako koncová hodnota. Pokud nepředáte parametr unit:
, použijí se „px“; tento parametr používejte opatrně, protože některé prohlížeče nepřevádí „em“ a „pt“ na pixely příliš dobře nebo dokonce vůbec.
Všimněte si marginLeft
v předchozím příkladu. V kaskádových stylech byste použili margin-left:
, ovšem pomlčku nelze v JavaScriptu používat, proto se využívá „velbloudího“ zápisu.
Nejspíš jste si všimli, že syntaxe animateProperty
je poněkud rozsáhlá, i toho, že ve většině příkladů na vráceném _Animation
hned voláme .play()
. Existuje stručnější zápis, který používá podobné konvence (tedy kromě používání hashe jako ostatní animační funkce):
dojo.anim("someNode", {
opacity:0,
marginLeft: { start:5, end:250 },
padding: 50
});
Tento příklad provede totéž, co poněkud delší příklad výše. Jedná se o pohodlné volání, ale u dojo.anim
přijdete o flexibilitu, záleží na požadí parametrů a animace je okamžitě automaticky spuštěna. Ale to je jen malý škrábanec na povrchu animačního API Dojo Toolkitu.
Pokračování příště.
Tento článek je překladem textu Introducing The Dojo Toolkit a je zde zveřejněn s laskavým svolením Opera Software.