Академический Документы
Профессиональный Документы
Культура Документы
UUарп
ИЗУЧАЕМ
Библиотека специалиста
~nn72Рф
Москва • Санкт-Петербурr • Ни)lQtиi HOBropoA • Вороне.
Ростов-на-Дону • Екатеринбурr • Самара • Новосибирск
Киев • Харьков • Минск
2011
ББК 32.988.02-018
УДК 004.438.5
Л81
ISBN 978-5-459-00269-0
С помощью этой книги вы узнаете, каковы новые семантики и структуры НТМL5, как использо
вать мультимедийные элементы НТМL5 дЛЯ размещения аудио- и видеоданных, как разрабатывать
«умные» ве6-формы И усовершенствовать приложения, использующие географическую привязку.
с помощью API геолокации.
Книга адресована веб-разработчикам, знакомым с НТМL или XHТМL и желающим быстро
освоить новые возможности языка НТМL5.
ББК 32.988.02-018
УДК 004.438.5
Введение 11
Для кого эта книга? 13
Чем не является эта книга 13
Что мы имеем в виду под HTML5 14
Кто? Что? Когда? Почему? Краткая история HTML5 14
Как HTML5 чуть не канул в беэвестность 15
Принципы, скрывающиеся за HTML5 17
Гnава 2. Текст 47
Соэданиеструктуры основныхобластей контента 49
Кое-что интересное об элементах <header> и <footer> 53
Добавление сообщений блога и комментариев 55
6 • Содержание
spellcheck 90
tabindex (=-1) 90
Свойства, не рассматриваемые в этой книге 91
<embed> 92
<keygen> 92
<progress>, <meter> 92
<menu>, <command> 92
microdata 93
<style scoped> 93
Заключение 93
Глава 3. Формы 95
Мы • HTML, и теперь он тоже нас. 97
Новые типы ввода данных 98
Тип ввода данных email 98
Тип ввода данных URL 99
Тип ввода данных date 99
Тип ввода данных time 100
Тип ввода данных datetime 101
Тип ввода данных month 101
Тип ввода данных week 101
Тип ввода данных number 102
Тип ввода данных range 102
Тип ввода данных search 102
Тип ввода данных tel 102
Тип ввода данных color 103
Новые атрибуты 103
Атрибут list 103
Атрибут autofocus 104
Атрибут placeholder 104
Атрибут required 105
Атрибут multiple 105
Атрибут pattern 105
Атрибут autocomplete 107
Атрибуты min и тах 107
Атрибут step 108
8 • Содержание
htt . /www. З.огgfТRlh m15/ - это официальная версия WЗС, а ":J:I/dev NЗ.огg/ tml5/s "1 -
последняя рабочая версия, которая еще может измениться.
Версию WHATWG можно найти на p;'/what g.or Ihtml5, но будьте осторожны: она называ
ется «HTML5 (including next generation additions still in development)>> (комментарий в скобках
означает «включая дополнения следующего поколения, находящиеся в стадии разработки»)
и в ней есть чрезвычайно экспериментальные идеи вроде элемента > • Не думайте, что
если о нем говорится в этом документе, то он хоть где-то реализован или детально продуман.
8ЕБ-ПРИЛОЖЕНИЯ
НЕ РА3РУШАЙТЕ СЕТЬ
ПОДДЕРЖКА HTML5
Сейчас HTML5 развивается очень быстро, и даже хотя пер
вая рабочая версия спецификации была готова только в октя
бре 2009 года, браузеры начали внедрять поддержку HTML5
(и особенно API) раньше этой даты. Поддержка HTML5 будет
постепенно улучшаться по мере того, как браузеры будут при
ниматься за свойства.
Введение • 21
Пристегнули ремень?
Поехали!
Глава 1
ОСНОВН'АЯ СТРУКТУРА
БрюсЛоусон
Основная структура • 25
<HEAD>
Итак, тип документа:
<!doctype html>
Готово. И никаких URL, которые даже самым опытным веб
разработчикам приходится вырезать и вставлять. Обратите
внимание на то, что здесь не указан номер версии. Такое объ
явление типа скорее напоминает не правило, а заклинание: оно
I • : . •
Несмотря на то что в HTML5 допустимы все приведенные выше варианты, стоит все же отдавать
предпочтение какому-то одному из них. Использование раз ного си нтаксиса, как правило, ока
зывается настоящим кошмаром, особенно если в создании проекта принимает участие большая
группа разработчиков.
Лучше всего выбрать стиль, который наиболее удобен для вас, и придерживаться его. При этом
н е важно, что вы выберете; Реми следует правилам синтаксиса XHTML, а Брюс предпочитает
строчные буквы и минимизацию атрибутов ( >-, 1". - .: "'. вместо ~:.:.; ': :-':'.: :;~ ": ' : . " ,.) и ис
пользует кавычки для атрибутов только при необходимости, например при добавлении двух
классов к элементу « :.:: '," -::' ,О, :: :; =';'r,[y " '. ':" . '. __ , но ' .:: ~ " " . ] .~ с= <' .. - : с',. ': =- ,: ,: ,: ._ : . , ~ -; '~ л - з. г ; ," ; ).
в этой книге вы н а йд ете примеры обоих стилей, поскольку каждый из ее авторов привык ра
ботать в наиболее комфортном для него режиме. Поэтому вам следует научиться читать код,
написанный в этих двух стилях.
Так как вы только начинаете работать с HTML5, вы абсолютно свободны в выборе своего соб
ственного стиля - н о сделав этот выбор, оставайтесь верным ему.
bL.~J
..... ... .. - ....... " ... .. . . . ... - ..... ...... " " . ..
sou...,.
1. < !doc~)'Pe h~
2. <м:tаcbanl!t-at.f-8>"'
З. <t1Ue)Itl.ureat.1nq bloq</tlt.le)'"
4 <p>TodI.y 1 dranlc coffee for bRakfa.t.. нi houL'. звеее , 1 went. to bed .<tp>
Рис. 1.1 . ПотрясаlOщий факт: документ без тегов <he a d>, <bo d y>
и <ht ml> успешно проходитвалидациlO.
.
I~
,
_1a;_ ;_·_lIiilol:loiL l.·_ ._~ ___
а
I~
.tt
~
.
IIЯ
~OO M
ш;-
- "У
['''i"' [jj(~;TI&1LflLiI~:X
1'.7:
<t doc ty pe >
<М&1>
......... 510<>.. EmwCOOOOIO
. ~Ц SввtdI
8: <.head>
ctulr set ....ut f -S..
( 8le t 8 '>
<tit l e>I nt er est i ns: blOl(/title >
i </ М_!>
['1' .....-009 _ - _ _
File Find OiS4bIe У- Outl ine lmages С.кhс То." V.lю.tе j ВfO'IAIЯf Мode: IE8 Document Мode IE8 S
-------
~1 css
~ S(~
г
., хпро
ЕЭ ~~
Profilot
a ·( l'1t _l>
~·<head>
I !··- <t it lе>I nt еr-est inc bloa</t 1tle)
i ~· · < Jtet . с h it гs еt. - ut f'· S-'>
\ОН _у >
"нр>
:··· TC!'Kt - Today 1 а,.а" " coftee f or breakf ast. 14 hours L Пеl' . 1 wen t tc Ье а .
. .
ВАЛИДАЦИЯ B~E E~E ИМЕЕТ, 3Н~ЧЕНИ~?
При таком свободном синтаксисе мы можем опускать подразумеваемые теги (такие как <г"t;;I.:.~'
c:he:;c:> И <,,"ri :,'~ )' и, что гораздо важнее, поскольку HTML5 создает согласованную объектную
модель документа (DOM) для каждого случая плохой разметки, вам будет простительно за
думаться над тем, имеет ли валидация все еще какое-то значение. Мы тоже задаем себе этот
вопрос.
Мы пришли к выводу, что валидация всегда была лишь инструментом, средством для достижения
цели, а не самой целью.
Целью же является семантическая разметка: мы пытаемся добиться того, чтобы выбор элемен
тов определялся значением содержимого, а не его внешним представлением. Можно создать
веб-страницу в полном соответствии с правилами, используя только элементы 6 i', И "' р с ,, ' но
такая разметка не будет иметь отношения к семантике. И наоборот, один незакодированный
амперсандможет сделать прекрасноструктурированнуюи семантическибогатую веб-страницу
невалидной, но при этом она останется семантической.
1 footer 179528
2 menu 146637
3 style1 138308
4 msonormal 123374
5 text 122911
6 content 113 951
7 title 91957
8 style2 89851
9 header 89247
10 copyright 86979
11 button 81503
12 main 69620
13 style3 69349
14 small 68995
15 nav 68634
16 clear 68571
17 search 59802
18 style4 56032
19 logo 48831
20 body 48052
1 footer 288061
2 content 228661
3 header 223726
4 logo 121 352
5 container 119877
6 main 106327
Основная структура • 31
7 tabIe1 101677
8 menu 96161
9 layer1 93920
10 autonumber1 77 350
11 search 74887
12 пау 72057
13 wrapper 66730
14 top 66615
15 tabIe2 57934
16 layer2 56823
17 sidebar 52416
18 image1 48922
19 banner 44592
20 navigation 43664
div id="header"
div class=''post''
div class=''post''
div id="footer"
<header>
<h1>My interesting life</h1>
</header>
<nav>
<h2>Menu</h2>
<ul>
<li><a href="last-wееk.html">Lаst
-, week</a></li>
<li><a href="archive.html"
-, >Archives</a></li>
</ul>
</nav>
<article>
<h2>Yesterday</h2>
<p>Today 1 drank coffee for breakfast.
-, 14 hours later,I went to bed.</p>
</article>
<article>
<h2>Tuesday</h2>
<p>Ran out of coffee, so had orange juice
-, for breakfast.
~ It was frorn concentrate.</p>
</article>
<footer>
<p><small>This is copyright Ьу Bruce
-, Sharp. Contact те to
~ negotiate the movie rights.</small></p>
</footer>
34 • Глава 1
header I
article
nav
article
footer
Рис. 1.5. HTML5-структуранашего блога
'.. .-
НУ ПО~ЕМУ ЖЕ ЗДЕСЬ НЕТ,ЭЛЕМЕНТА <CONТENT>? .
':.to .~. _ • • ~.
Довольно просто представить себе, как работало бы наше гипотетическое сочетание клавиш
«переход К панели навигации», однако гораздо чаще пользователю требуется переход к основ
ной области контента. Некоторые дизайнеры для удобства работы с сайтом добавляют вверху
страницы ссылку «skip links», которая позволяет программам экранного доступа обойти элемен
ты навигации . Но ведь в HTML5 нет элемента ' ,,:'. " ': ';', '-', К которому должен осуществляться
переход! Как в таком случае программа экранного доступа (или поисковая система) узнает, где
начинается основная область контента?
На самом деле определить это очень просто: для этого можно использовать «алгоритм Скуби
Ду» (как я его называю). Всегда очевидно, что в костюме при видения скрывается угрюмый при
вратник парка развлечений, просто потому, что о н единственный персонаж серии, который не
является Фредом, Дафной, Велмой, Шэгги и Скуби. Точно так же первый фрагмент контента, не
заключенный в теги -, " "',, '-' ''''Е_', '- , < :i 5 l '::l':O ' ил и .- вг - ' , является признаком начала ос
новной области контента, и при этом не важно, находится ли он внутри элемента " ar': 1: 1::> или
л или же является прямым потомком элемента ',:: ~..::lY , ', Если вы хотите перестраховаться,
используйтеWAI-ARIA и добавьте :: С: ~ е =Го:;, 1 г, К тегу, обрамляющему основной контент (более
подробно о WAI-ARIA рассказывается в главе 2).
Тот факт, что для второстепенных областей страницы используются отдельные элементы, а для
основной - нет (поскольку она вычисляется путем исключения этих областей), кажется па
радоксальным. Однако такой вариант все же является лучшим решением, так как добавление
новых элементов в язык создает серьезные трудности для производителей браузеров. усложняя
процесс тестирования и повышая риск регрессии .
ОФОРМЛЕНИЕ НТМL5-ДОКУМЕНТА
С ПОМОЩЬЮ С55
ПРИМЕЧАНИЕ
ВНИМАНИЕ
ПРИМЕЧАНИЕ
КОГДА ИСПОЛЬ3УЮТСЯНОВЫЕ
СТРУКТУРНЫЕ3ЛЕМЕНТЫ HTML5
<HEADER>
в приведенном ранее примере, как и на большинстве сайтов,
header является первым элементом на странице и содержит
название сайта, логотипы, ссылки на rлавную страницу и т. д.
В спецификацииговоритсяследующее:
Элемент h е а d е r представляет собой набор предварительных
данных и навигационных средств ... Обратите внимание: пред
полагается, что элемент header должен содержать заголовок
раздела (элементы ьъ, h6 или hgrоuй, но это не обязательно.
Элемент hеаdеrможет также использоваться для обрамления
списка содержимого раздела, формы поиска или любых необхо
димых логотипов.
Основная структура • Э9
элемента <hgroup>.
<header>
<а href="/"><img src=logo.png alt="home"></a>
<hgroup>
<h1>My interesting blog</hl>
<h2>Tedium, dullness and monotony</h2>
</hgroup>
</header>
Элемент heade r может также содержать панедь навиrации. Это
может оказаться полезным при использовании панели глобаль
ной навигации, особенно для сайтов, основанных на шаблоне,
rде весь элемент <hеаdеr>может быть добавлен из файла ша
блона. Таким образом, например,устроена rоризонтаЛЬНaJI
панедь навиrации на сайте httр:llwww.thаicооkегу.со.uk!(рис. 1.6).
<header>
<hgroup>
<h1>Thai cookery school</h1>
<h2>Learn authentic Thai cookery in your
own home</h2>
</hgroup>
<nav>
<ul>
<li>Home</li>
<li><a href="courses.html">Cookery
I courses</a></li>
<li><a href="contact.html">Contact</
I a></li>
</ul>
</nav>
</header>
40 • Глава 1
....от tluth"ntk
.
Тlюl с(Юk"ry In уour own hormt.
Ноте Cookery Courses Contact
lAl
Рис.
Ral ' " North Тhatland, and I offer
latlored Тhal cool<ery lessons '" yoor
ownhome.
<h e a de r>
<h g r o up>
<h l>Tha i cookery school ></hl >
<h 2> Le a r n authentic Thai cookery in your own
..., home </h2 >
</ h g r o up>
</ h e a de r>
<n a v>
<u l>
<l i> Home</ l i>
<l i>< a href="courses.html" >Cookery
..., courses < /a ></li >
<l i>< a href="contact.html" >Contact </a ></li >
</ u l>
</ nav>
Выбор в значительной степени зависит от того, считаете ли
вы, что паиель навигации по сайту является частью элемен
та <h e a d e r> , и от практических соображений, касающихся
простоты написания стилей. Возьмем в качестве примера мой
собственный сайт, в котором слева расположена очень длинная
панель навигации по сайту, которая может оказаться длин
нее основного контента. Если в таком случае добавить <na v>
В <h e a de r> , будет довольно трудно разместить основной кон
тент справа и добавить футер, поэтому я поместил панель на
вигации вне элемента <he a de r> на одном уровне с <b ody> , как
в предыдущем примере (рис. 1.7).
Обратите внимание на то, что сейчас мы занимаемся созданием
основного элемента header страницы; на самом деле, таких
Основная структура • 41
элементов может быть несколько - об этом рассказывается
в главе 2.
г-~---~- --------~--------------.------.-- - - .
(
, Rcd ~рьу~ee~таJп::=:::u~r
Llving Legend
Readmor~ ..
• ..... 1.
<NAV>
Элемент <na v > используется для создания панели навигации.
Панель навигации состоит из ссылок, позволяющих переме
щаться по странице (так, например, элемент оглавления, рас
положенного в начале статьи, связан с определенным местом
содержимого страницы.
<nav>
<р><а href="/">Home</a></p>
<р><а href="/about">About</a></p>
</nav>
В панели навигации можно использовать заголовки.
<nav>
<h2>Main navigation</h2>
<ul>
<li><a href="/about">About me</a></li>
<li><a href="/news">News</a></li>
</ul>
</nav>
пример. врезок и боковых панедей), для рекламы. для групп • Вцас:. , вт ·CIegg .hould
know th.t hls оп..,
элементов <nav> И для дpyroгo контента, который должен рас ,..lIatk hoP4 0#
8chi8vlng "'- Ш'. holv
grllll of PI\ Is. de.I.. ,
полагаться отдельно от основного» (t,ttр:lldеv.wЗ.огg/htmIS/sресl • к.,ь ~ I ВrUt8 It'• •
diНicutt .pot for 8"ybody
wishlng to . . . th.
sections.html#the-aside-element ). Introdr.кtton of РА . А8 it
СI.IП'8пtfу •••
<a s i de>
<na v>
Blah blah
• Web Нosbng ьу
<h2>Pa ge s</ h2> NSOeStgП.
<ul> </ ul>
</ rlav>
<nav>
<h2>Re c e nt comments </h2 >
<ul> </ ul>
</ na v>
<s e c t i on>
Proudl'f~ by
<h2>bl a h blah</h2 > w""""-s.
< а href=" ">Web hosting Ь у Lovel yHost</a > EntrI_ (11.55 ) .nd
eomrn.1tb (R58).
<i rng src=" ">
<p> Powe r e d Ьу < а href=" . . . " >WordPress </a ></p >
< р>< а href=" . .. " >Entries (RSS) </a> Рис. 1.8. Боковая панель
моего блога,
-, and < а href=" ... " >Comments (RSS) </a ></p>
в которой помимо
</ s e c t i on>
навигации содержатся
</ a s i de>
сведения
Обратите внимание на то. что для раздела «Blah Blah» элемент
об издательствах
<nav> не используется. так как ссылка на мой веб-хост, моя фото и фотографии
графия и две RSS-ссылки не являются «разделами. СОСТОЯЩИМИ привлекательных
<FOOTER>
в спецификацииговорится. что элемеНТ<fооtеr> используется
для создания «футера для расположенногоуровнем выше струк
турированного контента или структурированного корневого
TJ - DNr5A11d GClDot
Tj. -"OIIAiII'I:М8rtIrN«hl ••
"'"
~lfllQi:l tЬ .. t~ 0CI "0II1б11d
IО nlolQ~otbпp1;lcal
SDll.tots
T~ ·.~Shtw(f'l:.Job.D~
6*iVJtl'J ~~ .D.! x:n
4lI J~l rrt _II JV1IJW1L.
ф 2 00 1 1.0 . 1 ' ''C I(IQ ~' . DIS J CN ВТ It.OGGI20 C т и в A I" O f'Е ла S О N I' t I D
<b od y>
<d i v id=rnainContent >
</ d iv>
<a s i d e>
<na v>
<h 2> Twi tte r </ h2>
<ul > </ u l>
</ n av>
<nav>
<h2> Fl i c kr </ h2>
<u l> </ u l>
</ nav>
<nav>
<h2> We Lov e Lo c a l</ h 2>
<ul> </ u l>
</ na v>
<n a v>
<h2>Up corn i ng </ h 2>
<u l> </ u l>
</ nav>
</ a s i d e>
</ b o d y>
header
div id=rnainContent
nav
<ARTICLE>
Основная область контента главной страницы этого блога со
держит несколько записей. Для каждой из них мы используем
элемент <article>. Он определяетсятак: «Элемент <articl е>
представляетсобой самодостаточныйкомпонентстраницы,до
кументаили приложения,предназначенныйдля многократного
использованияи свободногораспространения,например, при
синдикации».
<hl>My article</hl>
<article>
<p>Blah blah</p>
</article>
Правильный вариант выглядиттак.
<article>
<hl>My article</hl>
<p>Blah blah</p>
</article>
у элемента <article> есть и другие интересныеособенности,
которые (как вы, наверняка,догадались)мы рассмотримв сле
дующей главе.
ЗАКЛЮЧЕНИЕ
в этой главе мы познакомилисьс HTML5 и его типом документа
(DOCTYPE). Мы узнали о достаточно мягких правилах синтак
сиса, позволяющих свободно использовать строчные и про
писные буквы, кавычки и минимизацию атрибутов, а также
опускать подразумеваемые элементы вроде head/body И стан
дартные определения наподобие t ур е = " t е х t / j а v а s с r i р t "
И "text/ css" В тегах <script> и <style>. С помощью эле
ментов <пе а о е г >» <Го ог.е г >» <п ау>э <aside> И <н г г ь с Ге >
мы создали структурированную веб-страницу, предоставляя
браузерам семантически более богатую структуру, чем набор
лишенных смысла универсальных элементов <d i v >, которые
Брюс Лоусон
Текст • 49
Hello Remyl
Janu&I)' 24th, 2010
Hello Митl
JaIМll)' 24th, 2010
<artic1e>
heading
<tiПIе> (just date)
~cle :text
<footer> (metadata)
<a r t ic l e>
<heade r>
<h2>Memoirs o f а Par i sian lion-tamer</h 2 >
<t i me datetime =2010 -01 -2 4> J a n u a r y 2 4 t h ,
-, 2010</t i me>
</ he a d e r>
<p> Cl a u d e Bottom's poignant autobiography
-, is this summer's must-read . </p>
<f o o t e r>
Posted in < а hrеf=n /?саt=З >Bo o ks
n
ЭЛЕМЕНТ <TIME>
J' •
Чтобы дата могла считываться автоматически, она должна быть в формате YYVY-MM-DD; время ,
которое также может быть указано , задается в формате НН:ММ с добавлением разделяющего
префикса «Т». Если вы хотите добавить секунды, отделите их от минут с помощью двоеточия.
Доли секунды добавляются после точки.
Как вы видели выше, можно указывать только время по 24-часовой шкале (без даты) .
Если вы указываете и время, и дату, необходимо указать часовой пояс : используйте «Ь для
Всемирного координированного времени (UТC) или задайте смещение относительно UTC в часах
и минутах с префиксом «+» или «-».
Итак, вот что мы получаем : «1979-1 Q-14T12:00:00.001-04:00» означает одну миллисекунду после
полудня 14 октября 1979 года по летнему восточному времени (UТC-4 часа).
'АТРИБУТ PUBDATE
<article>
<header>
<hl>Come to ту party оп <time
I datetime=2010-12-01>1
I December</time></hl>
<p>Published оп <time dаtеtimе=2010-0б-20
I pubdate>20 June 2010</time></p>
</header>
<p>I'm throwing а party at Dr Einstein's
ICabaret Roller-disco Bierkeller
IPizza-parlour-a-gogo. Do соте and dance
I to Rusty Trombone's Swingin' Brass Band.
I (Formal dress and lewd hat required.)</p>
</article>
ИСПОЛЬЭОВАНИЕНЕСКОЛЬКИХЭЛЕМЕНТОВ <FOOTER>
ВНУТРИ ОДНОГО ЭЛЕМЕНТА
В спецификацииговорится:«футерыне обязательнодолжнырас
полагатьсяв конце раздела, однако чаще всего это так»; согласно
<body>
<footer><a href="/">Back to
index ... </a></footer>
I
<h1>Lorern ipsum</h1>
<p>Lorern ipsurn</p>
<footer><a hre,f=" /">Back to
I index ... </a></footer>
</body>
Причинаэтого в следующем:предполагается,что эти элементы
не являютсяэлементамипредставления.Если футер «Back to in-
dex» расположен внизу статьи, а вы хотите, чтобы он находился
также и вверху, для этих одинаковых фрагментов контента сле
дует использовать одинаковые элементы (независимо от того,
где они расположены).
<article>
<heaaer>
heading
<time> (just date)
Article text
<footer> (rnetadata)
<article>
<heaaer>
<tim~ comrnent date anд time
Comrnent text
<article> another comrnent
<a r t ic l e>
<h e a d e r>
<h 1>Come t o т у p arty о п <t i me datetime=
, 20 10 - 12 -0 1> 1 December</time ></h1 >
56 • Глава 2
РАБОТА СО СТРУКТУРАМИHTML5
Некоторые приложениядля обработки текста позволяют про
сматриватьструктурудокумента. На рис. 2.4 покавана эта глава
в режиме структуры Мicrosoft Word2007.
В HTML5 есть строгий алroритм определения структуры до
кумента, который позволяет агентам пользователей строить
похожие структуры для веб-страниц. как и в случае с програм
мами обработки текста, это может понадобиться для того, чтобы
Текст • 57
о the.R~_.ttribut8
О Моге nmwfth headers and footers
о MultlDle footef. оп the !l8f~e el8II'I8I1t
О Bloc kguote tootef.
О HTML5 and WAI-ARIA
О ARIA ОосuтепС Stтucmre and Landma,* Ro/es
О Relatfonshlp Ьемеп ~RIA and HTML5
О BIQgposts and comments
О
О Structuring textual content
О ТЬе ourJlnlng algortthm
сате home.</p>
I
</article>
Предположим,вы работаетев крупнойинтернет-газетеи хотите
добавитьэту историю. Когда волшебнаяпрограммадля синди
кации добавит ее ~ ваш шаблон, получитсятакой код.
<hl>The Monotonous Times</hl>
<section>
<h2>Breaking news</h2>
<article>
<hl>What 1 did оп ту holiday</hl>
Текст • 59
<p> I went to Na rnia. 1 was bitten Ьу
~ а t ril obite . Th e n 1 с ат е home. </p >
</ ar t i c l e>
</ s ec t i o n>
Очевидно, что в иерархии заголовок «Breaking news» находится
выше, чем заголовок сообщения блога Реми, но из-за несо
гласованности шаблона Реми и вашего шаблона элемент <h 2>
оказывается важнее элемента <h 1 >.
Однако, если мы посмотрим на схему, мы увидим, что все на
ходится на своих местах (рис. 2.7). Отлично!
<HGROUP>
Иногда помимо заголовка используется подзаголовок или сло
ган: на сайте Slashdot - «news for nerds. News that matters», на
dev.Opera - «Follow the standards. Break the rules», на Metafilter-
«community webblog». Как следует писать разметку для таких
слоганов? В HTML4 можно было сделать это так:
<h1>Me t a fil t e r</ h l>
<p> c ommu n i t y weblog</p>
Но это не очень правильный вариант, поскольку слоган - это
в каком-то смысле тоже заголовок. Еще один способ выглядел
так:
<h g ro up >
<h l>Me t a fil t e r</ h l>
<h 2>commu n i t y weblog < /h2 >
< / h g rou p>
Структура этого кода показана на рис. 2.8.
1. Metafilter
По поводу <h g r o u p> в спецификацииговорится следующее:
Рис. 2.8. Частью «для удобства получения информациио структуре документа
структурыявnяется и других похожих сведений текст элемента <hg roup > опреде
только заголовок
ляется как текст заголовка самого высокого уровня (hl-h6) из
«Metafilter» числа потомков этого элемента hgroup».
<ar ti c le>
<hg r o up>
<h 2> Ge t the beers in! Here comes </h2 >
<h l> Re my Sharp! </hl >
</ h g rou p>
</ a r t i c l e>
ПРИМЕЧАНИЕ
</n av>
<a r t ic le>
<h 2> Fa ir ies l ov e r a inbows!</ h 2>
<p> Ac c o r d ing to Mr Sn u g g l e s t he Пuffу kitten,
fairies
..., like: </p >
<blockquote >
< hЗ> Р rе t t у dainty thiпgs< /hЗ >
<p>Fai r ies l o v e r a inb ows , ribbons,
..., a nd ball et sh oe s </p >
< h З> Wе а ро п r у</ h З>
<p >Fa i r i e s favour Kalashnikovs, Пiсk
..., knives, and
..., depleted uranium missiles</p>
</blockquote >
</ a r t i c l e>
I
Посмотрите замечательное видео под названием «Значение НТМL-заголовков для доступности»
(<<Importance o~ HTML Headings for Accessibility») на www.youtube.com/watch?v=AmUPhEVWu_E.
В нем показано, как слепой эксперт по доступности веб-контента перемещается по сайту с по
мощью JAWS. В идеальном мире любой профессиональный дизайнер или разработчик обязан
был бы посмотреть и понять это видео. Но, к сожалению, это не идеальный мир.
<ARTICLE>
<article class=transcript>
Текст • 65
</ a r t i c l e>
«БЛОЧНЫЕ» ССЫЛКИ
Внимательно посмотрев на этот пример, вы заметите, что «блочные» элементы можно заклю
чать в ссылки . В спецификации HTML 4 это не разрешено, поэтому вам пришлось бы заключать
заголовок, абзац с интригующей цитатой и фразу «read тоге» в отдельные элементы ссылки,
указывающие на один и тот же адрес.
В HTML5 одна ссылка может заключать в себе весь элемент - 3.Т!:' с \о: •
В XHTML 2 был похожий механизм, позволяющий добавлять " . ._. к любым элементам, однако он,
конечно же, не обладает обратной совместимостью; современные браузеры просто посмеются
над <л : '. , . 1 ':0;;= " ;:u.l L-:c _ ;: v. : ;:""_ "> и проигнорируют ссылку. Интересно, что «блочные
ссылки» в настоящее работают в браузерах после пары подсказок - вспомните httpl/mattwilcox.
nеt/sапdЬох/htm!5-bIосk- . 'r 1С h о г/tе st . htm l .
Ну, почти. В Firefox есть ошибка парсинга, которую Рем и называет «Vomit Bug» (,emysharp.
..:oт/2009108/~ O/defini"g-the-vom;t·bug/). Из-за нее Firefox не отображает якори, содержащие
некоторые новые НТМL5-элементы вроде . se ctJ ,Г;'> . Правда, делать целые разделы ссылка
ми - довольно странная идея. Если вы ограничиваетесь использованием HTML 4-элементов -
пара графов, заголовков, изображений и т. д. - Firefox работает нормально. Это тоже достаточно
известная ошибка, которая исчезает, если отключить парсер HTML5.
Так как браузеры уже умеют работать со ссылками вокруг блочных элементов, и мы имеем дело
с примером, в котором их как раз и нужно использовать, у нас нет причин сохранять ошибки
в структуре.
<SECТION>
Элемент ' с ;о С:-:.: L : '~Тl';- обычно начинается с заголовка, содержащего вводную информацию .
Исключением может быть раздел в котором заголовок добавляется с помощью JavaScript. Если
вы не собираетесь добавлять заголовок, или же вам просто нужен элемент-контейнер для соз
дания оформления. лучше использовать -:ji 7>.
<a r t i c l e>
<h l>Ru l e s for Munchkins </hl >
<s e c t i o n>
<h 2> Ye l l ow Brick Road</h2 >
<p> 1 t is vital that Dorothy follows it-so
~ по selling bricks as "souvenirs" </p >
</ s e c t i o n>
<s e c t i o n>
<h 2> Fa n Club uniforms </h2 >
<p> Al l Munchkins are obliged to wear
~ t h ei r "11т а friend of Dorothy!"
Текст • 67
~ t-shirt when representing the club</p>
</ s ec t i o n>
article
(Yellow Brick Road)
1....- <strong>Vitёil
. .__ __caveat</strong>
_ _
<s e c t i o n>
<h 2> Fa n Club un i form s </ h 2>
<p> Al l Munchkins are obliged to wear
~ their "1'т а friend of Dorothy!"
~ t-shirt when representing the club< /p >
<p>< s t ro ng>V i t al caveat about t he
~ inf ormati o n abo v e: does no t apply оп
~ the fir st Thu r sda y o f the mont h
~ </ s t r o n g></ p>
</ s e c t ion>
</ a r t i c l e>
cu:ticle
section (Yellow Brick Road)
<strong>Vita1 caveat</вtrong>
<section>
<hl>Articles about llamas</hl>
<article>
<h2>The daily llama: buddhism and South American
--, camelids </h2>
<p>blah blah</p>
</article>
<article>
<h2>Shh! Оо not alarm а llama</h2>
<p>blah blah</p>
</article>
</section>
<section>
<hl>Articles about root vegetables</hl>
<article>
<h2>Carrots: the orange miracle</h2>
<p>blah blah</p>
</article>
<article>
Текст • 69
</section>
Почему мы не используем вместо двух элементов < s е с t i оп>
элементы <а r t i с 1 е >? Потому что в этом примере каждый
элемент <section> - это набор независимых единиц, каждая
из которых может быть добавлена на другую страницу, - но
вы вряд ли станете добавлять на другую страницу весь этот
набор.
АНАЛИ3 WWW.GUARDIAN.CO.UK
Давайте продолжим тему газет и посмотрим на настоящий сайт.
Попробуем определить, где следует использовать новые струк
туры. На рис.2.12 покаван скриншот страницы моей любимой
газетыThe Guardian на www.guardian.co.uk. Давайте посмотрим,
как можно создать такую страницу с помощью HTML5.
guardian.co.uk
!
News! Sport : Co~nt : Cultl~ : BU1~S ' MOJ1t'y , uh- &: ~'t)~ Тfo\'eJ : ЕuvirOW1')("лt ~ ТУ ': В1ор : V~ : Communit}": Job6
шс. ; \~ot'H ; Ulrited Sta~ . POJitiCg" }f~i.! ; ~tion : SotYty •Stifo~ , ТI!clшо1оgу : FootbaU'G uard1an : Obsrrver
Rre l ld hl!:"-";: LATfSf, Fmlr ccbookbildAn J«ЮIL'Il, mjtlnJd in сом), аш in SOtlth.Lm I ClW!u., Stra tbd.)~ pclioe""ю. Moro
deцik~ ...
--_.
G.Or1:OК~O,
CDЬох..'Ч'1S
R"(IptQI«._.paj)t'I.On_IUIN<,tI 15 Britain Вr<Ж t'J} ?
~ ~.I· . . ~ ~ I \ t M
ISII . tor,.mna81
, .., ~tНI
~ WIIm' of~alOn6 " ,I&I!'ftllln'lto lЮrr: 81XU1"~, "' IЮi()CtOn Ol' II.
- ,,,
,
"М('4,, !)(I rn~ too., .OI Qllr.jaroon Wltlf\O
groundong11'I IlIaIItf'
w+.ptI... ono+·· jU'JH 1i .85
-
P'J!'Iktol'llOlllalon Can\P8it;n.sand
()eIW'eM Мltt ~OUS ' 81 4 m \'flStip tio na
NI'I~ fWl\l
,--
• О\)J,m. an<f~ unа onпn- ам
• • :!II.....,
1I. (OIOut ot ot '"9l "'
!NiI?NloswflenSllll ....
O'dI'"atr O'lI i,
oi~;;t ord;;;·Sky s~rt;· pnee C\l t rrie-f.;i....
Col'J'Iff\IIItanoOl t*r
rraon.м.1fhf'J trI4
1.'''' ~!I'~ IOrI. ''tifI<М ''Il 1
1 T~b \Veekly live: P~rsonal pm'acy ,-.
-
»8<1. "1JULat!М' n; " SS~:,Smu .. т»".• 23 4'11Io оА10
1'!I'I<:JI "aI 'P!lC'I 'Cflatll l' n'''$'tЮ'I' '~ 'nd 8Т
eJ зо (.()rtII'n .nh
.......
COf!sum" f oms dllS """'. d'l1In\I1I
f"" an4 "8II&l1f 411'r6 1n IЩltr-Wmpl:lllll 1o
~22c:omm mb
F~~-rele&.~h~ag~~-it~r 12 y~~
CoIomlli.... OUIfiII~hat>O
о- )2.1'''H II4 , Qlcl tf
PaoIoEmlliouontato
aII<7Udt01I'I1!W7
guardian.со.пk
News!Sport ~ Comtneп! i сшtvre ; Bt1Sines$ ! Mo~' i Lik & Iity~ : Trave1! EnWOfUheot : 1"\' ; 8Юss ~ V~ ~ Community ~ Job&
lI1It uк : World : Uoited States ' Роёш : 1ofedi.a ; Educatvщ : ~ty : вееасе ; T~.hno\o&.v FootbaJI : Guaгdi.5n ' Ошn-еr
Рис. 2.13. Название бренда на главной странице сайта
газеты lПе Guardian
</ul>
</ n a v>
<a s i d e >
<na v >
<h2 >g ua r d i a n j ob s< / h2>
<f o r m role=search > </ f o r m>
<u l>
<l i>< a href=t >Upload your
CV</a></li >
</ u l>
</ na v >
<na v>
.... <h2> On l i ne Dat ing</h2>
</ na v>
<s e c t i o n>
<h2> Spo ns o r e d Features </h2 >
On lbilate
</ s e c ti o n>
</ a s i d e >
Обратите внимание на то, что я добавил в <n a v> форму
поиска; я считаю, что формы поиска не менее важны, чем
собственно навигация. АRIA-атрибуту role я присвоил
<na v>
<h 2>g uard i a n j ob s< / h2>
<f orm role=search > </ f o r m>
<u l>
<l i><a href=t >Upload your CV</a></li >
</ u l>
</ na v>
А теперь посмотрим на основную область контента (рис. 2.16).
; JOinМamGabban аэ
• =::::::a=~
out..г,ООО homes and
dls rщ:Jl:IrЗlteI
~ 4comments
. 1rI
• SnowOJtз POWefandlJ ans pOft
pidufe s: SPnnQ ,now
in SCoIIand
__ _ _.. _ _.. _.. __ Tre nding
Networ k Rяil begi ns strike \ega\ fight
RaiI operafor 51 ,.,., papers ОП unlOnIМ tnslзts ОЬзmз зno Sarl!:QXy
talks' Эl е comJnuing betwe en l'I e two
·con з lrudмt
! EiiCtion'2010 19 the fory тaпra 3fI
вмее
с !ЗА warns Ofcancellatlons аз stan'tetum toWOfj( aocurat& desQiption of life
U 0 5 COW bomblnos today, of gUbjaroon WJth no
gfounltng tn r.al ~
C<>ngress pressed оеег Israel оtanсе ,.le pn edr"0fl8
r-::.. AmeU GнU6mll n
inveatlgales
<s e c t i o n >
<h 2 >Best o f q ua rd ian . c a. u k</h 2 >
<a r ticl e>
<h 3 >Is Br itain Ьrоkе п?</hЗ>
</ a r t i c l e >
<a r t i c l e >
<h3 >No t es апо q~e r i e s < / h3 >
</ a r t i c l e >
<a r t i c l e>
<h 3> Te c h We e kl y li v e: Ре уз оп аl p l i v ~ cy < /h 3>
</art i c le>
</ se c t i on >
<s ec ti on>
<h2 >La test mul ti medi a< ! h 2 >
</ se ct i on >
На сайте (но не на скриншоте) есть еще несколько блоков <nav>
(<<Trending», «Campaign andInvestigations») и «большой футер».
Последний, как обсуждалось в главе 1, оформляется с помощью
Текст • 75
ПРИМЕЧАНИЕ
• application;
• article;
Текст • 77
• Ьаппег:
• complementary;
• сошегшпб»
• document;
• form;
• headingj
• main;
• navigation;
• search. Бanner
РЕСУРСЫ ARIA
В спецификациях HTML5 и АЮА есть полезная перекрест
ная ссылка dеv.wЗ.огg/htmI5 /sрес/еmЬеddеd-сопtепt-0.html#аппо
tationsfor-assistive-technology-products-aria. Стив Фолкнер из 1he
Paciello Group создал список АRIA-информации, которая не
встроена в HTML5 (www.paciellogroup.comlblog/?p=585).
В 2007 году меня очень беспокоил тот факт, что производители программ экранного доступа
не принимают участия в создании спецификации HTML5, и я написал в WЗС письмо с просьбой
пригласить этих производителей подключиться к работе. В 2009 я спросил разработчика HTML
Яна Хиксона, отреагировал ли кто-нибудь на это предложение. Он ответил : «Несколько произ
водителей отреагировали. Но они, к сожалению, сказали, что у них нет на это времени. Правда,
после этого компания Apple стала активно заниматься встроенным в Мас OS Х программным
обеспечением для экранного доступа, и сейчас Apple активно поддерживаетс нами связь. Так
что, по крайней мере, один производительвовлечен в этот процесс».
Недавнее исследование( 1:"~'N;.сссЕ3;ibI е с " itUt е . orG jге s е а r с Г, ,'htmt')-а' э , ) показывает, что две
самых популярных на рынке программы экранного доступа не могут правильно обрабатывать
контент, для разметки которого используются одновременно HTML5 и ARIA, или элементы
внутри... ~ ~ ,~ - . Однако не все такие программы работают неправильно; VoiceOver компании
Apple не пропускает контент, а свободная программа экранного доступа NVDA (
lJюjеt о а ) читает весь контент и позволяет перемещаться по структурным элементам страницы.
Мое личное мнение звучит так: если вы следуете правилам спецификации, неспособность брау
зера или программы экранного доступа адекватно воспринимать контент - не ваша проблема.
Но это только мое личное мнение . Вы можете считать иначе; кроме того, в определенных ситуаци
ях вам может потребоваться упростить контент, чтобы разметка соответствовала возможностям
этих программ. Конечно, к тому времени, как вы прочитаете эту книгу, часть проблем уже может
быть решена. А пока вы сами должны знать своих пользователей и требования в вашей области .
<ASIDE>
В главе 1 мы использовали <а s i de > для добавления боковой
панели. Этот элемент используется для «раздела страницы, ко
торый косвенно связан с окружающим контентом, но который
должен располагаться отдельно. В типографике такие разделы
обычно оформляются в виде врезок. Этот элемент может ис
пользоваться для создания типографских эффектов (например,
врезок и боковых панелей), для рекламы, для групп элементов
<nа v> И для другого контента, который должен располагаться
отдельно от основного».
<DETAILS>
Мне очень нравится элемент <пе г а л Гэ > несмотря на то что
он пока еще нигде не реализован. Реми написал гениальный
скрипт, позволяющий создавать имитации таких элементов
( httр://gist.githuЬ.соm/З7059~.
Используя его, мы получаем встроенную поддержку элемента
с распространенным типом поведения и освобождаем себя от
необходимости самим создавать JavaScript-код (или же нечто,
80 • Глава 2
<details ореп>
<FIGURE>
я всегда испытывал ощущение какой-то семантической неак
куратности, добавляя к рисунку название для того, чтобы дать
пояснение или указать автора, потому что раньше сделать это
•• . : • J
•
в HTML 4 элементы подразделялись на «блочные» и «сгроковые», Эти термины не используются
в HTML5, поскольку, по сути, относятся к представлению: они просто указывают на способ ото
бражения элементов в браузере - на основе таблиц стилей, использующихся по умолчанию.
В самих НТМL-элементах нет ничего, что позволяло бы считать их блочными или строковыми.
По умолчанию в (55 каждый элемент обладает свойством з : ." ,. :"':' V • л 1 е , если только это
правило не перекрывается встроенной таблицей стилей браузера или великолепным оформ
лением, которое необычайно талантливый дизайнер (то есть вы) применил к разметке. (Не
смущайтесь, вы знаете, что это так; все об этом говорят.)
<'k6Г~"'il >, < 16:";;0:">, <'''''','..,' (если атрибут , YI> · не находится в состоянии tL Jlrar ),
(при наличии атрибута ,; ' ''' ~ ii F ) , < 3';::" ес':;, <, с ч х t ,.; ":<; <, ,'". ,ieo> (при наличии атрибута
,-с·,.' : ·;· l ;: )), метаданные и др.
Не волнуйтесь! Здесь все очень логично: если отбросить тот факт, что элемент », г. > теперь ведет
себя как « ь п э> И <"::18 1 > И может быть «строковым» или «блочным», вы не заметите никакой разни
цы, если будете использовать HTML5 5hiv (http://code,~le.com!p!h: '1 ," ; -;!,',/ ), чтобы определить
новые НТМL5-элементы , пока браузеры еще не сделали этого во встроенных таблицах стилей .
82 • Глава 2
<MARK>
Элемент <mark> позволяет выполнять действие, аналогичное
использованиюмаркера, когда мы отмечаем определенныеслова
"~A.
8* 8*(1:111..)
supportlng non-supportlng
browser browser
Рис . 2.20.8 браузерах,поддерживающих ruby,
текст-транскрипцияотображаетсянад основнымтекстом.
8 браузерах, не поддерживающих ruby, текст-транскрипция
отображаетсяв скобках и следует после основноготекста
84 • Глава 2
ПЕРЕОПРЕДЕЛЕННЫЕ ЭЛЕМЕНТЫ
В HTML5 не только добавлены новые элементы, но и переопре
делены некоторые уже существующие. И вот перед нами наши
старые друзья: кто-то полностью изменился, а кто-то просто
<OL>
В HTML4 использование атрибута s t а r t для элемента < о 1 >
было нежелательным, поскольку он считался атрибутом пред
ставления. К счастью, HTML5 отменил это неверное решение.
Если вы хотите начать нумерацию списка не с одного, а с пяти,
используйте такой код:
<01 start=5>
<DL>
В HTML 4 <dl> обозначал список определений, состоящий из
слова и нескольких его определений. Такое описание было за
путанным и непонятным, поскольку в нем также говорилось
<dd>Phillipe Philloppe</dd>
<dt>J-Lо's plastic surgery: а profile</dt>
<dd>Hugh Jarce</dd>
<dt>The Orpheus and Eurydice myth</dt>
<dd>Helen Bach</dd>
<dt>The Proctologist and the Dentist</dt>
<dd>Ben Dover</dd>
<dd>Phil McCavity</dd>
</dl>
<CITE>
в HTML 4 элемент <с i t е > можно было использовать для обо
значения имени говорящего:
<ADDRESS>
Элемент < а dd r е s s> используется для указания контактной
информации автора текущей статьи или документа, а не как
универсальныйэлемент для почтовыхадресов. В качестве кон
тактной информацииможет быть указан адрес электронной
почты, почтовый адрес и т. д. Для разметкимогут быть исполь
зованы микроформаты,RDFa или microdata.
Новым в отношении этого элемента является то, что теперь на
странице может быть несколько элементов <address> - по
одному в каждом <а rt i с 1 е >. Информация об авторе, привязан
ная к определенному <article>, не относитсяк вложеннымэле
ментам <article>. Так что сообщениеблога внутри <article>
может содержатьэлемент < а ddr е s s> для его автора, а каждый
комментарий (который, как вы помните, является вложенным
<article» может содержать <address> того, кто его оставил.
<ЕМ>, <1>
<STRONG>, <В>
Например:
<p>Remy never forgot п л з iifth birthday-feasting
I оп <b>powdered toast</b> and the joy of opening
-, his gift:
I а <b>Log from Blammo!</b>.</p>
<HR>
Элемент < h r > теперь не зависит от среды и обозначает «те
матический разрыв на уровне параграфа». На HTML5doctor
есть очень тонкий комментарий. Это эквивалент обозначения
«***», которое часто используется в рассказах и эссе. Мы хо
тели отменить его как историческую редкость, когда доктор
<SMALL>
Элемент < s та 11> был полностью переопределен.Из простого
универсальногоэлемента представления,делающеготекст мел
УДАЛЕННblЕЭЛЕМЕНТbI
ГЛОБ~ЛЬНЫЕАТРИБУТЫ
В HTML5 добавлено также несколько глобальных атрибутов,
которые могут быть применены к любому элементу. О них мы
поговорим в этой главе.
CONTENTEDITABLE
Разработанный Microsoft, contentedi table был затем переос
мыслен и реализовандругими браузерамии теперь официально
является частью HTML.
CONTEXTMENU
Атрибут contextmenu относитсяК элементам <menu> И <соm
mа n d>,которые не обсуждаются в этой книге (см. раздел
«Свойства,не рассматриваемыев этой книге»),
DATA-*
Чтобы передавать информацию скриптам из разметки, мож
но использовать атрибут d а t а - «; Передавать можно любое
ХМL-совместимоеимя. Более подробнооб этом рассказывается
в главе 4.
DRAGGABLE
Атрибут draggable указываетна то, что элемент можно пере
таскиватьс помощью drag-and-drop API (см. главу 8).
HIDDEN
Этот атрибут аналогичен aria-hidden: он сообщает браузеру
о том, что контент этого элемента ни в ком случае не должен
доступа».
SPELLCHECK
Этот булев атрибут заставляет браузер проверять правописание
и грамматику элемента. Если его нет, «выбирается состояние,
соответствующее поведению элемента по умолчанию - воз
TABINDEX (=-1)
в основе атрибута t а Ь .л; n d е х лежит достаточно старый
принцип, позволяющий задавать порядок приоритетов при
Текст • 91
вательной навигации».
СВОЙСТВА, НЕ РАССМАТРИВАЕМЫЕ
В ЭТОЙ КНИГЕ
Для полноты картины я расскажу о нескольких самых интерес
ных свойствах HTML5, которые по причинам ограниченного
объема или недостаточной реализации больше не будут обсуж
даться в этой книге.
92 • Глава 2
<EMBED>
Элемент <embed> широко известен и используетсяуже многие
годы, но он всегда был «вне закона», потому что никогда не
проходил валидацию. Однако так же, как и другой разбойник,
Робин Гуд, он имел очень сильную поддержку,так как выполнял
полезную функцию: это единственныйспособ добиться ста
бильной работы плагинов (например, Flash) во всех брауверах,
что и объясняет его невероятно широкое распространение
(см. статистику за 2008 год на http://dev.opera.com/articles/view/
mama-plug-ins/). Поэтому нет никаких причин откладывать его
валидацию. HTML5 решил облагородить эту «коровью тропу»
И наконец включил <embed> В официальнуюспецификацию
языка.
<KEYGEN>
Этот элемент, который уже обладает хорошей браузерной
поддержкой (за исключением того самого большого слона
IE), используется в тех ситуациях, когда форма должна ото
слать открытый ключ. Если вы не знаете, что такое шифрова
ние с открытым ключом, посмотрите http://en.wikipedia.org/wiki/
PubIic_key.
Если вы все еще ничего не понимаете, вам не стоит использовать
этот элемент.
<PROGRESS>, <METER>
Элемент <progress> используетсядля отображения«индика
тора выполнения»,который показываетстепень завершенности
процесса - например, загрузки.
<MENU>, <COMMAND>
Это потрясающиеэлементы: они позволяютсоздаватьдля кон
текстных меню вашего приложения панели инструментов со
MICRODATA
microdata - это способ разметки элементов с помощью допол
нительных считываемых данных для того, чтобы поисковые
роботы, поисковые движки и браузеры могли извлекать инфор
мацию из содержимого страницы. Он похож на RDFa (стандарт
W3C), и уже индексируется поисковым движком Google. Однако
ни один браузер не поддерживает соответствующий API.
<STYLE SCOPED>
Атрибут всорео- примененный к элементу <вт у Ге>. заставляет
браузер применить стили к элементу, внутри которого располо-
жен <style э сорео>. и его детям. Это позволяетлокализовать
стилевоеоформлениевнутри НТМL-документа.Так, например,
элемент <а г гл.с Ге >. содержащий блок <style э сорес>. со
хранит свое оформлениепри синдикации.
3АКЛЮЧЕНИЕ
Ух, интересная поездка, не так ли? Вы увидели много новых
структур, новых элементов и узнали об измененияхв старых
элементах. Если вы внимательно изучали наши примеры раз
метки, вы также познакомилисьс любимым оружием фей, так
что если вы гоблин или орк, будьте осторожны.
чайтесь в работу!
i
I
Глава 3
ФОРМЫ
Брюс Лоусон
Формы • "
Одна из проблем с формами в HTML 4 состоит в том, что поля
формы - это всего лишь пустые ячейки для заполнения, не
более того, На сервере, конечно же, требуется валидация дан
ных, но для создания осмысленного интерфейса приходится
дублировать эту проверку в браузере с помощью JavaScript.
Учитывая, что формы используются практически на каждой
веб-странице - формы поиска, регистрации, добавления ком
ментария и т. д., - было бы здорово, если бы в браузеры была
включена валидация тех типов данных, которые чаще всего
вводятся пользователем.
</forrn>
<textarea forrn=foo></textarea>
Элемент < i при t > принадлежит форме f 00, посколькуон нахо
дится внутри нее и не содержит атрибута, переопределяющего
его принадлежность.Элемент <textarea> расположенснаружи
f 00, но все равно относитсяк ней, потомучто его атрибут f о rrn
указывает на id этой формы.
ПРИМЕЧАНИЕ
-- ~- .
( Bruce Lawson а
F1I\'emcgahuok Вшсе lawson ·1
RemySharp ,;1
George Clooney
BradPi1I
./ BruC8 Law~n
R.мny Sharp
I
Озtе of BiI1h ~ ,
-
вг
О 1
February
IIIМ
•, ! ! 1z 11
~ ~
Tw wed Thd
~
~
~
~
11
~ ~ ~
1!
1
~
~
[~:Jl~~оЛ~
'6
~
.......
z
• ~ ~ ~ ~ ~ n l!
• • • ,. • • • ,.
I 2 э 7
Todav 11 I
week
-- - ~ - ,, _ . , . _ ' .
201G-WОб . '
EJi February Ш !2010!:
w.. won T~ wed ТhII Ff'i ~I Sun.
~ 1 ~ ~ :! ~ ~ !
~ ! ! 12 1!g.!! H
r ~~.!!.!!.!! ~~
! ~~ ~~~~~
! 1 ,: з, 4 б е 7
Ш s 9 10 ~ 1 12 13 14
Do... ~
..
цвета, выбрав нужный вариант в палитре. Пока это реализовано '"
4 5 6
только в BlackВerry (рис . 3.9). ,"
7 8 9
11I о
АТРИБУТ LIST
JavaScript.
АТРИБУТ AUTOFOCUS
Булев атриБУТа u t О f О С \l S - способ задания установки фокуса
на определенном элементе управления формы во время за
грузки страницы . Раньше разработчику требовалось писать
для этого JаvаSсгiрt-код, используЯсоntr оl. f ocus () . Новый
способ позволяет делать достаточно разумные вещи, например
не устанавливать фокус на элементе, если пользователь в это
время вводит данные в другом месте (проблема, типичная для
старых JаvаSсгiрt-скриптов, реализующих эту возможность).
На странице должно быть только одно такое поле ввода.
Помните об удобстве использования и применяйте этот атри
бут с осторожностью. Мы рекомендуем добавлять его только
там, где поле формы служит для выполнения основной функции
страницы - как, например, форма поиска.
АТРИБУТРLАСЕНОLDЕR
другое. Это то, что я мои коллеги называем «заполнением», при котором во время создания
кода мы опираемся на встроенные возможности, а затем заполняем «дыры» В поддержке, ис
АТРИБУТ REQUIRED
Новый атрибут rеquirеdможно использовать для <textarea>
И большинстваполей ввода (кроме случаев, когда атрибут type
принимаетзначения hiddeI1 imаgеили задает кнопочный тип,
такой как submi t). Браузер не разрешит пользователю отпра
вить форму, если обязательные поля будут пустыми. Также мы
рекомендуем добавлять к таким полям АRIA-атрибут aria-
requireq которыйбудет полезен для вспомогательныхтехно
логий (ARIA подробно обсуждалась в главе 2).
АТРИБУТ MULTIPL:E
1Ип <input tуре=filе>иеявляетсяновым в HTML5, но теперь
благодаря атрибуту ти 1 t i р 1 е пользователь может заrpужать
несколько файлов.
<input type=file multiple>
Этот атрибутможно добавлятьи к другим типам ввода данных:
например, <input type=email multiрlе>позволяетвводить
несколько адресов электронной почты. На сегодняшнийдень
зто реализованотолько в браузерах WebKit.
~ТРИБУТ PATJERN
Некоторые типы ввода данных, о которых говорилось вы
ше, - email, number, url и т. д. - на самом деле являются
«встроенными» регулярными выражениями, так как браузер
просто проверяет, что введенные данные выглядят так, как
должны.
ПРИМЕЧАНИЕ '
АТРИБУТ AUTOCOMPLETE
АТРИБУТ STEP
Атрибут s tеротвечает за степень подробности вводимых дан
ных. Если вы хотите, чтобы пользователь ввел число в процентах
(между О и 100) с точностью до 5, можно использовать такой код.
<input type=number mix=O mах=100 step=5>
Тогда счетчик будет увеличиватьсяс шагом 5.
В примере с элементом управления для ввода времени вы може
те использовать step=any. Это позволит пользователю выбрать
любое время с любой точностью (например, с точностью до
тысячных долей секунды или более); но обычно такие элемен
ты управления требуют ввода времени с точностью до одной
минуты.
~ЛЕМЕНТ <OUTPUT>
<input id=tap
name=tap
type=range
min=l
mах=10
value=O
role=slider
aria-valuemin=l
aria-valuemax=ll
aria-vаluеnоw=О>
ОБРАТНАЯ СОВМЕСТИМОСТЬ
С УСТАРЕВШИМИ БРАУ3ЕРАМИ
• • ••
Стоит отметить, что современные браузеры WebКit для ПК, а именно Safari и Chrome, судя по
результатам проверки возможностей, поддерживаюттипы : г. ,;. ::.. ..., ~ :.i., , · С .'. И ', ·П.Г. - l: . На самом
деле, в «живых» версиях этой поддержки еще нет, а причиной путаницы является тот факт, что
Moblle Safari (тоже на движке WebКit) поддерживает эти типы ввода данных, чтобы настраивать
клавиатуру в зависимости от типа (такая клавиатура показана на рис. 3.8). То есть сам браузер
добавляет специфическую для устройства поддержку, обычно в виде клавиатуры (особенно на
iPhone), зависящей от типа ввода данных.
ПЕРЕОПРЕДЕЛЕНИЕУМОЛЧАНИЙ
БРАУ3ЕРА
~
Тyp.cal val idвtton
~
~-= r-
-------- - - - -
J <.bn
_
_-
Plrate speak val ldaUon
G.......... ....
... .....
.,...~.~On
. . . . . . . . . 8O:hU
_.....1( '"- )~
I
в Opera
ИСПОЛЬ30ВАНИЕJAVASCRIPT
ДЛЯ DIУ-ВАЛИДАЦИИ
КАКИНИЦИИРОВАТЬВАЛИДАЦИЮ
этот метод.
116 • Глава 3
ВАnИДНОСТЬ~nЕМЕНТОВ
.4 П Р И М Е Ч А Н И Е .
Следует обратить внимание на то, что у элементов :.Ц? l ... ~ ":,':-- тоже есть атрибут ","" ' ::. .:: , " , но
он, к сожалению, ничего не делает: атрибут ',''-'- - : .::' всегда имеет значение ё r'Jc:' . Для элемента
<tieldset~· вы также можете вызвать метод c," r c kV ~ .:. ::. .:' : '.:1', но в современных браузерах,
поддеj:?живающих добавление собственной валидации, снова ничего не произойдет.
КАК И36ЕЖАТЬВАЛИДАЦИИ
Последний вопрос, на который мы должны ответить: Что если
вы хотите отправить форму, но не хотите,.чтобы браузер про
водил ее валидацию? Такое тоже возможно. Но зачем вам это
может понадобиться? Что если у вас есть многоуровневая форма
для регистрации или отправки каких-либо данных? В длинных
формах удобно выделять уровни (так, например, делает еВау,
Формы • 117
<form>
<fieldset>
<legend>Some bits about you</legend>
<div>
<label for="email">Email:</label>
<input id="email" name="email"
--, type="email" required />
</div>
<div>
<label for="url">Homepage:</label>
<input id="url" type="url" name="url"
--, />
</div>
<input type="submit" value="save session"
--, formnovalidate />
</fieldset>
С помощью свойства HTMLFieldSetElement. elements мож
но сделать так, чтобы при нажатии кнопки «save веввюп» вы
полнялась JavaScript-валидация только полей, расположенных
118 • Глава 3
СОБЫТИЕ«ВСЯКИЙ РА3,
КОГДА ЧТО-ТО МЕНЯЕТСЯ»
Одно практическинезаметноеизменение,касающеесяэлемента
<form>, - добавление нового события oninputchange. На
самом деле, это очень полезное событие: оно запускается для
элемента формы всякий раз при изменении какого-либо поля.
Благодаря этому вам не придется добавлять множество обра
ботчиков onchange к каждому элементууправления формой.
Например,если бы мне нужно было создать поле выбора цвета
одновременнов модели RGBA и HSLA, мне бы, скорее всего,
пришлось добавить приемника событий к каждому ползунку.
Но с помощью события oninputchange я могу добавить один
обработчик событий к форме и пересчитать значения RGBA
и HSLA одним методом.
}
h sla . v alue = ' h s l a (' +
..., v a l ue s . r e verse () . j oi n (', ' } + ' ) '
preview . style .backgroundC ol or = h sla . value;
rgba . val ue = getC omputedStyle(preview, null)
..., backgroundCol or;
};
. ~ - ', ~ -,..- .-
'. ~' .
i Нue • 3600 i
J J
j Saturвtion • % j
I ! !.IJmlnancв ~ !
I! • 70 i
II !: ~ешпnel • 0-1 '!
!i НSLA: hsla(16. 87%. 39% , 0.8) i
!! i
I ~ . . . :_~~~_~_~~~~:_~:_~~:~:~} ...!
ЗАКЛЮЧЕНИЕ
я надеюсь, вы поняли, что формы HTML5 позволяют разра
ботчикам существенно увеличить производительность, а поль
зователям - последовательно взаимодействовать с системой.
Эти формы предлагают вам огромное множество встроенных
возможностей, для которых раньше потребовался бы дополни
тельный код (например, валидация форм и создание ползунков).
Реализация этих возможностей варьируется , она растет в Орега
и браузерах WebКit (Safari, Chrome), а в Firefox находится на
начальной стадии . Отсутствие реализации в IE9 можно ком
пенсировать с помощью JavaScript, поскольку новые свойства
устроены по принципу «изящного ухудшения» .
БрюсЛоусон
И Реми Шарп
Видео и аудио • 123
РОДНАЯ МУЛЬТИМЕДИА:
ПОЧЕМУ, ЧТО И КАК?
верить.
АВТОВОСПРОИ3ВЕДЕНИЕ (AUTOPLAY)
Вы можете указать браузеру на то, что он должен запускать
видео или аудио автоматически, но этого делать не следует, так
ИЗОБРАЖЕНИЕ (POSTER)
Атрибут р о s t е r указывает на то, какое изображение будет
использовать браузер, пока загружается видео или пока вы не
нажали на кнопку воспроизведения (данный элемент не при
меняется для <audio». Это избавляет нас от необходимости
пользоватьсядополнительнымиухищрениями,такими как ото
повтор (LOOP)
Атрибут loop также является логическим выражением. Как
вы, наверное, догадались, он определяет бесконечный повтор
воспроизведения.
ПРЕДВАРИТЕЛЬНАЯЗАГРУЗКА (PRELOAD)
З .рrеlоаd=mеtаdаtа
ИСТОЧНИК (SRC)
Этот атрибут, так же как и < i mg>, указывает на то, что файл
должен быть отображен. Однако так как некоторые браузеры не
могут воспроизводить определенные форматы, следует указать
несколько исходных файлов. Мы поговорим об этом в следую
щем разделе. При работе с одним исходным файлом атрибут src
обычно используетсятолько для быстрого макетированияили
для сайтов интранет, когда вы знаете, какой браузер у пользо
вателя и какие он поддерживаеткодеки.
КОДЕКИ:УЖАС-УЖАС
Ранние версии техническиххарактеристикHTML5 предполага
ли, что во всех браузерах должна быть обеспечена встроенная
поддержка мультимедиа двух типов кодеков . Ogg Vorbis для
аудио и Ogg1heora для видео. Vorbis - это кодек, используемый
сервисами типа SpotifY. Например, в играх Мicrоsоft Halo он
часто используется с 1heora для видео и объединяется в кон
теЙНерОgg.
МНОЖЕСТВЕННЫЕ 3ЛЕМЕНТЫ
<SOURCE>
Чтобы это сделать, нужно закодировать мультимедиа дважды:
один раз как lheora и один раз как И.264 для видео, а также
Vorbis и МР3 для аудио.
А затем необходимо привязать две разные версии файла к эле
менту медиа. Вместо того чтобы использовать отдельный
атрибут src, вы представляетеотдельныеэлементы <source>
В форме вложенийдля каждой части кода с соответствующими
атрибутами tуревнутриэлемента <аudiо>иЛИ <vidео>Ипо
зволяете браузеруподrpузитьтот формат, в котором он может
отображатьданные.
Заметьте, в этом случае мы не используематрибут s rc В самом
элементе медиа:
1 <video controls>
2 <source src=leverage-a-synergy.ogv
-1 type='vide%gg; codecs="theora,
..., vorbis'''>
3 <source src=leverage-a-synergy.mp4
..., type='video/mp4; codecs="avcl.42EOlE,
..., mр4а.40.2"'>
4 <p>Your browser doesn't support video.
5 Please download the video in <а href=leverage-a-
..., synergy.ogv>Ogg</a> or <а href=leverage-a-
..., synergy.mp4>mp4</a> format.</p>
6 </video>
132 • Глава 4
ПРИМЕЧАНИЕ
фика.
Внутри элемента <v i d eo> есть сообщениео некорректномсра
батывании,в котором содержатся ссылки на оба Формата (для
браузеров,которыене могут реализоватьни один из них). Таким
образом, пользовательсможетзагрузитьфайл и посмотретьего
в медиаплеере.
• J
• J. • J •
в идеале, следует исходить из самого формата источника, а не сжимать уже и без того сжатую
версию. Двойное сжатие может серьезно снизить качество продукта на выходе. Что касается
аудио, в открытом ПО для редактирования аудиофайлов Audacity (Htp//audacity.sourceforge.
пеt/) есть встроенная поддержка экспорта Ogg Vorbis. Для преобразования видео также есть
пара отличных способов . Для WebM на данный момент существует лишь несколько кодировщи
ков, что не удивительно, учитывая возраст данного кодека . Загляните на ·.V··i'! 'f i ~Щ+'П1рюjf'сtогg!
tools/, чтобы ознакомиться с постоянно пополняемым списком инструментов для этой задачи.
Кроме того, программа Firefogg, доступная через Firefox и расположенная на сайте h~,p:.'!firE:fcgg.
org. предоставляет простой способ конвертации онпайн . TinyOgg (I,нр'! /ti'lyog9x ОП!/) конвер
тирует Flаsh-видео вOgg для загрузки. В нее можно даже ввести URLYouTube.
Процесс конвертации может также быть автоматизирован и при вязан к серверу. Например,
в среде CMS у вас нет возможности проконтролировать формат, в котором авторы подгружают
свои файлы, так что сжатие файлов на сервере представляется весьма осмысленным. Также на
сервер можно инааллировать открытую библиотеку ffi mpeg (h"p.!iff Тopeg.crg/)для того, чтобы
проводить массовое преобразованиезагружаемыхфайлов (может, организуете собственную
альтернативуУоuТuЬе?)
. Если для вас принципиальноважным вопросомявляется объем памяти
и вы готовы делиться своими файлами (аудио и видио) в соответствии с одной из различных
СС-лицензий, ознакомьтесьсо средством Internet Archive (1iN ""i.dfU' !\-t:; org/create/ ), которое
конвертирует и сохранит их за вас. Просто создайте пароль и приступайте к загрузке, а затем
поставьте ссылку на источник и используйте элемент · ..-,-c : ~ · , · , на своей странице.
ВИДЕОФАЙЛЫ И КАРМАННЫЕ
УСТРОЙСТВА
Обычно видеофайлы довольно объемны. А загрузка файла
в высоком разрешении на карманные устройства с маленьким
экраном едва ли оправдана. Нет никакого смысла в том, чтобы
отсылать видео в формате HD, предназначенном для больших
экранов, на экран смартфона или кпк. Сжатие видео до раз
мера, подходящего для маленького экрана, может сэкономить
ПОЛЬ30ВАТЕЛЬСКИЕ3ЛЕМЕНТЫ
УПРАВЛЕНИЯ
Как вы уже поняли из начала этой главы, Анне ван Кестерен при
обсуждении нового АР! говорит о том, что у нас появились про
стые методы, такие как play (), pause() (метода stop нет, но
можно использоватьпаузу и вернутьсяк началуфайла), load ()
и canPlayType (). На самом деле, этими методами список ис
черпывается.Все остальноеотноситсяк событиями атрибутам.
В табл. 4.1 вы найдете список атрибутов и событий медиа.
136 • Глава 4
ПРИМЕЧАНИЕ
Мы используем ~ :_ - ~" '_' :C ':: :: -;•.- :c.::. o:: ~" а не - ;, :'. ,, - - -i ::~ h!-' для работы с устройствами , у которых
есть окно просмотра содержимого, то есть любыми полнофункциональными браузерами
смартфонов, потому что таким образом мы можем получить информацию о ширине отображе
ния окна просмотра .
Состояние ошибки
error canPlayType(type)
Состояниесети
src pause ()
addTr:ack (lai.'c:.
networkState
preload События
buffered loads.tart
Состояние готовности
readyState suspend
:;"'_.!( 1..• g
Элементы управления error
.:...,- ·.rols "":,J: iea
volume stalled
rr L. j
Треки pause
г га ск е J o3.ded;neta ';:",,,
Состояние воспроизведения loadeddata
curr~' .T· ..~ waitir,,"J
startTime playing
durdt.LVП
paused canplaythrough
defaultPlayhackRat~
playbackRate seeked
played
seekable ended
9r:ded га ::есп",:-.;'"
autoplay
Специфичныедля видео
wld h
height
videoHeight
() t
Видео и аудио 117
<video controls>
<source src="leverage-a-synergy.ogv"
~ type="vide%gg" />
<s o u r c e src="leverage-a-synergy. mр4"
~ type=" video /mp4" / >
Your br owser doesn't s upport video .
138 • Глава 4
ВОСПРОИ3ВЕДЕНИЕ,ПАУ3А -
и ВСЕ ЭТО НА ОДНОЙ КНОПКЕ
Теперь мы хотим, чтобы у нас была возможность воспроизво
дить и ставить на паузу видео при помощи элементов управле
if (video.paused II video.ended)
if (video.ended) {
video.currentTirne О;
}
this.innerHTML = / / &#х2590;&#х2590;
I doesn't need escaping here
this.title = 'pause'
video.play();
else {
this.innerHTML // &#х25ВА;
this.title = 'play'
video.pause();
БОГАТЫЕСОБЫТИЯМИ
ЭЛЕМЕНТЫ МЕДИА
. ..
~
в этих примерах мы используем ДРI модел и ООМ второго уровня <: :1 ~E ·'- "'r ; l-_ L l s t e ~ '~ ~, а не
, та к как последни й используется исключительно в Internet Explorer до восьмой
версии. Сейчас на подходе уже IЕ9, который будет поддерживать видео, кроме того, он будет
поддерживать еще и стандартный ;, ,_ k; ;::: 'J P:' ~_!Ji :з : -_е ! ~,,", r, так что и в этом браузере наш код будет
работать.
ОТСЛЕЖИВАЕМХОД 3АГРУ3КИ
video.addEventListener('durationchange' ,
updateSeekable,
-, false);
video.addEventListener('progress' ,
-, updateSeekable, false);
function updateSeekable() {
buffer.style.width = (100 / (this.duration II
-, 1) *
(this.seekable && this.seekable.length
-, this.seekable. end() О)) + '%'
КОГДА МЕДИАФАЙЛготов
К ВОСПРОИ3ВЕДЕНИЮ
video.addEventListener('canplay' ,
-, initialiseControls, false);
В нем нет ничего сверхъестественного.Инициализацияэлемен
тов управления активирует переключатель«воспроизведениеl
пауза», а на полосе прокрутки сбрасываетуказатель текущего
кадра.
ПРИМЕЧАНИЕ
и бегунок.
ПЕРЕМОТКАВПЕРЕД, ЗАМЕДЛЕННОЕ
И ОБРАТНОЕ ВОСПРОИЗВЕДЕНИЕ
в техническиххарактеристикахприсутствуетатрибутр 1 а у
Ь а с k R а t е . По умолчанию мы предполагаем, что р 1 а у -
ba ckRa te - это 1, то есть нормальное воспроизведение медиа
файла со стандартной скоростью. Если мы увеличим значение
этого атрибута, воспроизведение будет ускорено; если умень
шим - замедлено. При отрицательных значениях атрибута
144 • Глава 4
if (video.playbackRate != undefined) {
video.playbackRate = direction 1? 2
-. -2;
else { // do it rnanually
video.setAttribute('data-рlауЬасkRаtе',
-. setInterval ((function () {
video.currentTime += direction;
return arguments.callee; // allows us
-. to run once and setlnterval
})(),500));
}
function playnormal(video)
if (video.playbackRate != undefined)
video.playbackRate = 1;
else { // do it manually
clearInterval(video.getAttribute
I ('data-рlауЬасkRаtе'));
Возможности УПРАВЛЕНИЯ
МУЛЬТИМЕДИIА
</a r t ic l e>
HTML5 позволяет применять специальные атрибуты к любому элементу. Это может быть исполь
зовано для передачи информации локальным скриптам . Раньше, чтобы хранить специальные
данные в разметке, авторам приходилось прибегать к неприятным решениям вроде применения
классов использования: <- прц ; cla"s="spareship sh~e ..ds-') .lve~-', '1 rg>-
В этом случае скрипту, чтобы извлечь значение, приходилосьбы тратить время на сбор имен
классов, таких как '; ~.
:. , ~ .;,-- 5 и обработку их отображения (в данном случае, выделение цве
том) . В своей книге РРК на Java5cript (New Riders, 15BN 0321423305) Петер-Пауль Кох объясняет,
как это сделать и почему на некоторых страницах HTML 4 он решил использовать специальные
атрибуты . Таким образом он делал JavaScript более стройным и простым для написания, но также
провоцировал техническую невалидность страниц. Так как для передачи пар «имя/значение»
скриптам гораздо проще использовать .:: е. ':: 3.- з tl : е ~.:::i5~ ~ , HTML5 вводит и стандартизует эту
полезную практику.
Мы используем... . 7 г - ,,;: J ' .1'. И i ·:;. -;:~. - e ~ 'i ; они также могут называться ·з :;, , ;; -;; ':5.::- '_ И -1
, ил и (в другом типе видео) ::; " ё e. -'_. ':~; - :тa. '::~:;~ И .::.st -,; - s ~ 3. ~- .~ ~ d :: : .: <-: = . Как и при выборе
имен класса или id, имя должно быть осмысленным.
а, кроме того, когда все это будет полностью реализовано в браузерах, автоматическоеопре
деление атрибута ,B -:: :i =e : установит его значение по отношению к отдельному элементу. Это
предоставит вам простой синтаксис для установки специальных данных.
ЗАКЛЮЧЕНИЕ
Вы узнали о том, как HTML5 предоставляет вам первую адек
ватную альтернативу сторонним плагинам. Из-за отсутствия
совместимых кодеков на данный момент разместить видео на
странице и заставить его работать в любом браузере гораздо
сложнее, чем использовать плагины. Видео и аудио становятся
стандартными элементами, которые поддерживаются браузе
рами (а не загадочными плагинами), для них предлагается эф
фективный API, их очень просто контролировать при помощи
JavaScript. Разработчики могут с легкостью писать собственные
элементы управления, имея в арсенале только поверхностные
Реми Шарп
Холст • 151
Рис. S.2.Ha основе элемента <сапvаs > созда ются и более сложные
графические приложения
query5elector и query5electorAII - это новый АРI объектной модели докуме нтов (Document
Object Model, DОМ), который принимает селектор (55 и возвращаетсоответствующиеэлемен
ты . Доступный во всех новейших браузерах, query5elector возвращает первый найденный узел
DОМ, тогда как query5electorAII возвращает объект NodeList . Пройдя по содержимому объекта,
вы можете выбрать необходимые элементы.
Поддержка элемента < C 2 T .- S э > В браузерах реализована достаточно хорошо; холст поддержи
вается в последних версиях четырех из пяти наиболее распространенных браузеров (и, если
уж на то пошло, в старых версиях холст также работает неплохо). Чаще всего, конечно, задают
вопрос, работает ли это в Iпtеrnеt Explorer.
В версиях IE, которые элемент '.с а п ' з s .'> не поддерживают (возможно, это случится в версии
IE9), его можно имитировать с помощью пары хитростей. Например, применить Silverlight и би
блиотеку под названием htmlSсапvаs (httр://Ыоgs.msdп.соm/dеlау/агсhivе/20091О8/24/usiпg-опе
рlаtfогm-tо-Ьuild-апоthег-html-S-s-сапvаs-tаg-imрlеmепted-using-silverlight .aspx). Также можно
воспользоваться библиотекой excanvas (httр ://соdе .gооglе.соm/р/ехрlогегсапvаs/), которая
преобразует API холста в Мicrоsоft VML.
Эти две библиотеки охватывают не всю функциональность API2D, только большинство наиболее
часто используемых методов. В сети есть примеры, демонстрирующие реализацию практических
задач с помощью этих библиотек. Теоретически, можно попытаться смешать эти трюки: пере
ключаться на excanvas, если Silverlight недоступен . Пока что на практике я этого не встречал, но
почему бы и нет? Главное - суметь распознать поддержку Silverlight.
прямоугольника
сгенерированныев АР! 2D.
c a nv a s . h e i g h t / 2 , О , <c a nv a s>
c a nva s.wi d t h/2 , c a nvas. h ei g ht/2 , 1 50) ;
g r adient . a d dCo 1o r S t op (0 , '#fff') ;
gradient.addCo1 orStop( 1, '# 0 0 0 ');
c t x .fi11 St y1 e = gr a d ient;
ct x. fi1 1 Re c t (0 , О , can v a s . width, canvas . widt h);
Вид градиентаможно варьировать.В этом примерея установил
начальнуюточку градиентав центр холста, а начальныйрадиус
задал равным нулю. Конечный радиус равен 150, однако об
ратите внимание, что центр конечной окружности градиента
156 • Глава 5
относительно
что для правильногозахвата изображенийи видео элемент ис
центральной точки, точника должен сначала полностью загрузиться.
однако конечный радиус Чтобы создать эффект, показанный на рис. 5.8 (копии изобра
у него намного больше жений, уложенные плиткой по всей площади холста), сначала
начального. В результате
растяните холст по размеру окна. Затем динамически создайте
мы получаем круг
изображение и, когда сработает событие загрузки, примените
с гладкой градиентной
изображение в качестве источника повторяющегося узора:
заливкой
var canvas = document.querySelector('canvas') ,
img = document.createElement('img'),
ctx = canvas.getContext(' 2d');
c a nva s. wi dt h = window.innerWidth;
canvas .height = window.innerHeight;
img.onload = function () (
ctx.fillStyle = ctx.createPattern(this,
-, 'repeat');
ctx.fillRect(O, О, canvas .width,
-, canvas.height);
};
img .src = , remysharp_avatar.jpg'
Все методы radius и агс работают с радианами, поэтому тем из вас, кто привык делать вычисления
в градусах, придется преобразовывать их в радианы. Вот как это сделать на JavaScript:
. '"',,-,
" ")V;
Во время рисования вы будете часто передавать методам значение в ЗБО градусов, что соот
ветствует Math.PI * 2, и 180 градусов, то есть Math.PI.
РИСОВАНИЕ ПУТЕЙ
Внутри АР! 2D есть APIpath - АР! путей, позволяющий пере
мешаться по холсту и рисовать линии и фигуры. На рис. 5.10
Рис. 5.10. Придуман ный
показан человечек, нарисованный с помощью АР! путей .
мной человечек
Я не собираюсь во всех подробностях рассказывать вам о коде нарисован с помощью
Оба АРI для рисования - Canvas и SVG - прекрасны, но предназначеНbI для разных целей.
Оцените их преимущества и недостатки, чтобы выбрать инструмент, наиболее подходящий для
вашей задачи. SVG - это API с отображением с задержкой, а 2О canvas- API с немедленн ым
отображением .
SVG строит дерево, представляющее текущее состояние всех объектов на экране . Именно по
этому он называется API с отображением с задержкой . Такое дерево предоставляет отличную
возможность для построения интерактив ных приложений . Привяэываясь к различ ным объектам
дерева, BbI прослушиваете щелчки или ожидаете события прикосновения, например, для распо
знавания действий пользователя в играх . Кроме того, этот АРI хорошо поддерживается настоль
НblМИ инструментами, такими как Adobe Illustrator и Inkscape. Они позволяют импортировать
и экспортировать рисунки SVG, и вам не приходится для создания собственных изображений
сражаться с кодом XML. SVG - это АРI векторной графики, он намного лучше поддерживает
масштабирование. В то же время изображения на холсте - растровые, они не масштабируются,
их можно только сжать или растянуть.
Если BbI еще не до конца уверены, хороший ли это инструмент, то попробуйте поэксперимен
тировать с Rарhаёl, библиотекой JavaScript Дмитрия Барановского (http://raphaeljs.com). В ней
используется только SVG, и она способна создавать очень впечатляющие рисунки и анимацию.
Холст хорошо подходит для создания анимироваННblХ изображений и приложений, сконцен
трировэнных вокруг JavaScript. По сравнению с SVG, это более низкоуровнеВblЙ API. Так как
дерева состояния холста здесь нет, данный интерфейс прикладного программирования лучше
подходит для ситуаций , когда движения МblШИ отслеживать не требуется . Однако его удобно
использовать в приложениях, которые управляются с кпавиатуры - таких, как демонстрацион
Hble версии В-битных игр, которых за последний год появилось великое множество. Поскольку
холст - очень JаvаSсгiрt-цеНТрИЧНblЙ интерфейс, события клавиатуры можно обрабатывать на
уровне документа . Наконец, при работе с холстом BbI оперируете отдельными пикселами, что
прекрасно иллюстрирует пример на рис. 5.1 О, следовательно, API canvas превосходно подходит
для пиксельного рисования.
У. каждой из этих технологий есть сильные и слабые стороны. Ваша задача как разработчи
ка - проанализировать требования создаваемого вами приложения и выбрать правильный
инструмент. Удачи!
160 • Глава 5
человечка-огуречка.
ИСПОЛЬ30ВАНИЕТРАНСФОРМЕРОВ:
3АМАСКИРОВАННЫЕПИКСЕЛЫ
' 1. по translalв
setInterval(function () {
ctx.clearRect(-сtх.сапvаs .width/2,
~-ctx .canvas .height/2,
ctx .canvas .width,
ctx.canvas .height);
~
ctx .rotate(Math .PI / 180 * 0.5) / / 1 /2
~ градуса
drawSpiral();
}, 10);
162 • Глава 5
"".,.
СОВЕТ
у объекта context есть атрибут под назван ием canvas, в ключающий обратную сс ыл ку на эле мент
холста, частью которого он является . С помощью него м ожн о вернуться к хол сту и узнать его
высоту и ширину - удоб но, есл и в вашем распоряже нии и меется только контекст.
ЗАХВАТ ИЗОБРАЖЕНИЙ
Помиморисованиялиний и форм, вы также можете копировать
изображения- фотографии, видео и другие ;mементы холста -
из других источников. Я уже демонстрировал, как использовать
изображение в качестве источника для заливки creat e Pa t t e r n .
Но можно и просто поместить изображение на холст. Или не
просто, а кадрировав его или применив другие корректировки .
комом JavaScript.
Захват и рисование происходят в методе d raw I mage, кото
рый работает с различными источникамиэлементов HTML,
перечисленными выше. Он принимает три следующих набора
аргументов:
холст.
video.addEventListener('timeupdate', function ()
{
if (this.currentTime > 52)
this.currentTime =49;
I
}, false);
video.addEventListener('loadeddata', function ()
{
var size = 78; // thumbnail size
canvas.width window.innerWidth;
video.volume = О;
shortestEdge = video.videoHeight >
I video.videoWidth ?
video.videoWidth
video.videoHeight;
ctx.drawImage(
video,
(video.videoWidth shortestEdge)/2,
I sx
//
(video.videoHeight - shortestEdge)/2,
...., // sy
shortestEdge, // sw
shortestEdge, // sh
i, // dx
О, / / dy
size, // dh
size // dy
) ;
}
}, 67); // 67 - это приблизительно 15 кадров
I в секунду
}, false);
Главное волшебствопроисходитвнутри метода s е t 1 n te rv а 1,
который срабатывает каждую 0,067 долю секунды (так как
в JavaScript секунды измеряются в тысячах миллисекунд,
а 1000/15 = приблизительно 67, то мы получаем примерно
Холст • 1.5
Dest!na1lon Canvas
dx
Leverage Mallets
Lorem ipsumdolor sit 1Ш1Ct, consec:eturadipWcingеlit. sod do
eiusmod leшроr incididunt щ lаbore et doloreшagna aJiqua. Ut
enimad ~ v~ quis nOStIUd ехercitadon O~
РА60ТА С ОТДЕЛЬНЫМИПИКСЕЛАМИ
.., изображения
ПРИМЕЧАНИЕ
}
ctx .putlmageData(pixels, О, О);
};
img.src = 'authors.jpg'
,
: ПРИМЕЧАНИЕ
у элемента -С :~- ", г ', ,,, з > есть внутренний флаг соответствия источников, который по умолчанию
равен true. Значение этого флага меняется на false, если на холст выводится изображение или
видео, источник которого не совпадает с источником документа-владельца холста. То же самое
относится к использованию в качестве источника изображения другого холста, у которого флаг
соответствия источников уже равен false. Если значение флага равно false, то применить метод
getlmageData или toDataURL невозможно, даже если изменить размер холста или нарисовать
что-нибудь на нем после того, как флагу было присвоено значение false.
ЗАПИСЬ В ФАЙЛ
• '. J ~
Адрес начинается со слова data, затем указан тип mime, кодировка - Ьаsеб4, а после этого идут
необработанные данные. Необработанные (или сырые) данные - это то, что экспортируется
из элемента холста. Браузеры умеют декодировать их, превращая в реальные ресурсы (к сожа
лению, это не относится к 'Е7 и предыдущим версиям 'Е) . Помимо этого, 'ЕВ поддерживает URL
данных длиной только до 32 Кбайт - и не стоит об этом забывать!
АНИМИРОВАННЫЕИЗОБРАЖЕНИЯ
НА ХОЛСТЕ
БИБЛИОТЕКАJAVASCRIPT PROCESSING
Как вы вскоре увидите, перемещаться по холсту, рисуя линии и заливая формы, - это целая
проблема, однако уже появились библиотеки, значительно упрощающие работу с холстом. Одна
из таких библиотек называется processing.js (http://processingjs.org/). Она написана автором
jQuery, Джоном Резигом.
2) очистить холст;
у = 50,
dx = 2,
dy = 4,
width = ctx.canvas.width,
height = ctx .canvas .height;
// загрузка изображения
balllmg = document.createElement('img');
balllmg.src = 'bruce-ball.png';
ballctx = ball.getContext('2d');
// транслируем центр для правильного вращения
ballctx .translate(25, 25);
setlnterval(draw, 10);
};
function draw() (
ctx.clearRect(O, О, width, height) ;
х += dx;
У += dy;
СОХРАНЕНИЕИ ВОССТАНОВЛЕНИЕ
УСЛОВИЙ РИСОВАНИЯ
• трансформации;
• области отсечения (в этой книге не рассматриваются);
• текущие значения атрибутов fillStyle, font, globalAl-
pha, globalCornposi teOperation, lineCap, lineJoin,
liпеWidth, rniterLirni г, shadowBlur, shadowColor, shad-
И textBaseline.
ВИ3УАЛИ3АЦИЯТЕКСТА
Для того чтобы нарисовать текст, вам нужна сама строка и ко
ординаты. Например, я использовал рисованный текст для того,
чтобы продемонстрировать, как работает метод t r а п s 1 а t е
(рис. 5.19, а также рис. 5.13 ранее в этой главе). С помощью
fill Text Я демонстрировал,куда переноситсяновая централь
ная точка холста, и подписывал координаты точек (размер
холста в данном примереравен 300 х 300 пикселов):
function dot(string) {
ctx.beginPath();
ctx.arc(0,0,5,0,Math.PI*2,true); // рисую
...., круг
ctx . fill () ;
ctx.fillText(string, 5, 10); // вывожу текст
. 1. па "811S11111J
ПРИМЕЧАНИЕ .
ЗАКЛЮЧЕНИЕ
Благодаря API холста разработчики наконец-то получили спо
соб рисовать в браузерах, не пользуясь приложениями на ос
нове Flash. Холст особенно удобен для обработки отдельных
пикселов, и я уверен, что у пиксельных приложений большое
будущее. Совсем скоро мы увидим то, чего еще не было в исто
рии Всемирной паутины.
Реми Шарп
Хранение данных • 179
ПРИМЕЧАНИЕ
ВАРИАНТЫ ХРАНЕНИЯ
Что касается хранения данных на клиентской стороне, суще
ствует два варианта:
ВЕБ-ХРАНИЛИЩЕ
ПРИМЕЧАНИЕ
ф ......:-- -:- К' ~ для прсв ерки доступа к таким фс.;':'~.т: "<'.~
, _~ (С ~ :ookieprobe=' ~ ~d + ';path=/';
Этот код создает файл cookie и сразу же пытается снова его считать . Если чте ние возвращает
ошибку, зн а ч ит, система безопасности блокирует попытки создания файлов cookie, и, следова
тель но, обратиться к sessionStorage или localStorage тоже не получится. Когда использование
фа йлов cookie отключе но , с читывание дан ных из хранилищ sessionStorage или localStorage
приводит к ошибке, а исполнение кода JavaScript прерывается.
ОБ30Р API
.-
Хотя в спецификации говорится, что можно сохранять «любые
данные», в действительности это означает, что можно сохранять
любые данные типа DOMString.
ИСПОЛЬЗОВАНИЕСИНТАКСИСА EXPANDO
sessi0nStorage.twitter = '@rem'
alert( sessi0nStorage .twitter ); // о тобр а ж а е т с я :
"@rem"
к сожалению, как и в предыдущем примере с видеороликами
Брюса, методы expando также страдают от «строкофикации»
значений.
ИСПОЛЬЗОВАНИЕМЕТОДА КЕУ
УДДЛЕНИЕ ДДННЫХ
ПРИМЕЧАНИЕ
var videoDetails = {
author: 'bru ce'
description: 'how to leverage synergies',
rating: ' -2'
);
sessionStorage.setItem('videoDetails' JSON .
stringify(videoDetails) );
v a r videoDetai1s = JSON.parse(sessionStorage.
g etItem(' v ideoDetai1s'));
как говорилосьВ разделе, посвященномобзору API, если в объ
екте хранения запрашиваемый ключ отсутствует, то метод
возвращает значение п и 11. Это не проблема для стандартных
парсеров JSON, так как JSON. parse (nu ll ) вполне предсказуе
мо возвращает значение гш П. ; Однако если передать п и11 коду
на JavaScript от Дугласа Крокфорда, то это приведет к ошибке.
Следовательно, если вам известно, что будет использоваться
библиотека Дугласа для JSON на JavaScript, то заранее преду
смотрите обработку ошибки, добавив такой код:
v ar v i d eoDeta i1s = J SON . par se( s e s si o n St o ra ge.
g etItem
-т (' vi deoDetai1s') 1 1 'п и11');
ПРИМЕЧАНИЕ
I
I
G Х
Firebug в Firefox
С помощью плагина Firebug можно с легкостью заглянуть в объ
екты хранилища 6раузера Firefox. Укажите в команде консоли
sessionStorage или localStorage, выполнитекод и сможете
._.
wi"dow > s.rorag.
bruc:e IIThink Jw's о P'!"cfesSOl" of synt",P,ES"
..my "Thi.nk Ьессе i , О l 000му pr of es sot" of .sync! L"'gi.M"
Iwlltltr
у 'IIideoDetails ..{" oиtho,.· : ..brloК.е " , "a eSC1"1ption ll : " how to t e V'ttf"'oge
· 4.,
Рис. 6.2. Инструмент анализа содержимого хранилища Firebug
DragonFly в Орега
ИнструментDragonFly поставляется в составе Орет. На вкладке
Storage (Хранилище) можно просмотреть все данные, вапи
санные для текущей страницы . В частности, предусмотрены
отдельные вкладки ДЛЯ локального и сеансового хранилищ,
- . .
r-cluthol"' ~_ : ·ы"'с е'', ' 'duс,.iрti.on'': ''hDw
. +D
to ltve:". synt'!l"Qies",~ !"Oti- ng' _: " - Z" }
~~,.~,)
•
06ХОДНЫЕВАРИАНТЫ
return {
clear: function () {
data = {};
window.top.name =
},
getItem: function (key)
return data[key] II null;
} ,
key: function (i) {
// не идеально, однако работает
var ctr = О;
for (var k in data) {
if (ctr == i) return k
else ctr++;
},
removeItem: function (key)
delete data[key];
window.top.name =
--, JSON.stringify(data);
} ,
setItem: function (key, value) {
data[key] = value+" // заносит
--, значение в строку
190 • Глава б
};
}) () ;
}
, ПРИМЕЧАНИЕ
в настоящее время реализации баз данных SQL дЛЯ веб поддерживают более старую версию
API и, в частности, старую модель контроля версий.
Хотя спецификация описывает управление и миграцию с разных версий базы данных, реали
зовано это пока что не очень хорошо. Согласно требованиям модели, вы должны знать версию
базы данных на машине пользователя, чтобы суметь открыть ее. Проблема в том, что если вы
сменили несколько версий собственной базы данных, то становится невозможно определить,
какая версия установлена на компьютере пользователя, а попытка открыть базу данных с не
правильным номером версии возвращает ошибку INVALID_5.TA1E_ERROR. Можно обернуть все
попытки открытия базы данных в соответствующие ловушки, но это потребует отдельной оберт
ки для каждой версии - представьте, во что превратится код через несколько лет обновлений .
192 • Глава б
СОЗДАНИЕ ТАБЛИЦ
1. Запрос SQL.
2. Аргументы запроса SQL (например, значения полей).
3. Обратный вызов при успешном завершении.
var db;
if (window.openDatabase) {
db = openDatabase('tweetdb' '1.0',
-, 'All ту tweets' 2 * 1024 1024);
db.transaction(function (tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS
-, tweets (id, date, tweet)' [],
-, function () {
// теперь можно загружать в таблицу
-, сообщения
}) ;
}) ;
ВСТАВКА И ОПРОС
}) ;
get Tweets () ;
ПРИМЕЧАНИЕ . ,
Вы создаете новую транзакцию для каждого сообщения, которое записывается в базу данных.
Подробнее о транзакциях я поговорю в следующем разделе, но, оборачивая каждый оператор
INSERT, вы гарантируете, что будут сохранены все новые сообщения, независимо от того, есть
они уже в базе данных или нет.
<!DOCTYPE htrnl>
<htrnl lang="en">
<head>
<rneta charset=utf-8 />
<title>HTML5 tweet tirne range</title>
<style>
body { font-farnily: helvetica, arial;}
</style>
</head>
<body>
<forrn>
<fieldset>
<legend> Выберите диапазон создания
I последних сообщений об HTML5 в
I Twitter</legend>
<input type="radio" value="5" id="t5rn"
-1 narne="tirnerange" /><label for="t5rn">
I 5 минут</lаЬеl>
<input type="radio" value="30" id="t30rn"
-, narne="tirnerange" /><label for="t30rn">
-, 30 минут</lаЬеl>
<input type="radio" value="120" id="t2h"
I narne="tirnerange" /><label for="t2h">
I 2 часа</lаЬеl>
<input type="radio" value="all" id="tall"
I narne="tirnerange" checked="checked"
I /><label fоr="tаll">за все
I время</lаЬеl>
</fieldset>
</forrn>
<ul id="tweets"></ul>
<script>
var tweetEl = docurnent.getElernentById('tweets');
var db;
function setupDatabase() {
if (!window.openDatabase) {
tweetEl.innerHTML = '<li>Web SQL Database
API недоступен в этом браузере.
I
Хранение данных • 1.
function getTweets() {
var script = document.createElement('script');
script.src =
'http://search.twitter.com/search.
I json?q=htm15
I -RТ&rрр=100&саllЬасk=sаvеТwееts';
document.body.appendChild(script);
function show(amount) {
db.transaction(function (tx) {
tx.executeSql('SELECT * FROM tweets' +
(amount !='all' ? ' WHERE date >
strftime("%s", "now", "-' +amount +
пц.пш.ев ")" "), [], function (tx,
I resul ts) {
var html [],
len = results.rows.length;
200 • Глава б
[] .forEach.call(document.querySelectorAll('input
I [type=radio]'), function (el) {
el.onclick = function () {
show(this.value);
}) ;
// вперед!
setupDatabase();
</script>
</body>
</html>
db.transaction(function (tx) {
tx.executeSql('DROP TABLE foo');
db.transaction(function (tx) {
tx. executeSql ( , SELECT * FROM foo' [] ,
-, function (tx, results) {
аlеrt('найдено ' + results.rows.length +
-, , строк');
}, function (tx, error) {
// это исполняться не будет никогда
аlеrt('что-то пошло не так: +
-, error.message);
}) ;
}) ;
ЗАКЛЮЧЕНИЕ
в этой главе вы узнали о двух API дЛЯ локального хранения
данных браувера, оба из которых с легкостью затыкают за пояс
файлы cookie (а учитывая API индексированных баз данных,
в процессе разработки находится еще больше спецификаций
хранения).
Глава 7
АВТОНОМНАЯ РАБОТА
Реми Шарп
Автономная работа • 205
. .
., П Р И М Е Ч А Н И Е·~~:' ..; ~ ','. '
МАНИФЕСТКЭША
The ~me оп your compuleris 11:33:24 аnd the ~тe оп the serveris 9:32:18
Моему полномуприложениютребуютсяследующиересурсы:
• страница приложения - в данном случае, index.html;
FALLBACK:
server-time.js fallback-server-time.js
# version 8
Очень важно сохранять правильный формат файла. Первая
строка содержит два слова: САСНЕ MANIFEST. Благодаря ей
браузер понимает,что далее перечисдяютсяфайлы манифеста.
Эти файлы разбиты на категории, также известные как про
странства имен. Категория по умолчанию - это САСНЕ, И если
она не указана, то все встреченные имена файлов помещаются в
эту категорию, пока браузер не находит новую категорию. Таким
образом, я мог бы написать свой манифест так - и он бы ничем
не отличался от предыдущего:
САСНЕ МANIFEST
САСНЕ:
index.html
time.js
time.css
FALLBACK:
server-time.js fallback-server-time.js
# version 9
Категории можно использовать несколько раз. Чтобы добавить
в кэш новые файлы, допишите их в конце манифеста. Если
208 • Глава 7
ПРИМЕЧАНИЕ
ПРИМЕЧАНИЕ
ПРИМЕЧАНИЕ
FALLBACK :
server-time.js fallback-server-time.js
NETWORK:
*
# version 10
КАК ПРАВИЛЬНОПОДАВАТЬМАНИФЕСТ
Вам осталось решить единственную проблему, и вы сможете
полностьюперевести приложениев автономныйрежим. Итак,
файл манифестанужно правильно подать: у него должно быть
расширение.manifest и правильный тип mime.
ПРИМЕЧАНИЕ
Accept-Ranges: bytes
Content-Length: 113
Content-Тype: text/cache-manifest
~TfMndul~ mo'~expi_ss.c>
Expi ::esl'.""- ',-'е о:
Expjr~~ByType tpxt/cache-mапifеsL Uассеsз plu~ u seconds u
</ 1 frv1()(~ 1]1- е>
Также в ответ на запрос файла .mапifеst можно отправлять пользовательские заголовки и за
головок по-сасhе:
~ о: r.m.
""',,,,С,,,
мq s_ ,
OcкU~"IS
l()n1.~
.......
-
i;
11_
Styk>~ttef'l'
8171~
' -'
14.... '
SCrtl't ·
17т~
1..... '
~
OtMt
1.....
1. . . :
Тт.а!
/1... ,
1Z- :
~
15"" . , ,,_
~-------- -- ' - - -- - - ~- -i-- ----"""- - --- -- ~----";'--- ----- --- ----- ---- ------ + --- -----
~_~ . __ . . _ .. _. .i
l Z7 е е 1 - - [8S/Мa,.ne10 11 30 35~] -GEТ /сhe7/t \йIe'/ til'le ./I'IClrнf е st t1ТТP/ l 1 3й4 - ~ "!otJ l1H a/5 0 <,~c , .,t ('l · '
117 01' . 1 • • [05/10101"/2010 11. 30. 35 ...е0001 ' GEТ Ich07/t,~/s('rver· t \~ ]5 НnP/l т' 304 ht tP I I ~rott"oduo ng'1 t1'11 S (.;
APPLICATIONCACHE
applicationCache - это объект, уведомляющий об изменении
локального кэша, который также позволяет вручную запустить
его обновление. ОбъеКтаррliсаtiопСасhе получает событие,
объявляющее об обновлении кэша, только при изменении со
держимого манифеста.
В последовательности шагов из предыдущего раздела, после
того как браузер загружает в кэш файлы из манифеста, в объ
eKTeapplica tionCache срабатываетсобытие. Благодаряэтому
событию вы можете сообщитьпользователям,что приложение
было обновлено на серверной стороне и нужно перезагрузить
окно браузера, чтобы насладитьсяновейшей и наилучшейвер
сией программы. Для этого вам потребуетсяреализовать про
стейшее прослушиваниесобытий и уведомление:
applicationCache.onUpdateReady = function () {
// манифест кэша изменился, давайте попросим
-, пользователя
// перезагрузить приложение, чтобы получить
-, версию 2.0
notifyUserOfUpgrade() ;
};
обновления приложения.
Мне кажется, что практические возможности применения
swapCache довольно ограничены. Однако событие готовно
сти обновления весьма полезно. Оно сообщает пользователю,
что тот может перезагрузитьокно браузера и получить новей
ший код приложения - так же, как настольное приложение
сообщает о готовом к загрузке обновлении. За исключением
подобных случаев, обновления загружаются незаметно для
пользователя.
ОПРЕДЕЛЕНИЕ НАЛИЧИЯ
ПОДКЛЮЧЕНИЯ С ПОМОЩЬЮ
М~НИФЕСТА
Содержимое манифеста:
САСНЕ MANIFEST
FALLBACK:
online.js offline.js
online.js содержит:
setOnline(true);
offline.js содержит:
setOnline(false);
216 • Глава 7
update:
function testOnline(fn) {
var script document.createElement('script')
script.src = 'online.js'
document.body.appendChild(script);
testOnline(function (online) {
if (online) {
applicationCache.update();
else {
// демонстрируем пользователям
I ненавязчивое сообщение об отсутствии
I сетевого подключения
}) ;
ОЧИСТКА КЭША
Как я уже говорил ранее в этой главе, браузеры прикипают
к кэшу всем сердцем. Можно запросто попасть в ситуацию, ког
да очистить локальный кэш, чтобы протестировать внесенные
изменения, будет просто невозможно. Пока что в спецификации
не предусмотрено методов для программной очистки кэша (на
пример, это нельзя сделать из объектааррliсаtiопСасhе).
Помня об этом, я настоятельно рекомендую вам во время раз
работки избегать манифеста кэша. Удостоверьтесь, что разра
ботка приложения полностью завершена, и только после этого
Автономная работа • 217
Вручную. для того чтобы обновить кэш, нужно всего лишь из
менить содержимое файла манифеста. как я уже сказал, исполь
зуйте комментарий с указанием версии или подобной инфор
мацией. Но что делать, если вам нужно начать сначала или если
вы попросту хотите удалить атрибут манифеста? Это возможно
только во время разработки, так как требует очистки кэша
браузера (и, в зависимости от браузера, кэш может храниться
в разных местах).
ЗАКЛЮЧЕНИЕ
в прошлом веб-сайты полностью зависели от подключения
к Интернету. Сегодня браузеры начинают постепенно под
держивать возможность автономной работы, и в этой главе вы
узнали, как заставить веб-приложения работать без подключе
ния К сети.
Глава 8
ПЕРЕТАСКИВАНИЕ
Реми Шарп
Перетаскивание • 221
НАЧИНАЕМ ПЕРЕТАСКИВАТЬ
Мы начнем с абсолютного минимума, необходимого для по
гружения в волшебный мир перетаскивания. По умолчанию
перетаскивать можно все ссылки, текстовые узлы (выделенный
текст) и элементы изображения. Это означает, что для того,
чтобы пользователь мог перемещать такое содержимое по стра
нице, вам не нужно сообщать браузеру никакие дополнительные
сведения .
</script>
Я используюминимальныйобъем кода HTML- просто чтобы
пример не получился слишком громоздким. Как вы видите, я за
хватываю ссылку на элемент di v#drop, а затем устанавливаю
спецификации:
1/ the drop is to Ье accepted,
then this event (dragover) has to Ье
canceled. (Чтобы принять перетащенный элемент, зто событие
(dragover) необходимо отменить.)
Что ж, ваше первое приложение с перетаскиванием теперь рабо
тает, поэтому можно перейти к трюкам, о которых я упомянул
выше. Давайте сначала исправим ошибки в Firefox - это просто.
Когда вы отпускаете изображение на зоне приема в Firefox, то
если значение getData ( 'Text') выглядит как ссылка, то зона
приема передает его брауаеру, то есть вы получаете источник
изображенияили значение href для ссылки. Таким образом,
нужно всего лишь запретитьдействие браузера по умолчанию
в событии о гор , При использовании встраиваемых обработ
чиков для этого необходимо вернуть f а 1 s е либо применить
event. preventDefaul t () . в результате получаем такой об
работчик события о гор ;
drop.ondrop = function (event) {
this.innerHTML += '<р>' +
I event.dataTransfer.getData ('Text') +
I '</р>';
return false;
};
};
СОВМЕСТИМОСТЬ ПЕРЕТАСКИВАЕМЫХ
ДАННЫХ
ПЕРЕТАСКИВАНИЕ ДАННЫХ
В ДРУГИЕ ПРИЛОЖЕНИЯ
ДОБАВЛЕНИЕ ПОЛЬЗОВАТЕЛЬСКОГО
3НАЧКА ПЕРЕТАСКИВАНИЯ
ДОСТУПНОСТЬ
Если вы успешно пробрались сквозь все сложности, разветвле
ния и тупики этой спецификации, то, возможно, перед вашим
приложением с возможностью перетаскивания встала про-
Перетаскивание • 231
копирования с клавиатуры.
while (i--) {
if (boxes[i] .getAttribute('draggable') !=
undefined) {
boxes[i] .ondragstart = function (event)
event = event II window.event;
this.setAttribute('aria-grаЬЬеd' ,
...., 'true');
// поддержка ARIA в зонах приема
drop.tabIndex = О; // для поддержки
...., клавиатуры
drop.setAttribute('aria-drореffесt' ,
...., , сору' ) ;
ZЭ2 • Глава 8
1/ делаем что-нибудь
I с dataTranfer.setData
};
ЗАКЛЮЧЕНИЕ
АР! drag and drop находится не в лучшем состоянии и его до
вольно сложно реализовать во всех браузерак. которые может
поддерживать ваше приложение. Вполне вероятно, что вам
придется искать помощь в решенияхна основе JavaScript, чтобы
реализовать перетаскивание там, где поддержка drag and drop
отсутствует.
Реми Шарп
Геолокация • 237
le maps i ___ _ _
And ~~and pt8C8801 .......
(рис. 9.3).
12:18 ~
. С
""
No.
МЕТОДЫАРI
АР! геолокации находится внутри объекта навигатора и содер
жит всего три метода:
• getCurrentPosi ti on
• watchPosi tion
• clearWatch
МеТОДЫwаtсhРоsitiопИ сlеаrWаtсh - парные. Методы
watchPosition ИсlеаrWаtсh работаютпо томужепринципу,
что и setlnterval и setTirneout. watchPosi tion возвра-
240 • Глава 9
аргументы:
navigator.geolocation.getCurrentPosition(function
(position) {
аlеrt('Мы тебя нашли!');
// что-нибудь делаем с данными
I о местоположении
}) ;
--
47-48 Cheltenham PI, Brighton, Bright.
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition
--, (function (position) {
Геолокация • 243
var coords = posi tion .coords ;
s h o wMa p (c o o r d s . l a t i t u d e ,
, coo r ds . l on g i t u d e , coords . accuracy ) ;
}, f unc ti on (e r r o r) {
var e r r o r Ty pe s = {
1: ' Д о с т у п з а пр е ще н '
2: ' К о о рдинаты недоступны',
3: ' В р е мя о ж и д а н и я и сте кл о '
};
У обработч ика ошибок есть альтернатива : проверка атрибута accuracy. Однажды я эашел на веб
сайт, определяющий местоположение nольэователя, из дома в Брайтоне на южном побережье
Днглии. Однако судя по карте на этой странице, nриложение пос читало, что я находился прямо
в центре Лондона. С помощью журнала консоли Flrebug я эагля нул во внутренности nриложения
и обнаружил, что диапазон точ ности составлял 140000 метров . Определение местоположения
с точностью до 140 километров - это край не неточноl Вполне понятно, почему nриложение не
мо гло определиться, что же считать моим домом . Именно поэтому в приложениях с возможно
стями геолокации я н а стоя тел ь но рекомендую проверять диаnаэон точности, даже если вызов
эавершается успешно. Если эначение атрибута accuracy окаэалось чреэмерно большим, лучше
попросту проигнорировать геогр а ф и ч ес к и е данные, полученные автоматически, и попросить
nольэователя укаэать свое местоположение вручную.
НАСТРОЙКАГЕОЛОКАЦИИ
Наконец. третий аргумент обоих методов, getCu rren t Pos i t i o n
И wа t с h Р о s i t i о п - это параметры rеолокации. Как вы уже
знаете. они необязательные, но могут быть следующими:
• е паЫ е Н i g h А с с u r а с у (булево значение. по умолчанию
f al s e );
• t i rn e out (в миллисекундах.по умолчанию бесконечность
(значение О));
ЗАКЛЮЧЕНИЕ
Когда красные телефонные будки еще встречались в Велико
британии на каждом углу) внутри них обязательно было на
клеено объявление с адресом будки. Таким образом) если вам
нужно было вызвать полицию или скорую помощь) вы могли
сразу сказать) где находитесь. Разумеется) это было на руку
и любителям погулять в пятницу вечером) ведь для того чтобы
позвать друга на помощь) надо точно знать) куда его зовешь.
Реми Шарп
Сообщения, фоновые вычисления и сокеты • 249
ПРИМЕЧАНИЕ
ПРИМЕЧАНИЕ
}
}, false);
В этом сценариия устанавливаюприемниксобытийдля прослу
шивания сообщения,передаваемыхобъекту window. у объекта
even t есть свойство da ta - оно содержит полученное сообще
ние. Помимо свойства da t a, у объекта e vent есть и дрyrие по
лезные свойства: or i g in и s our ce.
Свойство event. origin позволяет узнать домен, из которого
пришло сообщение.Как показано в предыдущемкоде, основы
ваясь но содержимомданноrосвойства,я решаю, обрабатывать
ли сообщение. Это простейшийуровень управления полити
ками.
. с (1.. CoogI •
_Sc.I",
Sl.fl:ri 11. по long.r '.Ipondj"~ Ьее.... 1! of а I.aipt on
m. webPav. -J.П1IfLS СМmo : Non Wot1ctt" (nnp :/I
htmISа.mo,.сom/пon-WOfk.r). [)g ';0\1 want 10 stop
runnlrtg те sc:npt . О( __с i1 continut?
Небольшая хитрость: предполагается, что АРI фоновых вычислений должен уметь отправлять
не только строки, но и объекты - так же, как АРI сообщений, - но большинство браузеров,
тем не менее, превращают объекты в строки. Однако в Firefox реализовано внутреннее преоб
разование JSON.stringify/JSON.parse для отправки и получения сообщений от объектов фоновых
вычислений, чтобы вам не приходилось заниматься этим самостоятельно. Можно надеяться ,
что хорошему примеру последуют и разработчики других браузеров , и однажды мы сможем
отправлять объекты через систему пеJ:>есылки сообщений.
Сообщения, фоновые вычисления и сокеты • 255
ПРИМЕЧАНИЕ
};
function run ( ) {
var n = 1 ;
search: while (true) {
n += 1;
f or (var i = 2; i <= Math.sqrt(n); i += 1)
i f (п % i == О)
cont inue search;
// нашли простое число!
postMessage(n);
..
Мит
\ 3
П I
и в других браузерах.
Что же это все означает? А то, что можно создать одно фоновое
вычисление, которое затем разделит свою работу на множество
маленьких заданий и передаст их фоновым вычислениям вто
рого уровня. Давайте снова вернемся к примеру с наложением
сложного фильтра на фотографию в вашем супернавороченном
веб-приложении для обработки изображений. Для того чтобы
ускорить обработку фотографии - если, конечно, это примени
мо с конкретным типом фильтра, - ее можно разбить на зоны
и передать каждый фрагмент данных изображения отдельному
фоновому вычислению.
По мере того как каждое из фоновых вычислений второго уров
ня возвращает данные, счетчик заданий уменьшается, и, ког
да он обнуляется, главное фоновое вычисление возвращает
готовые обработанные данные изображения родительскому
документу. Приложение будет выглядеть приблизительно так
(я опустил реализацию некоторых функций, просто чтобы про
демонстрировать идею):
var pendingWorkers = О,
results = {},
workingWidth = 100;
pendingWorkers =
I getNumberOfWorkers(imageData.width/
-, workingWidth);
// сбрасываем старые результаты
results = {};
,f·,
function storeResult(event) {
var result = JSON.parse(event.data);
Сообщения, фоновые вычисления и сокеты • 25'
buildUpImageData(result) ;
репdiпgWоrkеrs--;
if (pendingWorkers <= О) {
postMessage(JSON.stringify(results)) ;
// самозакрытие
close ()
};
onconnect = function(event) {
connections.push(event.ports[O]);
connections[i] .postMessage(JSON.
I stringify(messages));
f u n c t i o n 1 0 g (ms g ) {
po s tMe s sage(' 1 0 g + msg);
)
i f (a c t i o n == ' 1 0 g ' )
co ns 0 1 e .10 g (msg)
e1s e {
// др уг о е д е й стви е
};
cooBole.log(thlB) I
1
> locatioD
http .//introducinqhtmlS.com/exampleB/chlO/echo.jB{
href . "http ./ /introducinqhtmlS.com/exampleB/chlO/echo .jB ".
protocol : "http ,",
hOBt s ..introducinghtml5 .com",
hOBtname I .. introducin9htmlS. сое" ,
port : .... ,
pathn"""'. "/exampleB /chlO/echo . jB".
search: ." ,
ЬааЬ : ....
}
> n&vi9ator
(ob ject Nav iqator]{
appNamet "Netscape " I
appVersion: " 5. 0 (Мa.cintosh , en-GB) " ,
platform.: ·'м.a.cIntel",
userAqent: "Mo z i l l a / 5 . 0 (Macintosh: О , Intel Мас 08 Х 10 .6; en-GB,
rv .I .9 .2 .Э) Gecko/20100401 Firеfох/З.б .Э "
}
ПРИМЕЧА.НИЕ .:, ,
вовать его,
QllbI8.IIn.t'8mtn8kwmelнl"w.rmlnl6d8~
I 12".lQ.... .,.3f'1tftftom'll8b
.120 L.OOIOng lDrword ~ ..,dlng now bDDkь)' .bruc.l Soundo ..011,I n_ng fI'om011
"'_hlnlllllh5
,;2,t, РМ,. эgф ' - ,..-..
=IO:V~~.~J.:.~')~:=~~~
КNL5dell'<lll'lh5 о>Оооа IhIng
I 't:M .... Agr3Otn~T~
A _ I ..... hopo .rom ond . - knowwhol """- -ng 'bou~ Ьосоо.
I I'm _
1_
bo'-ng lhoI.bDDk_ " h...,.. ""t 11М
' 2 :lePМ.:iOth~T...ow.:tt
СОВЕТ
};
3АКЛЮЧЕНИЕ
Эта глава вооружила вас последними новинками из арсенала
средств HTML5 дЛЯ построения веб-приложений, Теперь вы
умеете создавать многопоточные. многооконные, междоменные.
и НАПОСЛЕДОК ...
Надеемся, вас вдохновило это краткое знакомство с новыми
структурами и АР! HTML5, и вы готовы начать их использовать.
В спецификации осталось еще много великолепных вещей, о
которых мы не поговорили, потому что они пока что не ре
Подписано в печвтъ 17.12.10. Формат 70хlОО/16. Усл. п. л. 21.93. Тир.. 2000. 3аказ 24848.
000 «Мир кни!"». 198206. Санкт-Петербург. Петергофское шоссе. 73.лит. А29.
Нanого_ л"гота - обwероссиАскиА lCЛассификатор продукции ОК 00~-93. том 2; 9~ ЗОО~ - литература учебнu.
Отпечатано по технологии CtPв ОАО «ПечатныА двор» им. А. М. Горыого.
197110. Санкт-Петербург. ЧкanовскиА пр .• 1~.