<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> // отличное от "complete", значит, документ пока не готов</b><b> if (e.type==="readystatechange" && document.readyState !== "complete") return;</b><b> // Вызвать все зарегистрированные функции.</b><b> // Обратите внимание, что здесь каждый раз проверяется значение</b><b> // свойства funcs.length, на случай если одна из вызванных функций</b><b> // зарегистрирует дополнительные функции.</b><b> for(var і = 0; і < 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("DOMContentLoaded", handler, false);</b><b> document.addEventListener("readystatechange", handler, false);</b><b> window.addEventListener("load", handler, false);</b><b> }</b><b> else if (document.attachEvent) {</b><b> document.attachEvent("onreadystatechange", handler);</b><b> window.attachEvent("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* и предотвратить появление контекстного меню, но некоторые броузеры имеют параметры настройки, которые делают это событие неотменяемым.

Объект, передаваемый обработчикам событий от мыши, имеет свойства
<b>clientX</b><b>clientY</b>Свойства
<b>altKey, ctrlKey, metaKey</b><b>shiftKey</b><b>Shift</b>Свойство
<b>button</b><b>Event</b>Объект события, передаваемый вместе с событием мыши, имеет еще пять характерных свойств, но они используются значительно реже, чем вышеперечисленные. Полный их перечень вы найдете в справочной статье Event в четвертой части книги.
В примере 17.2 демонстрируется функция
<b>drag(),</b>