JavaScript (основы). Глава 10. Обработка событий
Оглавление | Назад | Вперёд | ИндексГлава 10. Обработка событий
Приложения JavaScript в браузере Navigator широко используют механизм обработки событий. Events\События это акции, которые обычно возникают как результат некоторых действий пользователя. Например, щелчок по кнопке является событием, также как и изменение текста или перемещение мыши над гиперссылкой. Чтобы Ваш скрипт реагировал на события, Вы определяете event handlers\обработчики событий, такие как onChange и onClick.
В главе имеются следующие разделы:
Об обработке событий см. дополнительно статью Getting Ready for JavaScript 1.2 Events в онлайновом View Source magazine. Также JavaScript technical notes содержат информацию о программировании событий.
В таблице дано резюме по событиям JavaScript. О том, какие события поддерживаются конкретной версией JavaScript, см. книгу Клиентский JavaScript. Справочник.
Таблица 10.1. Обработчики Событий JavaScript
Определение обработчика события
Вы определяете обработчик события (функцию или серию операторов JavaScript) для обработки события. Если событие применяется к HTML-тэгу (то есть событие применяется к JavaScript-объекту, созданному из этого тэга), то Вы можете определить для него обработчик события. Имя обработчика это имя события с префиксом "on." Например, обработчик для события focus называется onFocus.
Для создания обработчика события для тэга HTML добавьте атрибут обработчика события в этот тэг. Поместите код JavaScript в кавычки как значение атрибута. Общий синтаксис таков:
<TAG eventHandler="JavaScript Code">
где TAG это тэг HTML, eventHandler это имя обработчика события, а JavaScript Code это последовательность операторов JavaScript.
Например, Вы создали JavaScript-функцию compute. Вы выполняете вызов Navigator'ом этой функции, когда пользователь щёлкает кнопку, назначив вызов функции обработчику onClick кнопки:
<INPUT type=button VALUE="Calculate" onClick="compute(this.form)">
Вы можете указать любые операторы JavaScript в качестве значения атрибута onClick. Эти операторы выполняются, если пользователь щёлкает по кнопке. При включении нескольких операторов разделяйте их символом (;).
В предыдущем примере this.form ссылается на текущую форму. Ключевое слово this ссылается на текущий объект, которым в данном случае является кнопка. Конструкция this.form, следовательно, ссылается на форму, содержащую кнопку. Обработчик onClick это вызов функции compute с текущей формой в качестве аргумента.
Если Вы создаёте обработчик события, соответствующий объект JavaScript получает свойство с именем обработчика события. Это свойство даёт Вам доступ к обработчику события данного объекта. Например, в предыдущем примере JavaScript создаёт объект Button со свойством onclick, значением которого является "compute(this.form)".
Не забывайте чередовать двойные и одинарные кавычки. Поскольку обработчик события в HTML обязан быть заключён в кавычки, Вы обязаны использовать одинарные кавычки как ограничители строковых аргументов. Например:
<INPUT type=button NAME="Button1" VALUE="Open Sesame!"
onClick="window.open('mydoc.html', 'newWin')">
Вообще хорошей практикой может стать определение функции для обработчика события вместо использования нескольких операторов JavaScript:
Пример: использование обработчика события
В форме, показанной на следующем рисунке, Вы можете ввести выражение (например, 2+2) в первое текстовое поле, а затем щёлкнуть кнопку. Во втором поле будет выведено значение выражения (в данном случае, 4).
Рисунок 10.1 Форма с обработчиком события
<SCRIPT>
<!-- Скрываем от старых браузеров
function compute(f){
if(confirm("Are уou sure?"))
f.result.value=eval(f.expr.value)
else
alert("Please come back again.")
}
// конец скрытия -->
</SCRIPT>
</HEAD>
<FORM>
Enter an expression:
<INPUT TYPE=text NAME="expr" SIZE=15 >
<INPUT type=button VALUE="Calculate" onClick="compute(this.form)">
<BR>
Result:
<INPUT TYPE=text NAME="result" SIZE=15 >
</FORM>
</BODY>
HEAD/шапка документа определяет функцию compute, принимающую один аргумент, f, который является Form -объектом. Эта функция использует метод window.confirm для отображения диалога Confirm с кнопками OK и Cancel.
Если пользователь щёлкает OK, confirm возвращает true, а значением текстового поля result становится значение eval(f.expr.value). Функция JavaScript eval вычисляет свой аргумент, который может быть любой строкой, представляющей любые выражение или операторы JavaScript.
Если пользователь нажал Cancel, confirm возвращает false, и метод alert выводит другое сообщение.
На форме имеется кнопка с обработчиком onClick, в котором вызывается функция compute. Когда пользователь щёлкает кнопку, JavaScript вызывает compute с аргументом this.form, который означает текущий Form -объект. В compute на this.form делается ссылка как на аргумент f.
Вызов обработчиков событий явным образом
Руководствуйтесь следующими указаниями при вызове обработчиков событий.
<SCRIPT LANGUAGE="JavaScript">
function fun1(){
}
function fun2(){
}
</SCRIPT>
<INPUT type=button NAME="myButton"
onClick="fun1()">
</FORM>
document.myForm.myButton.onclick=fun2
</SCRIPT>
JavaScript 1.0. Вы не можете устанавливать обработчик события.
JavaScript 1.1 и предыдущие версии.
Вы обязаны вводить имена обработчиков символами нижнего регистра, например, myForm.onsubmit или myButton.onclick.
Объект Event
Каждое событие имеет ассоциированный объект event. Объект event предоставляет информацию о событии, такую как тип события и положение курсора в момент возникновения события. Когда событие возникает, и если обработчик был написан для обработки этого события, объект event отправляется обработчику как аргумент.
В случае с событием MouseDown, например, объект event содержит тип события ( "MouseDown"), координаты x и y позиции курсора мыши в момент возникновения события, число - используемую кнопку мыши и поле, содержащее клавиши-модификаторы (Control, Alt, Meta или Shift), которые были нажаты в момент события. Свойства объекта event различаются для разных типов событий, как описано в книге Клиентский JavaScript. Справочник.
JavaScript 1.1 и предыдущие версии.
Захват событий
Обычно событие обрабатывается объектом, в котором это событие возникает. Например, если пользователь щёлкает по кнопке, вызывается обработчик этого события. Иногда Вам может понадобиться, чтобы объект window или document обрабатывал определённые события. Например, Вам может понадобиться, чтобы объект document обрабатывал все события MouseDown вне зависимости от того, в каком месте документа они возникают.
Модель захвата событий JavaScript даёт возможность определять методы, которые захватывают и обрабатывают события, до того как они достигнут своей предполагаемой цели. Для этого объекты window, document и layer используют следующие методы:
JavaScript 1.1 и предыдущие версии.
Как пример, предположим, Вы хотите захватить все события Click, возникающие в окне. В сжатом виде, шаги по захвату событий таковы:
В последующих разделах эти шаги поясняются.
Для настройки захвата окном всех событий Click используйте примерно такой оператор:
window.captureEvents(Event.CLICK);
Аргументом свойства captureEvents объекта event является тип захватываемого события. Для захвата нескольких типов событий, аргументом является список с разделением символом ( |). Например, следующий оператор захватывает события Click, MouseDown и MouseUp:
window.captureEvents(Event.CLICK | Event.MOUSEDOWN | Event.MOUSEUP)
ПРИМЕЧАНИЕ:
Если окно с фрэймами должно захватывать события на страницах, загружаемых с различных серверов, Вам необходимо использовать captureEvents в маркированном скрипте и вызывать enableExternalCapture. О маркированных скриптах см. Главу 14 "Безопасность в JavaScript".
Определение Обработчика События
Далее определяется функция, обрабатывающая событие. Аргумент e это event -объект события.
//Здесь идёт обработка события.
//Процесс описан ниже.
}
return true}
Это даёт возможность полностью обработать событие документом или окном. Событие не обрабатывается каким-либо иным объектом, таким как button в document или дочерний фрэйм в window.
return false}
Это позволяет подавить обработку событий данного типа. Событие не обрабатывается каким-либо другим объектом, таким как кнопка в документе или дочерний фрэйм в окне. Вы может использовать это, например, для подавления событий от правой кнопки мыши в Вашем приложении.
Если routeEvent вызывает обработчик события, этот обработчик активируется. Если routeEvent вызывает обработчик, функцией которого является отображение новой страницы, эта акция выполняется без возвращения к вызывающему объекту.
var retval=routeEvent(e);
if(retval == false) return false;
else return true}
window.document.links[0].handleEvent(e)}
Пока ссылка имеет обработчик onClick, эта ссылка будет обрабатывать любые click-события, которые она получает.
Регистрация обработчика события
Наконец, функция регистрируется как обработчик данного события в окне:
Полный пример
В этом примере window и document захватывают и освобождают события:
<SCRIPT>
alert ("The window got an event of type: " + e.type +
" and will call routeEvent.");
window.routeEvent(e);
alert ("The window returned from routeEvent.");
return true}
alert ("The document got an event of type: " + e.type);
return false}
window.captureEvents(Event.CLICK)}
function releaseWindowCapture(){
window.releaseEvents(Event.CLICK)}
document.captureEvents(Event.CLICK)}
document.releaseEvents(Event.CLICK)}
document.onclick=fun2;
</HTML>
Проверка данных, введённых в форму
Важным является использование JavaScript для проверки введённых в форму данных, предназначенных для последующей обработки серверными программами, такими как приложения серверного JavaScript или CGI-программы. Эта проверка делается по следующими причинам:
В общем, Вам понадобится проверять ввод как минимум в двух случаях:
Страница JavaScript на сайте DevEdge содержит ссылки на примеры кода. Одна из этих ссылок - это полный набор функций для проверки данных формы.
В следующем разделе даны некоторые простые примеры, но посмотрите также примеры на сайте DevEdge.
Вот примеры простых проверяющих функций:
<SCRIPT LANGUAGE="JavaScript">
function isaPosNum(s){
return (parseInt(s) > 0)
}
function qty_check(item, min, max){
var returnVal=false
if(!isaPosNum(item.value))
alert("Please enter a positive number")
else if(parseInt(item.value) < min)
alert("Please enter a " + item.name + " greater than " + min)
else if(parseInt(item.value) > max)
alert("Please enter a " + item.name + " less than " + max)
else
returnVal=true
return returnVal
}
function validateAndSubmit(theform){
if(qty_check(theform.quantity, 0, 999)){
alert("Order has been Submitted")
return true
}
else {
alert("Sorry, Order Cannot Be Submitted!")
return false
}}
</SCRIPT>
</HEAD>
isaPosNum это простая функция, которая возвращает true, если её аргумент - положительное число, и false - в ином случае.
qty_check принимает три аргумента: объект, соответствующий проверяемому элементу формы ( item), и минимальное и максимальное допустимые значения для item ( min и max). Она проверяет, является ли item числом в диапазоне от min до max, и выводит диалог alert, если это не так.
validateAndSubmit принимает в качестве аргумента Form -объект; она использует qty_check для проверки значения элемента формы и отправляет форму, если ввод верен. В ином случае она выводит окно alert и не отправляет форму.
Использование проверяющих функций
В следующем примере тэг BODY документа использует qty_check как обработчик onChange для текстового поля и validateAndSubmit - как обработчик onClick для кнопки.
<FORM NAME="widget_order" ACTION="lwapp.html" METHOD="post">
How many widgets today?
<INPUT TYPE=text NAME="quantity" onChange="qty_check(this, 0, 999)">
<BR>
<INPUT type=button VALUE="Enter Order" onClick="validateAndSubmit(this.form)">
</FORM>
</BODY>
Эта форма отправляет значения на страницу lwapp.html приложения серверного JavaScript. Можно также отправить форму CGI-программе. Форма показана на рисунке.
Рисунок 10.2 Форма JavaScript
Обработчик onChange включается, если Вы измените значение в текстовом поле и переместите фокус с этого поля, нажав клавишу Tab клавиатуры компьютера или щёлкнув мышью вне этого текстового поля. Обратите внимание, что оба обработчика используют ключевое слово this для представления текущего объекта: в текстовом поле оно используется для передачи объекта JavaScript, соответствующего текстовому полю, функции qty_check, а в кнопке - для передачи JavaScript-объекта Form функции validateAndSubmit.
Для отправки формы серверной программе в этом примере используется кнопка, которая вызывает validateAndSubmit, проверяющую форму, с использование метода submit, если данные верны. Вы можете также использовать submit-кнопку (определённую тэгом <INPUT TYPE="submit">) и поместить на форму обработчик onSubmit, который возвращает false, если введены неправильные данные. Например,
<FORM NAME="widget_order" ACTION="lwapp.html" METHOD="post"
onSubmit="return qty_check(theform.quantity, 0, 999)">
<INPUT TYPE="submit">
</FORM>
Если qty_check возвращает false (если данные неверны), обработчик onSubmit запретит отправку формы.
Оглавление | Назад | Вперёд | Индекс