<b>* вызываются при первом же событии DOMContentLoaded, readystatechange или load.</b>

<b>* Как только документ станет готов и будут вызваны все функции,</b>

<b>* whenReady() немедленно вызовет все функции, которые были ей переданы.</b>

<b>*/</b>

<b>var whenReady = (function() { // Эта функция возвращается функцией whenReady()</b>

<b>  var funcs = []; // Функции, которые должны вызываться по событию</b>

<b>  var ready = false; // Получит значение true при вызове функции handler</b>

<b>  // Обработчик событий, который вызывается, как только документ</b>

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

<b>  function handler(e) {</b>

<b>    // Если обработчик уже вызывался, просто вернуть управление</b>

<b>    if (ready) return;</b>

<b>    // Если это событие readystatechange и состояние получило значение,</b>

<b>    // отличное от &quot;complete&quot;, значит, документ пока не готов</b>

<b>    if (e.type===&quot;readystatechange&quot; &amp;&amp; document.readyState !== &quot;complete&quot;) return;</b>

<b>    // Вызвать все зарегистрированные функции.</b>

<b>    // Обратите внимание, что здесь каждый раз проверяется значение</b>

<b>    // свойства funcs.length, на случай если одна из вызванных функций</b>

<b>    // зарегистрирует дополнительные функции.</b>

<b>    for(var і = 0; і &lt; funcs.length; i++) funcs[і].call(document);</b>

<b>    // Теперь можно установить флаг ready в значение true и забыть</b>

<b>    // о зарегистрированных функциях </b>

<b>    ready = true;</b>

<b>    funcs = null;</b>

<b>  }</b>

<b>  // Зарегистрировать обработчик handler для всех ожидаемых событий</b>

<b>  if (document.addEventListener) {</b>

<b>    document.addEventListener(&quot;DOMContentLoaded&quot;, handler, false);</b>

<b>    document.addEventListener(&quot;readystatechange&quot;, handler, false);</b>

<b>    window.addEventListener(&quot;load&quot;, handler, false);</b>

<b>  }</b>

<b>  else if (document.attachEvent) {</b>

<b>    document.attachEvent(&quot;onreadystatechange&quot;, handler);</b>

<b>    window.attachEvent(&quot;onload”, handler);</b>

<b>  }</b>

<b>  // Вернуть функцию whenReady</b>

<b>  return function whenReady(f) {</b>

<b>    if (ready)</b>

<b>      f.call(document); // Вызвать функцию, если документ готов </b>

<b>    else</b>

<b>     funcs.push(f); // Иначе добавить ее в очередь,</b>

<b>  } // чтобы вызвать позже.</b>

<b>}());</b>

17.5. События мыши

С мышью связано довольно много событий. Все они перечислены в табл. 17.1. Все события мыши, кроме «mouseenter* и «mouseleave», всплывают. Для событий «click», возникающих в ссылках и кнопках отправки форм, предусматриваются действия по умолчанию, которые можно отменить. Теоретически имеется возможность отменить событие «contextmenu* и предотвратить появление контекстного меню, но некоторые броузеры имеют параметры настройки, которые делают это событие неотменяемым.

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

Объект, передаваемый обработчикам событий от мыши, имеет свойства

<b>clientX</b>
и
<b>clientY</b>
, определяющие координаты указателя относительно окна. Чтобы преобразовать их в координаты документа, к ним необходимо добавить позиции полос прокрутки окна (как показано в примере 15.8).

Свойства

<b>altKey, ctrlKey, metaKey</b>
и
<b>shiftKey</b>
определяют состояния различных клавиш-модификаторов, которые могли удерживаться в нажатом состоянии в момент события: с их помощью можно отличать простой щелчок от щелчка с нажатой клавишей
<b>Shift</b>
, например.

Свойство

<b>button</b>
определяет, какая кнопка мыши удерживалась в нажатом состоянии в момент события. Однако разные броузеры записывают в это свойство разные значения, поэтому его сложно использовать переносимым способом. Подробности смотрите в справочной статье
<b>Event</b>
в четвертой части книги. Некоторые броузеры возбуждают событие «click» только в случае щелчка левой кнопкой. Поэтому, если потребуется обрабатывать щелчки другими кнопками, следует использовать события «mousedown» и «mouseup». Событие «contextmenu» обычно сигнализирует о том, что был выполнен щелчок правой кнопкой, но, как отмечалось выше, в обработчиках этого события не всегда бывает возможным предотвратить появление контекстного меню.

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

В примере 17.2 демонстрируется функция

<b>drag(),</b>
которая при вызове из обработчика события «mousedown» позволяет пользователю буксировать мышью абсолютно позиционированные элементы документа. Функция drag() работает с обеими моделями событий, DOM и IE.