Internet Explorer 10 umí rozdělit text odstavce do sloupců a slova automaticky rozdělit podle slovníku přejatého z Microsoft Office. Dokáže pozicovat elementy podle Gridu stejně jako ve WPF. Podporuje databázové ukládání dat i otevřené spojení se serverem. Nechybí ani API pro ukládání a otevírání souborů. Minulá generace měla jako záruku multiplatformnosti POSIX. Dnešní má HTML5.
Internet Explorer 10 je webový prohlížeč, jehož jádro renderuje nejen webové stránky, ale i Metro-style aplikace. Jeho vývoj plynule pokračuje z předešlé verze. Po prvních dvou Platform Preview desítky se objevila třetí ve Windows Developer Preview. Finální verze bude vydána společně s Windows 8 na podzim roku 2012. Většina funkcí je však vývojářům dostupná již dnes.
Flash
Internet Explorer má zabudovaný Adobe Flash Player. Jeho implementace je oproti referenční výkonově optimalizovaná a upravená pro pohodlné ovládání dotyky. Vychází z desktopové implementace, ne z mobilní podmnožiny. Přesto bude podporován i na zařízeních s procesory ARM. Microsoft pomáhal Adobe odstranit řadu bezpečnostních zranitelností a náchylností k pádu, kterými Flash trpěl. Tato implementace je použita i v Aeru, kam se již nemusí instalovat separátní plug-in.
Zatímco v Aeru půjde Flash na všech stránkách, v Metru jen a pouze na těch, které jsou uvedeny v Compatibility View Listu. Aby byl web zařazen do tohoto seznamu, musí obsah stránky ve Flashi reagovat na dotyk, musí dobře pracovat s klávesnicí zobrazenou na displeji a nesmí provádět složité výpočty, aby se šetřila baterie zařízení.
API
Animation Frames
Animace, které se odehrávají postupnou změnou pozice elementu vyvolanou přes setTimeout
mají tu nevýhodu, že se velká část změn nemusí ani vykreslit. Zbytečně se tak vytěžuje CPU a vybíjí baterie. Proto se zavádí metoda requestAnimationFrame
která se liší od setTimeout
především tím, že čas vybuzení závisí na frekvenci displeje zařízení. Navíc v případě několika animací současně může prohlížeč všechny změny provést naráz. A pokud není záložka aktivní, animace se vůbec neprovádí.
File Reader
Práce se soubory znamenala vždy upload souboru na server. To už nemusí platit, protože přetažením souboru do okna prohlížeče nebo přes input typu text je možné ze souboru číst v textovém nebo binárním režimu.
var file = document.getElementById('file').files[0];
var reader = new FileReader();
reader.onload = loaded;
reader.readAsText(file, 'UTF-16');
function loaded(evt) {
var fileString = evt.target.result;
}
File Saving
Objekty reprezentující soubory jako File či Blob bude možné snadno uložit do počítače. Do teď je možné ukládat soubory jen jako obsloužení požadavku s hlavičkou, kterou prohlížeč neumí otevřít. Nyní je možné uložit jako soubor data, která ani nemusí být na serveru, ale pouze v paměti prohlížeče.
Gesture Events
Windows se stará o veškeré výpočty související s gesty a poskytuje rovnou jejich výsledky. Lze se tedy přihlásit přímo k odběru událostí pro gesta MSGestureTap
, MSGestureDoubleTap
a MSGestureHold
. Pro složitější zpracování gest slouží události MSGestureStart
, MSGestureChange
a MSGestureEnd
. Ty poskytují přesné údaje o hybnosti, úhlu otočení nebo vektoru posunu.
document.addEventListener("MSGestureChange",logGesture,false);
var log = document.getElementById("log");
function logGesture(event) {
var gesture = "Translation: " + event.translationX + "px, " + event.translationY + "px<br>";
gesture += "Scale: " + event.scale + "x<br>";
gesture += "Rotation: " + event.rotation*360/Math.PI + " deg<br>";
gesture += "Velocity: " + event.velocityX + ", " + event.velocityY;
log.innerHTML = gesture;
}
Hit Testing
Web Developer Tools umožňují kliknutím na prvek stránky zobrazit jeho zdrojový kód. Visual Studio to bude umět také, jen s tím rozdílem, že ukáže zdrojový kód, který generuje HTML příslušného prvku. Aby to fungovalo se všemi prohlížeči, je snaha toto API standardizovat.
IndexedDB
Z původních plánů zvolit relační databázi SQLLite za hlavní databázi HTML5 naštěstí sešlo a zvítězil rozumnější nápad vybrat objektovou databázi IndexedDB. Není proto nutné složitě mapovat data na objekty, protože databáze ukládá javascriptové objekty přímo. Místo tabulek se používají object stores. Slouží ale ke stejnému účelu. Stejně jako relační kolegové mají také indexy, indexujcí vlastnosti nebo metody objektů. Každý objekt má svůj jednoznačný identifikátor. Ten se nastavuje v indexu vlastností keyPath
. Dotaz na data vypadá nějak takto:
var oRequestDB = window.indexedDB.open("Library");
oRequestDB.onsuccess = function (event) {
db1 = oRequestDB.result;
if (db1.version == 1) {
txn = db1.transaction(["Books"], IDBTransaction.READ_ONLY);
var objStoreReq = txn.objectStore("Books");
var request = objStoreReq.get("Book0");
request.onsuccess = processGet;
}
};
Nic jako LINQ bohužel podporováno není, a tak se musíme smířit s dotazováním na konkrétní objekt (jako v příkladu výše), filtrací, nebo iterováním indexem.
Page Visibility
Nová událost visibilitychange
objektu document
je užitečná například v případě, kdy uživatel přehrává video a přepne na jinou záložku. V tu chvíli je možné na událost zareagovat a přehrávání videa pozastavit, aby se zbytečně nezatěžoval server, když uživatel video stejně nevidí.
Pointer Events
Události pro myš i dotyk byly sjednoceny do čtyř základních událostí MSPointerOver
, MSPointerOut
, MSPointerHover
a MSPointerCancel
pro ztrátu kontaktu (což se s myší nikdy nemůže stát, leda jejím vypojením z USB). Kvůli zpětné kompatibilitě prohlížeč vyvolá ještě odpovídající události pro myš. Pro zjištění, zda prohlížeč podporuje gesta, existuje vlastnosti window.navigator.msPointerEnabled
.
Multi-File Upload
Jak známo, dialog pro otevření souboru může sloužit k výběru buď jednoho, nebo více souborů. Pro web však nešel vícesouborový režim použít. I na to myslí specifikace HTML5 a zavádí jeden input
na více souborů:
<form action="#" method="post" enctype="multipart/form-data">
<input name="uploads[]" type="file" multiple>
<input type="submit">
</form>
Resource Timing
Toto API slouží k přesnému měření doby, která uběhla mezi načítáním sledovaných částí stránky (například obrázků).
WebSockets
HTTP je protokol pro webové stránky, ne webové aplikace. Klient si řekne o data a server mu je pošle. Není možné, aby server plynule posílal data klientovi, nebo naopak. Problém sice jde do určité míry obejít, ale způsobuje velké složitosti na straně serverových clusterů.
WebSocekts je protokol, který byl navržen pro současný web. Počítá s firewally a proxy, podporuje TCP i SSL a už samotný protokol se stará o to, aby bylo oboustranné spojení udržováno živé pomocí Ping/Pong. Má to i tu výhodu, že se server dozví o tom, že klient ztratil spojení. Protože proxy projde jen HTTP protokol, je spojení navazováno nejprve HTTP protokolem a až později dojde k přepnutí na WebSockets. Každá zpráva v protokolu má určen typ přenášených dat (text, Blob, atd.).
var url = "ws://domain.com/ocr/handler.ashx";
var websocket = new WebSocket(url);
websocket.onmessage = function(event) {
if (event.data instanceof String) {
var text = event.data;
}
}
if (socket.readyState == WebSocket.OPEN) {
var canvas = document.getElementById('canvas');
websocket.send(canvas.msToBlob());
}
Na straně serveru ve jmenném prostoru Microsoft.Web.WebSockets
je třída WebSocketHandler
, ze které lze podědit vlastní Genric Handler a pohodlně obsluhovat protokol WebSockets.
Web Workers
Protože je veškerý JavaScript vykonáván v UI vlákně, je nevhodný pro náročné výpočty. Ostatně pro ně ani nebyl navržen. Pro výpočty na pozadí slouží Web Workers. Aby však nebylo nutné řešit velmi náročnou synchronizaci mezi více vlákny a DOM, nemá kód vykonávaný na pozadí k DOM přístup. Jediná šance ovlivnit DOM je poslat zprávu do UI vlákna a z něj požadovanou změnu provést.
XmlHttpRequest Level 2
Přibyly události onloadstart
, onprogress
, onabort
, onerror
, onload
, ontimeout
a onloadend
, které mají zpříjemnit současné zjišťování, co že se to vlastně po vyvolání události onreadystatechange
stalo. Další novinkou je možnost nastavit timeout
i jednoduše zjistit průběh odesílání požadavku k serveru. Aby bylo možné snadno přenášet soubory, je možné odesílat i objekty typu ArrayBuffer
, Blob
, File
a FormData
. Dále je možné nastavit, aby byl požadavek anonymní. V tom případě se nebudou odesílat referrer
, origin
, ani credentails
. Navíc je možné odesílat data i na server v jiné doméně.
CSS3
3D Transforms
Transformace nemá vliv na rozložení stránky. Označování textu, stejně jako formulářové prvky, reagují stále stejně i po jejím použití. Po rotaci kolem nějaké osy jde určit i hloubka perspektivy. Vybavujete si film Star Wars a žlutý text na jeho začátku? Není to nic, co by nešlo udělat pomocí CSS3 3D transformací. Element video se překryje odstavcem, který se otočí kolem osy X a zároveň se nastaví poměrně velká hloubka perspektivy. Jak na posun textu se dočtete pod nadpisem Transitions.
Animations
Na rozdíl od Transitions, které jsou vykonány hned, jak se změní CSS hodnota, přiřazuje se animaci přes vlastnost -ms-animation-name
jméno, pomocí kterého se spouští přes JavaScript. Animace má klíčové rámce, ve kterých se definuje vždy určitá CSS vlastnost. Rychlost animace v závislosti na čase se dá definovat vlastní funkcí jako Bezierova křivka, takže k tomu stačí jen 4 čísla.
Background & Borders
Vlastností background-clip
a jejími hodnotami border-box
a content-box
lze určit, jestli bude rámování elementu průhledné vůči barvě pozadí nebo barvě elementu.
Content Flow
Pokud nějaký element, typicky obrázek, zasahuje do elementu s textem, text ho obteče. Ne, že by obrázky nešly textem obtékat již nyní. Ale v případě, kdy máte více sloupců a obrázek širší, než sloupec, už tuto vlastnost potřebujete.
Exclusions
Obtékaný text vždy počítá s obtékáním ve tvaru obdélníka. Obtékání divočejších tvarů je ale mimo zásady dobré typografie. Nicméně to jde. Je možné definovat prázdný div
, kterému se určí tvar, velikost a natočení. Po jeho umístění se do textu vymezí oblast pro obtékání.
Flexbox
Flexbox slouží pro jednoduché rozložení prvků, které mají zabírat celý prostor a přizpůsobovat se jeho velikosti. Dá se dobře použít například pro zobrazení ikon složek nebo souborů. Aplikuje se nastavením hodnoty box
vlastnosti display
. Následně jde nastavit dalších osm vlastností souvisejících s flexboxem. Všechny mezery mezi jednotlivými boxy jsou rozloženy rovnoměrně jak ve svislém, tak i vodorovném směru.
Gradients
Vlastnost background-image
vždy měla jedinou myslitelnou hodnotu url
s parametrem směřujícím k obrázku. Protože velká část obrázků stránky jsou jen gradienty, lze nyní místo url
použít i hodnotu -ms-linear-gradient
a parametry gradient určit. Podpora průhlednosti už je samozřejmostí. Prefix je zatím nutný, protože pracovní skupina specifikace má stále zapotřebí měnit význam pořadí parametrů.
Grid Layout
Máte rádi systém pozicování prvků z WPF aplikací a štve vás, že to nejde použít i pro HTML? Tak už to jde. V podstatě jde snadno docílit toho, co se dříve řešilo tabulkami. Rozřezat oblast a určitým sloupcům či řádkům nastavit buď stálou velikost v pixelech, nebo velikost závisející na velikosti celé oblasti.
Hyphenation
Internet Explorer 10 bude umět rozdělení textu do sloupců. S tím souvisí i dělení slov, které IE10 podporuje i automaticky. Poskytuje ho služba Windows pro práci s textem, která byla přejeta od Microsoft Office. Pokud tedy nastavíte <html lang="cs">
, budou česká slova dělena správně pomocí slovníku, který se nacházel v Microsoft Office. Příznivce LaTeXu určitě potěší, že je možné určit i nejvyšší počet řádků, na kterých se po sobě může nacházet rozdělené slovo. Osamocená písmena jsou pod kontrolou také.
Multi-column Layout
V roce 1996 bylo možné v Netscape 3 použít tag MULTICOL
(tenkrát bylo ještě zvykem psát tagy velkými písmeny) a rozdělit tak text do více sloupců. Nyní je možné v IE10 pomocí CSS docílit téhož. Navíc je ale možné nastavit automatický počet sloupců, což je dnes pro zařízení s nejrůznější velikostí displeje velmi užitečné. Vykreslení svislé čáry mezi sloupci, která je odděluje, je záležitostí jediné CSS vlastnosti column-rule
. Hodnotou balance
vlastnosti column-fill
lze nastavit stejnou výšku všech sloupců.
Panning
Pokud se nastaví overflow
na scroll
, lze pomocí vlastnosti -ms-overflow-style
nastavovat, jak se má rolování projevovat. Hodnota -ms-autohiding-scrollbar
nastaví scrollbary tak, že budou viditelné jen pokud je kurzor poblíž nich. Hodnota auto
zviditelní scrollbary v Internet Exploreru a schová jev Metro style aplikaci. Posouvání obsahu gestem je povoleno vždy.
Regions
Pro rozložení textu stylem známým z časopisů slouží regiony. Jedná se o v podstatě o overflow: hidden
s tím, že obsah, který už přetéká a je skrytý, se zobrazí v jiném elementu. Dá se tak docílit plynulého přetékání textu přes několik elementů.
Transitions
Jak bylo zmíněno u 3D Transforms, posouvání žlutého textu ve filmu Star Wars jde definovat velmi snadno. Stačí změnit nějakou vlastnost CSS a určit, za jak dlouho se projeví a jakou rychlostí vůči času má děj probíhat. Konkrétně tedy po změně hodnoty translate3d
vlastnosti -ms-transform3d
elementu s vlastností -ms-transition
se bude změna provádět plynule, takže se bude celý text pomalu posouvat hlouběji do vesmíru.
Text Shadow
Je jedna z nejžádanějších funkcí. Patří však mezi ty nejvíce problematické. Všechny verze Internet Exploreru až do verze 8 vykreslovaly přes GDI+. Verze 9 však vykresluje přes DirectX, stejně jako WPF. A vzpomeňme na vývoj WPF, kde největší problém byl právě vykreslování písem. Byla to jediná věc, která prakticky bránila WPF používat, až do doby kdy bylo vykreslování písem přesunuto přímo do DirectX pod názvem DirectWrite. Ani to však nestačilo. Text Shadow v pojetí CSS umí hodně a tomu všemu se musel DirectWrite přizpůsobit. Stínu lze totiž nastavit svislý i vodorovný odstup, intenzitu, ostrost a co se týče barvy, jde definovat gradient několika barev. Není proto divu, že vše trvalo tak dlouho. Čekání ale stálo za to. Vše se totiž odehrává na GPU.
Snap Points
Pro obsah, který přetéká element, jdou nastavit záchytné body, mezi kterými se bude obsah posouvat. Lze to využít především k zobrazení sady obrázků, které jsou umístěny vodorovně za sebou, a není užitečné, aby byla zobrazena půlka z každého ze sousedních obrázků. Místo toho se dá jednoduše gesty posouvat z jednoho obrázku na druhý.
Zooming
Nová vlastnost -ms-content-zooming
s hodnotou zoom
dovoluje gesty zvětšovat a zmenšovat element. Nezvětšuje ani nezmenšuje se tak celá stránka, ale jen její část. To je žádoucí například v mapách, kde uživatel chce typicky přiblížit určitou oblast a neočekává zvětšení ovládacích prvků okolo mapy.
HTML5
Application Cache
Za dob, kdy internetovými vodami brázdily Internet Explorery 4, a počátek každé plavby doprovázela melodie modemového vytáčení, existovaly kanály, kde webové stránky fungovaly, i když byl počítač offline. Pracovalo se s tím tak, že jste se připojili, rychle stáhli aktualizace kanálů a zase odpojili. Teprve potom se v klidu četlo. Kanály byly jako zastaralé v sedmé verzi Internet Exploreru odstraněny, aby se o tři verze dál mohli v podobě Application Cache zase vrátit. Nejedná se totiž o nic jiného, než o seznam souborů, které se mají stáhnout, aby stránka fungovala offline.
<html manifest="/cache.manifest">
Async
Atribut async
tagu script
je velmi podobný atributu defer
. Liší se od něj jen tím, že není zaručeno, že se budou skripty vykonávat ve stejném pořadí, v jakém jsou na stránce. Vykonají se ihned po stažení a po sestavení celého DOM.
<script async src="script.js" onload="Init()"></script>
Drag & Drop
Elementy mají atribut draggable
, který určuje, je-li možné je přesouvat. K reakci na táhnutí přes element nebo spuštění elementu nad jiným slouží událost dragover
respektive drop
. Nejzajímavější je však skutečnost, že lze přetahovat i soubory z průzkumníka do okna prohlížeče.
var dropArea = document.getElementById('dropspot');
dropArea.addEventListener('drop', dropHandler, false);
function dropHandler(event) {
var filelist = event.dataTransfer.files;
}
Forms & Validation
Klasický input byl rozšířen o typy email
a url
. Vlastní typy lze definovat pomocí regulárního výrazu v atributu pattern
. Přibyl atribut required
zabraňující odeslání formuláře, pokud pole není vyplněno. Pokud je pole vyplněno chybně, je na něj možné aplikovat styl pseudotřídou :invalid
.
History
Vývoj moderních stránek je náročný. Načítání nové stránky při každé změně obsahu je pomalé. Dynamické načítání veškerého obsahu znemožňuje použití tlačítka zpět. Událost onhashchange
funguje, ale pořád to není ono. Až HTML History konečně přináší dynamickou náhradu za odkaz.
history.pushState(data, title, url);
history.replaceState(data, title, url);
Metody history.pushState
a history.replaceState
nahrazují location.href
respektive location.replace
. Pro registrování události kliknutí na tlačítko zpět či vpřed slouží popstate
.
window.addEventListener("DOMContentLoaded", loadState, false);
window.addEventListener("popstate", loadState, false);
function loadState() {
var data = history.state;
}
Parser
Internet Explorer 10 obsahuje parser HTML5. Jedná se o standardizovaný parser, který zpracovává nejen HTML5, ale i HTML3, HTML4 a XHTML1. Conditional Comments je možné používat i nadále, ale je možné mířit pouze na starší verze Internet Exploreru.
<!--[if IE]>
Tento obsah je zobrazen pouze v Internet Exploreru od verze 5 do verze 9.
<![endif]-->
Jedním z přínosů nového parseru je optimalizované vykonávání přiřazení vlastnosti innerHTML
.
Sandbox
Tag iframe
může obsahovat nový atribut sandbox
, který říká, že stránka v rámci bude mít zakázaný JavaScript, veškeré doplňky prohlížeče, target="top"
nebude účinný a formuláře budou zapovězené. Jednotlivá privilegia jdou zapnout, jsou-li potřeba.
<iframe src="iframe.html" sandbox="allow-scripts allow-forms allow-top-navigation"></iframe>
Video Captioning
Tag <video>
nyní podporuje titulky, a sice ve formátu TTML (který podporuje také Silverlight) a WebVTT.
<video>
<source type="video/mp4" src="video.mp4"></source>
<track src="captions.ttml" label="České titulky" kind="captions" srclang="cs-cz" default></track>
</video>
SVG
Filter Effects
Vektorovou grafiku lze obohatit o grafické efekty, z nichž nejefektnější je asi osvícení scény. Vše se počítá, jak je v IE zvykem, na GPU. Lze tím dosáhnout moc pěkného efektu. Pokud pozadí stránky vykreslíte přes SVG, můžete určité čísti rozmazat pomocí filtru feGaussianBlur
a tím položit základ skleněnému podkladu stránky.