JavaScript. Подробное руководство, 6-е издание, стр. 346

<b>      }</b>

<b>      else</b>

<b>        status(&quot;Редактируется последняя версия заметки.&quot;);</b>

<b>      if (localStorage.lastModified &gt; localStorage.lastSaved) {</b>

<b>        save();</b>

<b>      }</b>

<b>      editor.disabled = false; // Разрешить доступ к редактору</b>

<b>      editor.focus();          // И поместить в него курсор ввода</b>

<b>    }</b>

<b>  }</b>

<b>  else { // В автономном режиме мы не можем синхронизироваться</b>

<b>    status(&quot;Невозможно синхронизироваться в автономном режиме&quot;);</b>

<b>    editor.disabled = false; editor.focus();</b>

<b>  }</b>

<b>}</b>

21

Работа с графикой и медиафайлами на стороне клиента

В этой главе рассказывается о том, как манипулировать изображениями, управлять аудио- и видеопотоками и рисовать графику. В разделе 21.1 описываются традиционные приемы реализации визуальных эффектов на языке JavaScript, таких как смена изображений, когда одно статическое изображение сменяется другим при наведении указателя мыши. В разделе 21.2 описываются элементы

<b>&lt;audio&gt;</b>
и
<b>&lt;video&gt;,</b>
определяемые стандартом HTML5, и их прикладные интерфейсы в языке JavaScript.

После первых двух разделов, посвященных работе с изображениями, аудио- и видеопотоками, будет рассказано о двух мощных технологиях рисования графических изображений на стороне клиента. Способность воспроизводить на стороне клиента сложные графические изображения имеет важное значение по нескольким причинам:

• Объем программного кода, создающего изображение на стороне клиента, обычно много меньше, чем объем самого изображения, что позволяет сберечь существенную долю полосы пропускания.

• Динамическое создание графических изображений потребляет существенные ресурсы центрального процессора. Переложив эту задачу на клиента, можно существенно снизить нагрузку на сервер и немного сэкономить на стоимости аппаратных средств для него.

• Создание графики на стороне клиента прекрасно согласуется с положениями современной архитектуры веб-приложений, в которой серверы поставляют данные, а клиенты управляют представлением этих данных.

В разделе 21.3 описывается Scalable Vector Graphics, или SVG. SVG - это язык разметки, основанный на языке XML, предназначенный для описания графических изображений. Изображения на языке SVG можно создавать и изменять в сценариях на языке JavaScript с использованием модели DOM. В заключение в разделе 21.4 мы познакомимся с элементом

<b>&lt;canvas&gt;,</b>
определяемым стандартом HTML5, и его обширным прикладным интерфейсом на языке JavaScript, обеспечивающим возможность создания графических изображений. Элемент <canvas> является революционной технологией, и он подробно описан в этом разделе.

21.1. Работа с готовыми изображениями

Готовые изображения могут включаться в веб-страницы с помощью тега

<b>&lt;img&gt;.</b>
Подобно любому HTML-элементу, элементом
<b>&lt;img&gt;</b>
можно управлять: присваивание нового URL-адреса свойству
<b>sгс</b>
заставляет броузер загрузить (если необходимо) и отобразить новое изображение. (Кроме того, можно изменять ширину и высоту изображения, заставляя броузер увеличивать или уменьшать его, но этот прием здесь не рассматривается.)

Возможность динамической замены одного изображения другим в HTML-документе открывает доступ к некоторым специальным эффектам. На практике чаще всего прием смены изображений привязывается к наведению указателя мыши на изображение. Когда изображение размещается внутри гиперссылки, смена изображения становится приглашением пользователю щелкнуть на изображении. (Аналогичный эффект можно получить с помощью псевдокласса CSS

<b>:hover</b>
, позволяющего изменять фоновое изображение элемента.) Следующий фрагмент разметки HTML выводит изображение, которое изменяется при наведении на него указателя мыши:

<b>&lt;img src=&quot;images/help.gif&quot;</b>

<b>  onmouseover=&quot;this.src='images/help_rollover.gif'&quot;</b>

<b>  onmouseout=&quot;this.src='images/help.gif'&quot;&gt;</b>

Обработчики событий в элементе

<b>&lt;img&gt;</b>
изменяют значение свойства
<b>src</b>
, когда указатель мыши наводится на изображение или покидает его границы. Эффект смены изображений отчетливо связывается с возможностью щелкнуть на изображении, поэтому такие элементы
<b>&lt;img&gt;</b>
следует заключать в элементы
<b>&lt;а&gt;</b>
или передавать обработчику события
<b>onclick</b>
.

Чтобы радовать глаз, эффект смены изображений (и родственные ему эффекты) должен иметь минимальное время отклика. Это означает, что необходим некоторый способ, гарантирующий предварительную загрузку всех необходимых изображений в кэш броузера. Для этой цели в клиентском JavaScript имеется специальный прикладной интерфейс: чтобы принудительно поместить изображение в кэш, нужно сначала создать объект

<b>Image</b>
с помощью конструктора
<b>Image().</b>
Затем, записав в свойство
<b>src</b>
требуемый URL-адрес, загрузить изображение. Это изображение не будет добавлено в документ, поэтому, хотя изображение будет невидимо, броузер загрузит его и поместит в свой кэш. Позднее, когда тот же URL-адрес будет использоваться для изменения изображения, находящегося на экране, изображение быстро загрузится из кэша броузера.

Приведенный выше фрагмент разметки, воспроизводящий эффект смены изображений, не выполняет предварительную загрузку изображений, поэтому пользователь может заметить задержку при смене изображения, когда первый раз наведет на него указатель мыши. Чтобы исправить ситуацию, необходимо немного изменить разметку:

<b>&lt;script&gt;(new Image()).src = &quot;images/help_rollover.gif&quot;;&lt;/script&gt;</b>

<b>&lt;img src=&quot;images/help.gif&quot;</b>