Vývoj komplexních JavaScriptových aplikací
	Vývoj komplexních JavaScriptových aplikací 
	
		- Webová interaktivní prezentace
- "?" zobrazí krátkou nápovědu
- Tisk jako obvykle
- Pro pokračování stiskněte mezerník
- ondrej.zara@firma.seznam.cz
Bojový plán
	
		- Udržování stavu aplikace
- HTML5 File API
- JavaScript a FastRPC
- Oběd!
Udržování stavu aplikace
	Problém
	
		- Moderní webová aplikace (mapy.cz, mixer.cz, email.cz, …) je tvořena jen jednou stránkou
- Veškerá interakce je realizována JavaScriptem
- Nedochází ke změně adresy URL ⇒ nelze používat Back & Forward
- Co se stane při obnovení stránky? Co když pošlu adresu po ICQ kamarádovi?
Udržování stavu aplikace
	Řešení
	
		- Měnit v URL část za mřížkou (hash)  
- Změna hashe JavaScriptem provede záznam do historie prohlížeče
- Při změně hashe nenastane HTTP požadavek
- Při navigaci historií vzniká událost hashchange
Udržování stavu aplikace
	
	
<a href="#obsah">Obsah</a>
<a href="#kapitola1">Kapitola 1</a>
<a href="#kapitola2">Kapitola 2</a>
Nyní zobrazujeme <span id="current">...</span>
	
/* když se změní hash, uživatelem nebo skriptem */
window.onhashchange = function() {
	$("current").innerHTML = location.hash.substring(1);
}
location.hash = "obsah"; /* explicitní změna stavu */
	HTML5 File API
	Problém
	
		- Nahrávání souboru/ů z počítače uživatele
- <input type="file" />,- Adobe Flash
- Více souborů naráz, informace o souborech, sledování průběhu nahrávání, drag'n'drop
HTML5 File API
	Řešení
	
		- 
			File API
			
				- Výběr více souborů naráz
- JavaScript má k dispozici vybrané soubory, resp. jejich metadata
- To samé při přetažení souboru do prohlížeče (událost drop)
 
- 
			XMLHttpRequest 2
			
				- Předání souboru metodě send()
- Událost progress během uploadu
 
HTML5 File API
	
	
input.onchange = function() {
	var file = input.files[0];
	var data = ["První soubor:"];
	for (var p in file) { data.push(p + ": " + file[p]); }
	$("info").innerHTML = data.join("\n");
	
	var xhr = new XMLHttpRequest();
	xhr.open("post", "/upload", true);
	xhr.send(file);
}
	JavaScript a FastRPC
	Problém
	
		- V jakém formátu přenášet data mezi prohlížečem a serverem?
- Kterým směrem data cestují?
- Jakým způsobem se na serveru formátuje HTTP odpověď?
JavaScript a FastRPC
	Řešení
	
		- Binární serializační formát FastRPC je v Seznamu jako doma
- Backend má data zpravidla ve FastRPC už připravena, nemusí je formátovat
- Přenos binárních dat XMLHttpRequestem je stále problematický
- Pro přenos z/do webového prohlížeče se FastRPC data zakódují v Base64
JavaScript a FastRPC
	
	
var args = [
	555,
	null,
	{key: "value"},
	new Date()
];
var frpc = JAK.FRPC.serializeCall("test", args);
$("info").innerHTML += frpc; /* posloupnost bajtů */
var parsed = JAK.FRPC.parse(frpc);
$("info").innerHTML += "\n" + JSON.stringify(parsed);