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

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

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

21.1.1. Ненавязчивая реализация смены изображений

Только что продемонстрированный фрагмент содержит один элемент

<b>&lt;script&gt;</b>
и два атрибута обработчиков событий с JavaScript-кодом для реализации единственного эффекта смены изображений. Это прекрасный пример навязчивого Java-Script-кода: объем программного кода достаточно велик, чтобы осложнить чтение разметки HTML. В примере 21.1 приводится ненавязчивая альтернатива, позволяющая выполнять смену изображений простым добавлением атрибута
<b>data-rollover</b>
(раздел 15.4.3) к любому элементу
<b>&lt;img&gt;.</b>
Обратите внимание, что в этом примере используется функция
<b>onLoad()</b>
из примера 13.5. В нем также используется массив
<b>document.images[]</b>
(раздел 15.2.3), в котором хранятся ссылки на все элементы
<b>&lt;img&gt;</b>
в документе.

Пример 21.1. Ненавязчивая реализация эффекта смены изображений

<b>/**</b>

<b>* rollover.js: Ненавязчивая реализация эффекта смены изображений.</b>

<b>*</b>

<b>* Для создания эффекта смены изображений подключите этот модуль к своему HTML-файлу</b>

<b>* и используйте атрибут data-rollover в элементах &lt;img&gt;, чтобы определить URL-адрес</b>

<b>* сменного изображения. Например:</b>

<b>*</b>

<b>* &lt;img src=&quot;normal_image.png&quot; data-rollover=&quot;rollover_image.png&quot;&gt;</b>

<b>*</b>

<b>* Обратите внимание, что для работы этого модуля необходимо подключить onLoad.js </b>

<b>*/</b>

<b>onLoad(function() { // Все в одной анонимной функции: не определяет имен </b>

<b>                    // Цикл по всем изображениям, отыскивает атрибут data-rollover</b>

<b>  for(var і = 0; і &lt; document.images.length; i++) { </b>

<b>    var img = document.images[i];</b>

<b>    var rollover = img.getAttribute(&quot;data-rollover&quot;);</b>

<b>    if (!rollover) continue; // Пропустить изображения без data-rollover</b>

<b>    // Обеспечить загрузку сменного изображения в кэш </b>

<b>    (new Image()).src = rollover;</b>

<b>    // Определить атрибут для сохранения URL-адреса</b>

<b>    // изображения по умолчанию</b>

<b>    img.setAttribute(&quot;data-rollout&quot;, img.src);</b>

<b>    // Зарегистрировать обработчики событий,</b>

<b>    // создающие эффект смены изображений </b>

<b>    img.onmouseover = function() {</b>

<b>      this.src = this.getAttribute(&quot;data-rollover&quot;);</b>

<b>    };</b>

<b>    img.onmouseout = function() {</b>

<b>      this.src = this.getAttribute(&quot;data-rollout&quot;);</b>

<b>    };</b>

<b>  }</b>

<b>});</b>

21.2. Работа с аудио- и видеопотоками

Стандарт HTML5 определяет новые элементы

<b>&lt;audio&gt;</b>
и
<b>&lt;video&gt;,</b>
которые теоретически так же просты в использовании, как элемент
<b>&lt;img&gt;</b>
. В броузерах с поддержкой стандарта HTML5 больше не нужно использовать дополнительные расширения (такие как Flash), чтобы внедрить в свои HTML-документы аудио- и видеоклипы:

<b>&lt;audio src=&quot;background_music.mp3&quot;/&gt;</b>

<b>&lt;video src=&quot;news.mov&quot; width=320 height=240/&gt;</b>

Однако на практике работать с этими элементами несколько сложнее, чем было показано выше. Производители броузеров не смогли прийти к соглашению о стандарте на аудио- и видеокодеки, которые поддерживались бы всеми броузерами, вследствие чего обычно приходится использовать элементы

<b>&lt;source&gt;,</b>
чтобы указать несколько источников мультимедийных данных в различных форматах:

<b>&lt;audio id=&quot;music&quot;&gt;</b>

<b>  &lt;source src=&quot;music.mp3&quot; type=&quot;audio/mpeg&quot;&gt;</b>

<b>  &lt;source src=&quot;music.ogg&quot; type='audio/ogg; codec=&quot;vorbis&quot;&gt;</b>

<b>&lt;/audio&gt;</b>

Обратите внимание, что элементы

<b>&lt;source&gt;</b>
не имеют содержимого: они не имеют закрывающего тега </source>, и от вас не требуется завершать их последовательностью символов
<b>/&gt;</b>
.

Броузеры, поддерживающие элементы

<b>&lt;audio&gt;</b>
и
<b>&lt;video&gt;,</b>
не будут отображать их содержимое. Тогда как броузеры, не поддерживающие их, отобразят это содержимое. Чтобы решить эту проблему, можно вставить внутрь содержимое для обратной совместимости (например, элемент
<b>&lt;object&gt;,</b>
который вызывает расширение Flash):