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

<b>function addStyles(styles) {</b>

<b>  // Сначала необходимо создать новую таблицу стилей </b>

<b>  var styleElt, styleSheet;</b>

<b>  if (document.createStyleSheet) { //Если определен IE API, использовать его</b>

<b>    styleSheet = document.createStyleSheet();</b>

<b>  }</b>

<b>  else {</b>

<b>    var head = document.getElementsByTagName(&quot;head&quot;)[0]</b>

<b>    styleElt = document.createElement(&quot;style&quot;); // Новый элемент &lt;style&gt;</b>

<b>    head.appendChild(styleElt); // Вставить в &lt;head&gt;</b>

<b>    // Теперь новая таблица находится в конце массива</b>

<b>    styleSheet = document.styleSheets[document.styleSheets.length-1]</b>

<b>  }</b>

<b>  // Вставить стили в таблицу</b>

<b>  if (typeof styles === &quot;string&quot;) {</b>

<b>    // Аргумент содержит текстовое определение таблицы стилей</b>

<b>    if (styleElt)</b>

<b>      styleElt.innerHTML = styles;</b>

<b>    else</b>

<b>      styleSheet.cssText = styles; // IE API</b>

<b>  }</b>

<b>  else {</b>

<b>    // Аргумент - объект с правилами для вставки</b>

<b>    var і = 0;</b>

<b>    for(selector in styles) {</b>

<b>      if (styleSheet.insertRule) {</b>

<b>        var rule = selector + {&quot; + styles[selector] + &quot;}&quot;;</b>

<b>        styleSheet.insertRule(rule, i++);</b>

<b>      }</b>

<b>      else {</b>

<b>        styleSheet.addRule(selector, styles[selector], i++);</b>

<b>      }</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

17

Обработка событий

Клиентские программы на языке JavaScript основаны на модели программирования, когда выполнение программы управляется событиями (представленной в разделе 13.3.2). При таком стиле программирования веб-броузер генерирует событие, когда с документом или некоторым его элементом что-то происходит. Например, веб-броузер генерирует событие, когда завершает загрузку документа, когда пользователь наводит указатель мыши на гиперссылку или нажимает клавишу на клавиатуре. Если JavaScript-приложение интересует определенный тип события для определенного элемента документа, оно может зарегистрировать одну или более функций, которая будет вызываться при возникновении этого события. Имейте в виду, что это не является уникальной особенностью веб-программирования: все приложения с графическим интерфейсом пользователя действуют именно таким образом - они постоянно ожидают, пока что-то произойдет (т. е. ждут появления событий), и откликаются на происходящее.

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

Тип события - это строка, определяющая тип происшествия. Тип «mousemove», например, означает, что пользователь переместил указатель мыши. Тип «keydown» означает, что была нажата клавиша на клавиатуре. А тип «load» означает, что завершилась загрузка документа (или какого-то другого ресурса) из сети. Поскольку тип события - это просто строка, его иногда называют именем события. И действительно, мы будем использовать эти имена для идентификации типов событий, о которых будет идти речь. Современные веб-броузеры поддерживают множество типов событий, краткий обзор которых приводится в разделе 17.1.

Цель события - это объект, в котором возникло событие или с которым это событие связано. Когда говорят о событии, обычно упоминают тип и цель события.

Например: событие «load» объекта

<b>Window</b>
или событие «click» элемента
<b>&lt;button&gt;.</b>
Самыми типичными целями событий в клиентских приложениях на языке JavaScript являются объекты
<b>Window, Document</b>
и
<b>Element</b>
, но некоторые типы событий могут происходить и в других типах объектов. Например, в главе 18 мы познакомимся с событием «readystatechange», которое возбуждается объектом
<b>XMLHttpRequest</b>
.

Обработчик события, или приемник события, - это функция, которая обрабатывает, или откликается на событие. [42]

Приложения должны зарегистрировать свои функции обработчиков событий в веб-броузере, указав тип события и цель. Когда в указанном целевом объекте возникнет событие указанного типа, броузер вызовет обработчик. Когда обработчики событий вызываются для какого-то объекта, мы иногда говорим, что броузер «возбудил», «сгенерировал» или «доставил» событие. Существует несколько способов регистрации обработчиков событий, описание которых приводятся в разделах 17.2 и 17.3.

Объект события - это объект, связанный с определенным событием и содержащий информацию об этом событии. Объекты событий передаются функции обработчика события в виде аргумента (кроме IE8 и более ранних версий, где объект события доступен только в виде глобальной переменной

<b>event</b>
). Все объекты событий имеют свойство type, определяющее тип события, и свойство
<b>target</b>
, определяющее цель события. (В IE8 в более ранних версиях вместо свойства
<b>target</b>
следует использовать свойство
<b>srcElement</b>
.) Для каждого типа события в связанном объекте события определяется набор свойств. Например, объект, связанный с событиями от мыши, включает координаты указателя мыши, а объект, связанный с событиями от клавиатуры, содержит информацию о нажатой клавише и о нажатых клавишах-модификаторах. Для многих типов событий определяются только стандартные свойства, такие как
<b>type</b>
и
<b>target</b>
, и не передается никакой дополнительной полезной информации. Для таких типов событий важно само наличие происшествия события, и никакая другая информация не имеет значения. В этой главе нет отдельного раздела, посвященного объекту
<b>Event</b>
. Вместо этого здесь описываются свойства объектов событий для событий определенных типов. Дополнительные сведения об объектах событий вы найдете в справочной статье
<b>Event</b>
в четвертой части книги. [43]