События (events) представляют собой извещения, которые генерируются в результате действий пользователя или изменения состояния документа или окна. Динамический HTML предоставляет набор событий, позволяющих Web-мастеру определять реакцию на большую часть взаимодействий между пользователем и документом. Определяя реакцию на события, автор может создавать полностью интерактивные страницы.
В данной главе будут рассмотрены методы обработки событий. Глава заканчивается демонстрацией приложения, которое объединяет элементы встроенной поддержки динамического HTML с возможностями указателей функций JavaScript для создания механизма связывания событий.
В главе рассмотрены следующие темы:
Общая модель событий. Динамический HTML предоставляет мощную модель событий, которая тесно связана с основной структурой документа. Понимание модели и использование ее преимуществ позволит вам создавать эффективные и поддерживаемые программные продукты. Модель событий динамического HTML основана на двух новых мощных элементах, служащих для управления поведением документа: "всплывание" событий (event bubbling) и действия по умолчанию (default actions).
Всплывание событий является элементом модели событий, который обеспечивает просмотр структурной иерархии документа при обработке извещений событий. На любое событие может быть получена реакция от всех родительских элементов в иерархии контейнеров, а также от элемента, в котором возникло событие. Другими словами, каждое действие, происходящее в элементе, его родительском элементе и так далее вплоть до тела документа, и в конце концов - самого документа, получает извещение события. Событие может быть обработано на любом уровне, что позволяет создавать компактные настраиваемые программы.
Действия по умолчанию обеспечивают встроенную в браузеры обработку события. Многие события позволяют заменять действия по умолчанию на индивидуальную обработку или добавлять дополнительные процедуры обработки.
Понимание модели событий совершенно необходимо для правильного использования мощи динамического HTML с целью создания интерактивных документов. В данном разделе представлена архитектура событий. В последующих главах будут подробно рассмотрены методы и операции.
Связывание событий. Связывание событий (event binding) является созданием связи сценария с событием в документе или окне, или с событием в элементе данного документа. В данном разделе обсуждаются различные доступные в динамическом HTML методы для связывания сценариев с событиями.
Объект event. Объект event представляет информацию, связанную с событием в сценарии. Объект event представляет собой независимый от языка механизм для передачи параметров и для управления различными аспектами модели событий. Например, для события мыши, информация о текущем положении мыши и состоянии кнопки представлена свойствами объекта event.
Программирование стандартных пользовательских событий. Стандартные пользовательские события включают в себя события мыши, клавиатуры, фокуса и события помощи, которые доступны почти в каждом элементе документа. В данном разделе вводятся взаимоотношения между данными событиями и объектом event. Дополнительные события, которые поддерживаются соответствующими элементами и объектами, обсуждаются на протяжении всей книги вместе с их объектами.
Примеры событий. Глава завершается двумя примерами связывания событий. Первый пример называется Event Tutor (Изучение событий), который может быть использован для изучения модели событий. В данном примере события в документе можно отслеживать индивидуально или как группу. Второй пример, Event Broadcaster (Транслятор событий), является мощной демонстрацией работы указателей функций и событий JavaScript. В этом примере вы узнаете о том, как разработать индивидуальный механизм связывания событий, который позволяет легко связывать многочисленные функции с одним событием.
При взаимодействии пользователя со страницей или во время изменения состояния документа происходят события. Пользователь генерирует события при передвижении мыши, нажатии кнопок мыши или вводе с клавиатуры текста в документе. Изменения состояния документа, которые могут вызвать генерацию событий, включают в себя загрузку документа, изображений или объектов, появление ошибки на странице и переход фокуса от одного элемента к другому.
HTML-документы представляют собой структурированные документы с определенной иерархией контейнеров. Всплывание событий представляет собой родовое свойство всех действий, которые перемещаются по данной структурной иерархии. После возникновения событие сначала появляется в исходном элементе, затем в родительском элементе источника события и продолжает возникать в родительских элементах до тех пор, пока не дойдет до элемента документа.
Всплывание событий отсутствовало в ранних версиях объектной модели HTML, поскольку тогда оно не требовалось. В прошлом разработчики браузеров рассматривали лишь несколько элементов, которые могли генерировать события. В динамическом HTML все элементы генерируют события. Это значит, что теперь все элементы на странице - каждый тег P, H1 и так далее - не только могут, но и генерируют события. Переход к генерации событий всеми элементами мог бы сильно усложнить сценарии. Но с появлением всплывания событий сценарии стали более мощными и их стало проще писать.
В приведенном ниже коде тело документа, ссылка и изображение имеют связанные с ними события:
<HTML> <HEAD> <TITLE>Иди домой!</TITLE> </HEAD> <BODY> <A HREF="home.htm"><IMG SRC="home.gif">Иди домой</A> </BODY> </HTML>
Без всплывания событий код обработчика событий для всех событий нажатия кнопки, которые происходят на ссылке, был бы очень сложным. Данный обработчик событий требовалось бы написать дважды: один раз для изображения и второй раз для ссылки. Такая избыточность была бы необходима, поскольку если пользователь щелкает мышью по изображению, то изображение получает событие, и если пользователь щелкает по тексту ниже изображения, то ссылка получает событие. Применение всплывания событий решает данную проблему. При использовании всплывания событий нажатие кнопки мыши сначала на изображении приводит к генерации события для изображения. Затем автоматически событие генерируется для ссылки. После чего событие возникает в теле документа и, наконец, в самом документе. Всплывание событий позволяет обрабатывать событие на каждом уровне иерархии контейнеров. В приведенном выше примере кода один обработчик событий нажатий кнопки на ссылке будет также обрабатывать щелчки мышью по изображению.
Помимо всплывания событий многие события имеют действия по умолчанию. Действие по умолчанию является действием, которое браузер выполняет в ответ на событие. Например, действием по умолчанию в ответ на нажатие ссылки <А HREF= "... "> является переход по указанному адресу и загрузка страницы.
В объектной модели динамического HTML можно заменять существующие действия по умолчанию на индивидуальную модель поведения. Если событие не имеет действия по умолчанию и создается индивидуальная модель поведения, то рекомендуется отменить возможное действие по умолчанию. Это гарантирует правильное выполнение программы, если действие по умолчанию будет позднее поддерживаться браузером.
Действие по умолчанию не всегда определяется источником события - оно может определяться родительским элементом. В приведенном выше примере, когда пользователь нажимает кнопку мыши на изображении, действие по умолчанию по переходу к указанной ссылке определяется элементом Anchor (ссылка), который содержит изображение. Однако если изображение отменяет действие по умолчанию для события, то действие по умолчанию для данной ссылки больше не будет действовать, поскольку действие по умолчанию может быть отменено любым элементом в цепочке событий. После того как обработчик событий устанавливает отмену действия по умолчанию, оно отменяется для всей цепочки событий.
Всплывание событий и действия по умолчанию представляют собой различные концепции, которыми можно управлять независимо. Например, если изображение останавливает событие в момент всплывания к ссылке, но не отменяет действие по умолчанию, то действие по умолчанию для ссылки будет применено к событию и будет осуществлен переход по ссылке. Обратное также справедливо: если ни ссылка, ни изображение не отменят действие по умолчанию, но действие по умолчанию отменяется, когда событие достигает элемента Body, то переход по ссылке не будет осуществлен. Свойства для отмены действия по умолчанию или остановке всплывания события описаны в разделе "Объект event" ниже в данной главе.
Связывание событий представляет собой создание связи между определенным событием и сценарием. Динамический HTML поддерживает ряд независимых от языка методов по связыванию сценариев с событиями. Кроме того, процессоры сценариев сами по себе могут использовать другие индивидуальные способы поддержки связывания событий.
Независимые от языка механизмы связывают события посредством атрибутов элемента Script, посредством специальных атрибутов HTML, связанных непосредственно с определенным элементом или посредством объектной модели. VBScript также предлагает механизм связывания в стиле Visual Basic, который включает в себя установку имен подпроцедур обработчика определенным способом.
В динамическом HTML все элементы документа были изменены для поддержки событий клавиатуры и мыши. Данные события представлены как атрибуты непосредственно для каждого элемента, что позволяет устанавливать прямую связь между элементом и его поведением. Данная связь сходна со связью между элементом и встроенным стилем при использовании атрибута STYLE. Например, можно связать событие onclick (нажатие кнопки) с функцией с помощью атрибута, как показано в приведенном ниже примере:
<!-- Когда пользователь щелкает по кнопке мыши, вызывается функция foo(). --> <INPUT TYPE=BUTTON VALUE="Нажмите здесь" ONCLICK="foo();" LANGUAGE="JavaScript">
Атрибут ONCLICK может вызвать функцию или немедленно выполнить одну или большее число строк кода. В данном примере, когда пользователь нажимает кнопку мыши, вызывается процедура foo. Атрибут LANGUAGE определяет язык, на котором написана программа. Пропуск атрибута LANGUAGE устанавливает по умолчанию язык, указанный на первой странице или JavaScript в отсутствие других сценариев. Приведенный ниже пример демонстрирует две встроенных инструкции, которые выполняются при нажатии пользователем кнопки:
<!-- При нажатии кнопки мыши отображать сообщение и затем вызвать функцию foo(). --> <INPUT TYPE=BUTTON VALUE="Нажмите здесь" ONCLICK="alert('Пользователь нажал здесь.'); foo();" LANGUAGE="JavaScript">
Кнопка сначала выводит окно сообщения, а затем вызывает функцию foo.
Все атрибуты HTML являются нечувствительными к регистру, регистр символов не имеет значения при использовании атрибутов, например ONCLICK, для связывания обработчиков с событиями. Чувствительность к регистру может быть важна, когда используются другие механизмы связывания событий. Связывание событий с атрибутами HTML удобно, но имеет ряд недостатков. Первый недостаток заключается в том, что требуется расширять язык HTML каждый раз при изобретении нового события. Например, в приведенном выше примере событие onclick подразумевает расширение определения типа документа (DTD, document type definition) за счет включения в тег <INPUT> атрибута ONCLICK. Это усложняет добавление событий стандартным способом, поскольку HTML развивается медленно. Более того, объекты или приложения, которые генерируют произвольные события, также требуют расширения языка или представления их собственных методов связывания событий. Поэтому данный подход используется только для небольшого набора встроенных событий. Если в страницу внедрен произвольный объект, то его события представлены более общим способом.
Второй механизм связывания лишен указанных выше недостатков. Данный механизм использует новые расширения элемента Script - атрибуты FOR и EVENT - для связывания функций с событиями. Атрибут EVENT ссылается на событие и все параметры, которые ему могут быть переданы. Атрибут FOR указывает имя или идентификатор (ID) элемента, для которого написано событие. Например, событие onmousemove представлено в документе. Вы можете использовать тег <SCRIPT> для связывания с данным событием:
<SCRIPT FOR="document" EVENT="onmousemove()" LANGUAGE="JavaScript"> // Данный обработчик событий вызывается, когда указатель мыши // перемещается по документу. </SCRIPT>
Примечание: JavaScript является чувствительным к регистру для обоих значений атрибутов EVENT и FOR тега <SCRIPT>. Следует убедиться, что все имена событий набраны в нижнем регистре для встроенных событий и в соответствующем регистре для внедренных объектов. Кроме того, если вы определяете идентификатор (ID) в атрибуте FOR, вы должны набрать их в точном соответствии с тем, как они набраны в атрибуте ID самого элемента. Если событие не возникает, то всегда проверяйте правильность ввода символов и регистра в теге <SCRIPT>.
Следует принять к сведению следующее предостережение относительно приведенного выше синтаксиса. Netscape Navigator игнорирует атрибуты FOR и EVENT и попытается выполнять программу немедленно. В приведенном ниже коде используется прием для обхода данного ограничения:
<SCRIPT LANGUAGE="JavaScript"> // Предположим, что браузер поддерживает атрибут FOR. var ForSupport = true; </SCRIPT> <SCRIPT FOR="fakeObject" EVENT="foo" LANGUAGE="JavaScript"> // Данное событие не существует. // Если атрибуты FOR и EVENT поддерживаются, то данный код не будет // выполняться. ForSupport = false; </SCRIPT> <SCRIPT FOR="document" EVENT="onmousemove" LANGUAGE="JavaScript"> if (ForSupport) { // Код действительного обработчика событий. } else alert("Ваш браузер не поддерживает необходимый синтаксис события."); </SCRIPT>
Для того чтобы гарантировать, что код сценария не будет выполняться, следует указать, что используется язык JScript. JScript представляет собой реализацию JavaScript компании Microsoft. Поскольку Microsoft Internet Explorer является единственным браузером, который поддерживает JScript, в сценарии не требуется инструкция if, которая должна быть проигнорирована Netscape.
<SCRIPT FOR="document" EVENT="onmousemove()" LANGUAGE="JScript"> // Данный обработчик событий вызывается, когда указатель мыши перемещается // по документу, если браузер поддерживает ядро языка JScript. </SCRIPT>
Примечание: При указании имени события скобки необязательны. Например, приведенное выше событие может быть определено как EVENT= "onmousemove".
Помимо обсуждавшихся выше методов язык VBScript также поддерживает механизм связывания сценариев с событиями в стиле Visual Basic. Visual Basic традиционно связывает код с событием с помощью специальной процедуры. Если процедура написана в формате Visual Basic, то ядро Visual Basic знает, какие события должны быть связаны со сценарием. Например, приведенный ниже код связывает событие onmousemove с событием onclick в документе:
<SCRIPT LANGUAGE="VBScript"> Sub document_onMouseMove() 'Обработчик событий для перемещения указателя мыши по документу. End Sub Sub document_onClick() ' Обработчик событий для нажатий кнопки мыши в документе. End Sub </SCRIPT>
Примечание: Microsoft Internet Explorer 3.0 также поддерживает приведенный выше синтаксис в JScript, но данный синтаксис не поддерживается в Netscape Navigator или Internet Explorer 4.0. Поэтому данный метод не следует использовать с JScript.
В VBScript преимущество использования данной модели заключается в том, что могут быть написаны многочисленные обработчики событий внутри одного блока сценария. Главный недостаток заключается в том, что внешние инструменты не могут просто определить события, которые были написаны для них обработчиками событий. Использование синтаксиса атрибутов FOR и EVENT элемента Script или синтаксиса атрибута встроенных событий HTML дает возможность быстро сканировать документ и определять события, с которыми связан код. Модель связывания в стиле Visual Basic будет распознана только специально написанным инструментом.
Можно установить связь с одним событием в нескольких языках. В данном случае событие будет возникать во всех языках, но последовательность возникновения события будет неопределенной. В целом результаты использования данного метода непредсказуемы.
Вы можете определить различные языки для каждого встроенного атрибута события HTML. Атрибут LANGUAGE, который используется со встроенными атрибутами событий HTML, определяет язык по умолчанию для интерпретации кода. Для изменения установленного по умолчанию языка следует указать необходимое значение идентификатора языка в атрибуте события. Формат данного идентификатора приведен ниже:
<Element EventName="Language:Code">
Идентификатор Language представляет собой независимую от регистра строку, которая определяет язык написания сценариев для программы Code. Internet Explorer 4.0 поддерживает следующие языки: JScript, JavaScript, JavaScript 1.1 и VBScript. Языки JScript, JavaScript и JavaScript 1.1 запускают одно ядро языка. Обработчики onclick и omnousedown в приведенном ниже теге <BODY> определены в различных языках написания сценариев:
<BODY ONCLICK="JavaScript:dothis(this);" ONMOUSEDOWN="VBScript:dothat(me)">
Netscape Navigator не поддерживает указанные языки для значения атрибута события. Netscape Navigator и Internet Explorer поддерживают указанные языки для атрибута HREF ссылок, что позволяет создать код JavaScript или VBScript, который будет выполняться при щелчке по ссылке. Однако Netscape Navigator распознает только JavaScript и попытается перейти на недействительную страницу, если указаны другие языки.
Все события также представлены как свойства в объектной модели динамического HTML. Все имена свойств вводятся в нижнем регистре и начинаются с префикса on. Цель представления данных событий и свойств событий заключается в активизации событий для динамического связывания с функциями во время выполнения. Для всех свойств событий может быть назначен указатель функции.
Поддержка указателей функций зависит от языка программирования. JavaScript поддерживает указатели функций, но VBScript не поддерживает данные указатели. Поэтому VBScript не может динамически генерировать обработчиков событий. (Однако вы можете использовать код VBScript для назначения функции JavaScript событию). При возникновении события вызывается функция, указанная в свойстве.
<HTML> <HEAD> <TITLE>Пример указателя функции</TITLE> </HEAD> <BODY> <INPUT TYPE=BUTTON ID="myButton" VALUE="Click here"> <SCRIPT LANGUAGE="JavaScript"> // Присоединение указателя функции к myButton. // При нажатии кнопки myButton отображается окно сообщения. document.all.myButton.onclick = new Function("alert('Hello');"); </SCRIPT> </BODY> </HTML>
Для назначения указателя функции укажите имя функции прямо в свойстве.
<HTML> <HEAD> <TITLE>Назначение указателя функции</TITLE> <SCRIPT LANGUAGE="JavaScript"> // Определение функции clicked. function clicked() { alert("Clicked"); } </SCRIPT> </HEAD> <BODY> <INPUT TYPE=BUTTON ID="myButton" VALUE="Click here"> <SCRIPT LANGUAGE="JavaScript"> // Назначение функции clicked обработчику события onclick. document.all.myButton.onclick = clicked; </SCRIPT> </BODY> </HTML>
Примечание: При назначении указателя функции используйте только имя функции. Круглые скобки и дополнительные параметры не требуются. Если они будут указаны, то функция будет выполнена. В результате чего свойству будет назначено возвращаемое функцией значение, вместо указателя на функцию.
Последовательность, в которой обработчики событий связываются с элементами, определяется языком написания сценария. JavaScript подключает события асинхронно по мере загрузки страницы. Каждый элемент Script и атрибут события подключаются по мере анализа документа. VBScript не связывает события до тех пор, пока вся страница не будет проанализирована, все внешние сценарии загружены и внедренные объекты не начнут загружаться.
Для JavaScript это значит, что события начнут происходить в ответ на действия пользователя или другие действия до того, как страница будет целиком загружена. Поэтому следует позаботиться о том, чтобы обработчики событий не пытались обратиться к элементам, которые могут быть еще не загружены.
Можно написать программу, которая сначала проверяет наличие элемента или, более обобщенно, просто проверяет, что страница целиком проанализирована. Проверка того, что страница целиком проанализирована, является простейшим методом и должна работать в различных языках написания сценариев и браузерах:
<HTML> <HEAD> <TITLE>Пример анализа</TITLE> <SCRIPT LANGUAGE="JavaScript"> function doClick() { if (isLoaded) { // Запуск обработчика событий. } else { alert("Пожалуйста, подождите пока документ не будет загружен."); } } </SCRIPT> </HEAD> <BODY> <INPUT TYPE=BUTTON ID="myInput" VALUE="Click here" ONCLICK="doClick()"> <SCRIPT LANGUAGE="JavaScript"> // Данный элемент будет последним элементом, который анализируется // в документе. isLoaded = true; </SCRIPT> </BODY> </HTML>
С помощью обработчика событий можно также проверить, была ли страница проанализирована целиком. Два события могут быть использованы для выполнения этой задачи: событие event в окне и событие onreadystatechange в документе. Событие onload возникает, когда документ целиком проанализирован и все элементы загружены. Более мощное событие onreadystatechange в документе, которое поддерживается только в Internet Explorer 4.0, возникает несколько раз по мере того, как документ проходит несколько состояний загрузки и возникает в последний раз, когда документ полностью загружен.
События onload и onreadystatechange подробно обсуждаются в главах 4 и 6.
Все обработчики событий ограничены элементом, с которым связан обработчик. Данный элемент представлен в языке написания сценариев JavaScript с помощью свойства this, а в VBScript с помощью свойства me.
Область действия события необязательно ограничена элементом, который первым сгенерировал событие. Элемент, который первым сгенерировал событие, представлен свойством srcElement в объекте event.
Объект event подробно обсуждается в разделе "Объект event" ниже в данной главе.
Управление указателем this
Приведенный ниже код демонстрирует три различных способа связывания обработчика с событием. Все три обработчика эквивалентны.
<INPUT NAME="myBtn" TYPE=BUTTON VALUE="My Button" onClick="alert(this.name);" LANGUAGE="JavaScript">
или
<SCRIPT FOR="myBtn" EVENT="onclick()" Language="JavaScript"> alert(this.name); </SCRIPT>
или
<SCRIPT LANGUAGE="JavaScript"> myBtn.onclick = new Function("alert(this.name)"); </SCRIPT>
В этих примерах элемент this.name возвращает значение элемента myBtn, поскольку ссылка на элемент дается прямо во встроенном коде или сценарии. Если требуется сослаться на элемент в процедуре, вызываемой обработчиком событий, то потребуется передать элемент в процедуру с помощью ключевого слова this. Например, приведенный ниже код отобразит пустую строку вместо текста myBtn, поскольку указатель this в функции foo ссылается на саму функцию, вместо элемента, который генерирует событие:
<SCRIPT LANGUAGE="JavaScript"> function foo() { // Указатель this не ссылается на кнопку. alert(this.name); } </SCRIPT> <INPUT TYPE=BUTTON NAME="myBtn" VALUE="My Button" ONCLICK="foo();" LANGUAGE="JavaScript">
Вместо этого вы должны передать ссылку на элемент myBtn в функцию foo, используя ключевое слово this:
<SCRIPT LANGUAGE="JavaScript"> function foo(b) { // Аргумент b ссылается на кнопку, поскольку она передается // обработчиком событий. alert(b.name); } </SCRIPT> <INPUT TYPE=BUTTON NAME="myBtn" VALUE="My Button" ONCLICK="foo(this);" LANGUAGE="JavaScript">
Указатель this также автоматически устанавливается, когда обработчик событий назначается в качестве указателя функции:
<H1 ID="myH1">Это заголовок.</H1> <SCRIPT LANGUAGE="JavaScript"> function clickHandler() { // Свойство thia указывает на элемент, с которым связан обработчик. alert(this.tagName) } // Указатель функции не должен передавать указатель this. document.all.myH1.onclick = clickHandler; </SCRIPT>
Имена во встроенном коде идентифицируются путем поиска членов объектной модели в следующем порядке:
Все свойства текущего элемента.
Все элементы представлены для пространства имен - например, в форме, элементы управления в форме.
Свойства элемента, содержащего пространство имен, - например, свойства формы для элементов внутри формы.
Свойства документа.
JavaScript поддерживает создание разделяемого обработчика событий. В JavaScript все элементы, которые совместно используют одно имя, могут также совместно использовать одинаковые обработчики событий с помощью атрибутов FOR и EVENT элемента Script:
<SCRIPT FOR="gender" EVENT="onclick()" LANGUAGE="JavaScript"> // Данный обработчик событий выполняется при нажатии любого элемента // с именем или идентификатором "ID". </SCRIPT> <INPUT TYPE=RADIO NAME="gender" VALUE="Male"> <INPUT TYPE=Radio NAME="gender" VALUE="Female">
Данный метод работает только в JavaScript. VBScript может запускать обработчика событий таким образом только на основе уникального идентификатора ID элемента, а не его имени NAME. Если бы данный код был переписан на VBScript, то потребовалось бы указать уникальные значения идентификаторов для кнопок-переключателей и написать отдельный обработчик событий для каждой кнопки.
Альтернативой VBScript, которая также работает для любого языка написания сценариев, является использование процедуры всплывания событий и отслеживание события, начиная с родительского контейнера:
<SCRIPT FOR="GenderGroup" EVENT="onclick()" LANGUAGE="VBScript"> ' Данный обработчик событий выполняется при нажатии любого элемента в ' блоке GenderGroup. If "gender" = window.event.srcElement.name Then ' Пользователь нажал кнопку-переключатель. End If </SCRIPT> <DIV ID="GenderGroup"> <INPUT TYPE=Radio NAME="gender" VALUE="Male"> <INPUT TYPE=Radio NAME="gender" VALUE="Female"> </DIV>
Многие события сами по себе не представляют интереса без дополнительной информации. Например, событие onmousedown бесполезно, если неизвестно, какая была нажата кнопка мыши и каково было положение указателя мыши в момент нажатия. События клавиатуры бесполезны, если неизвестно, какая была нажата клавиша.
Динамический HTML представляет независимый от языка механизм доступа к информации, связанной с событием, и управления всплыванием события и возникновением действия по умолчанию. Данная информация представлена посредством объекта event, который является свойством объекта window.
До возникновения события объект event инициализируется с учетом текущего состояния клавиатуры и мыши. Объект event предоставляет доступ к параметрам события и обеспечивает контроль всплывания событий и выполнения действий по умолчанию. Объект event всегда представляет как минимум набор перечисленных ниже свойств для идентификации элемента, который запустил последовательность событий, и для управления всплыванием событий и действием по умолчанию:
event.srcElement
event.cancelBubble
event.returnValue
Свойство srcElement возвращает элемент, который первым сгенерировал событие. Например, при нажатии изображения home.gif в примере HTML-страницы в начале данной главы изображение является свойством srcElement по мере того, как событие всплывает через ссылку, тело и документ.
Свойство cancelBubble используется для прекращения всплывания элемента в направлении вверх по иерархии. По умолчанию значение данного свойства равно false и событие всплывает. Установка значения true для данного свойства останавливает всплывание только текущего экземпляра события, но не препятствует всплыванию последующих событий.
Свойство returnValue используется преимущественно для отмены действия по умолчанию события. Не все события имеют действия по умолчанию. Однако если вы пишете код, который изменяет поведение события, то всегда отменяйте действие по умолчанию так, чтобы если действие по умолчанию будет добавлено к событию в будущем, то поведение страницы не изменилось. Для отмены действия по умолчанию для данного свойства должно быть установлено значение false.
Свойство returnValue наиболее часто используется для отмены действия по умолчанию события, но некоторые события используют свойство returnValue отличным способом. Это снова приводит к разделению всплывания событий и действий по умолчанию.
Примечание: JavaScript поддерживает возвращение значений непосредственно обработчику событий, используя ключевое слово return. Ключевое слово return обновляет свойство returnValue объекта event, когда обработчик событий возвращает управление браузеру.
Объект event устанавливается для каждой последовательности событий. Поэтому любые назначения объекта event применимы только к экземпляру последовательности событий. При следующем возникновении события объект event сбрасывается. Отмена действия по умолчанию, например, отменяет только действие по умолчанию для текущего события, а не для всех последующих событий. По этой причине к объекту event должен обращаться обработчик событий, а не код, который выполняется в ходе загрузки страницы.
Объект event представляет тип события посредством свойства type. Свойство type возвращает имя события в нижнем регистре без префикса on. Например, событие onmousedown возвращается как mousedown, событие onclick - как click и так далее. Зная тип события, один обработчик может различать и обрабатывать различные события:
function handleEvent() { // Запуск обычного обработчика событий. switch (event.type) { case "click": // Обработка события onclick. break; case "mousedown": // Обработка события onmousedown. break; } } // Присоединяет события к обработчику событий handleEvent. document.onclick = handleEvent; document.onmousedown = handleEvent;
Объект event представляет все параметры встроенных событий как свойства. Например, информация о текущем положении указателя мыши доступна для всех событий. Некоторая информация доступна только для определенного события. События мыши также обеспечивают доступ к текущему состоянию кнопок мыши. Данные параметры инициализируются и обновляются до генерации события. Приведенный ниже пример иллюстрирует процедуру доступа к параметрам события:
<SCRIPT FOR="document" EVENT="onmousedown()" LANGUAGE="JavaScript"> // Вывод состояния кнопки мыши при ее нажатии. alert("x:" + event.clientX); alert("y:" + event.clientY); alert("button:" + event.button); alert("Source Element:" + event.srcElement.tagName); </SCRIPT>
Объект event представляет свойства, которые определяют положение указателя мыши на основе различных систем координат. Свойства событий мыши перечислены в табл. 3.1.
Таблица 3.1. Свойства событий мыши
|
|
Свойство | Описание |
|
|
clientX, clientY | Горизонтальные и вертикальные координаты указателя мыши относительно клиентской области окна |
offsetX, offsetY | Горизонтальные и вертикальные координаты указателя мыши относительно контекста воспроизведения |
screenX, screenY | Горизонтальные и вертикальные координаты указателя мыши относительно экрана |
|
|
|
Параметр | Значение |
|
|
button | Набор значений, соответствующих нажатым кнопкам мыши: 0 - Кнопки не были нажаты 1 - Была нажата левая кнопка 2 - Была нажата правая кнопка 4 - Была нажата средняя кнопка Параметр button представляет комбинированное состояние всех кнопок мыши. Например, если были нажаты левая и правая кнопка мыши, то параметр button возвращает 3 |
ctrlKey | Логическое значение, указывающее на нажатие клавиши <Ctrl> |
altKey | Логическое значение, указывающее на нажатие клавиши <Alt> |
shiftKey | Логическое значение, указывающее на нажатие клавиши <Shift> |
|
|
|
Событие | Описание |
|
|
omnousedown | Была нажата кнопка мыши |
onmousemove | Перемещается или был перемещен указатель мыши |
onmouseup | Была отпущена кнопка мыши |
onclick | Была нажата левая кнопка мыши или вызвано действие по умолчанию данного элемента |
ondblclick | Была дважды нажата левая кнопка мыши |
onmouseover | Указатель мыши был перемещен в область элемента |
onmouseout | Указатель мыши был выведен из области элемента |
ondragstart | Была запущена операция перетаскивания |
onselectstart | Было инициировано новое выделение элемента с помощью мыши |
onselect | Был выделен элемент |
|
|
|
Свойство | Значение |
|
|
keyCode | ASCII-код нажатой клавиши. Установка данного свойства равным нулю в обработчике события onkeypress отменяет событие. Установка данного свойства равным положительному значению заменяет нажатую клавишу на клавишу с отличным значением ASCII |
shiftKey | Состояние клавиши <Shift> (true/false) |
altKey | Состояние клавиши <Alt> (true/false) |
ctrlKey | Состояние клавиши <Ctrl> (true/false) |
|