События и делегирование событий
Данный код выбирает все пункты списка на странице, затем связывает функцию обработчика с событием щелчка для каждого пункта списка с помощью метода .click() .
Такие методы как .click() , .blur() , .change() и другие являются «сокращёнными» методами связывания событий. jQuery предлагает ряд таких сокращённых методов, каждый из которых соответствует родному событию DOM:
| Родное имя события | Сокращённый метод |
|---|---|
| click | .click() |
| keydown | .keydown() |
| keypress | .keypress() |
| keyup | .keyup() |
| mouseover | .mouseover() |
| mouseout | .mouseout() |
| mouseenter | .mouseenter() |
| mouseleave | .mouseleave() |
| scroll | .scroll() |
| focus | .focus() |
| blur | .blur() |
| resize | .resize() |
Если залезть под капот, то все сокращённые методы в jQuery используются методом .on() . Вы можете включить метод .on() в свой код; в действительности, он даёт вам гораздо больше гибкости. При использовании .on() вы передаёте родное имя события в качестве первого аргумента, а затем функцию обработчика в качестве второго аргумента:
$( 'li' ).on( 'click', function( event ) < console.log( 'clicked', $( this ).text() ); >);
После того как к элементу «привязали» обработчик событий, вы можете инициировать его через jQuery.
$( 'li' ).trigger( 'click' );
Если у события, которое вы хотите инициировать, есть сокращённый метод (см. таблицу выше), вы также можете инициировать это событие, просто вызывая сокращённый метод:
$( 'li' ).click();
Когда применяется .trigger() вы только инициируете обработчики событий, которые связаны с JavaScript, но не инициируете поведение по умолчанию для этого события. К примеру, если вы инициируете событие click для элемента , автоматического перехода по ссылке не произойдёт (хотя вы можете написать код, который будет это делать).
После того, как вы привязали событие, его можно отвязать с помощью метода .off() . Это позволит удалить любые обработчики, которые были привязаны к определённому событию:
$( 'li' ).off( 'click' );
Пространство имён событий
Одним из преимуществ, которые предлагает .on() — это возможность использовать «пространство имён» событий. Для чего вам требуется задействовать пространство имён? Рассмотрим ситуацию, когда вы привязываете некоторые события, а затем хотите отменить привязку каких-то обработчиков. Как мы это уже видели, вы можете сделать это таким образом:
Внимание! Неудачное решение
$( 'li' ).on( 'click', function() < console.log( 'щёлкнули по элементу списка' ); >); $( 'li' ).on( 'click', function() < registerClick(); doSomethingElse(); >); $( 'li' ).off( 'click' );
Однако это отвяжет все обработчики click для всех элементов, чего нам не хочется. Если вы привяжете обработчик событий с помощью пространства имён событий, то можно задать конкретные обработчики событий:
$( 'li' ).on( 'click.logging', function() < console.log( 'щёлкнули по элементу списка' ); >); $( 'li' ).on( 'click.analytics', function() < registerClick(); doSomethingElse(); ); $( 'li' ).off( 'click.logging' );
Данный код оставляет нетронутым click для analytics , в то же время отменяя click для logging .
Мы также можем использовать пространства имен, чтобы инициировать только определённые события:
$( 'li' ).trigger( 'click.logging' );
Привязка нескольких событий за раз
Ещё одним преимуществом .on() является возможность привязывать несколько событий одновременно. Например, вы можете выполнить один код, когда пользователь прокручивает окно или когда пользователь изменяет размеры этого окна. Метод .on() позволяет передавать оба события в виде строки с пробелом — а затем вызвать функцию, которая обработает оба события:
$( 'input[type="text"]' ).on('focus blur', function() < console.log( 'Для поля получен или потерян фокус' ); >); $( window ).on( 'resize.foo scroll.bar', function() < console.log( 'Окно изменило размеры или прокручено!' ); >);
Именованная функция как обработчик событий
До сих пор во всех наших примерах в качестве обработчика событий мы передавали анонимную функцию. Тем не менее, вы можете создать функцию заранее и хранить её в переменной, а затем передать эту переменную в качестве обработчика событий. Это полезно, если вы хотите использовать один и тот же обработчик для разных событий или одно событие для различных элементов.
var handleClick = function() < console.log( 'на что-то щёлкнули' ); >; $( 'li' ).on( 'click', handleClick ); $( 'h1' ).on( 'click', handleClick );
Объект события
Всякий раз, когда происходит событие, функция обработчика событий получает один аргумент — объект события, стандартный во всех браузерах. Этот объект имеет много полезных свойств, в том числе следующие:
$( document ).on( 'click', function( event ) < console.log( event.type ); // Тип события, к примеру click console.log( event.which ); // Нажатая кнопка или клавиша console.log( event.target ); // Источник события console.log( event.pageX ); // Координата мыши по оси X console.log( event.pageY ); // Координата мыши по оси Y >);
Внутри обработчика событий
При указании функции, которая будет использоваться в качестве обработчика событий, эта функция получает доступ к исходному элементу DOM, который инициировал событие. Если вы желаете использовать jQuery для манипуляций с элементом, нужно передать его в $() :
$( 'input' ).on( 'keydown', function( event ) < // this: Элемент, с которым связан обработчик событий // event: Объект события // Сменить цвет фона элемента при нажатии на backspace // на красный, в противном случае на зелёный $( this ).css( 'background', event.which === 8 ? 'red' : 'green' ); >);
Отмена действия по умолчанию
$( 'a' ).on( 'click', function( event ) < // Отменяем действие по умолчанию event.preventDefault(); // Выводим console.log( 'По мне уже щёлкнули!' ); >);
Это позволяет нам использовать «всплывающие» события, которые мы исследуем ниже.
Всплывающие события
Рассмотрим следующий код:
$( '*' ).add( [ document, window ] ).on( 'click', function( event ) < event.preventDefault(); console.log( this ); >);
Обработчик щелчка привязывается ко всем элементам в документе (чего вы никогда не должны делать в реальном коде), а также для document и window . Что произойдёт, когда вы щёлкните по элементу , который находится внутри других элементов? На деле, событие click сработает для элемента , а также для всех элементов, которые содержат — весь путь до document и window .
Такое поведение называется всплывающее событие — событие срабатывает на элементе, по которому пользователь щёлкнул и если вы не вызовите .stopPropagation() для объекта события, то запустится весь путь вверх по DOM.
Вы можете увидеть это более наглядно, когда проанализируете такую разметку:
Я ссылка! И ты ссылка?
И следующий код:
$( 'a' ).on( 'click', function( event ) < event.preventDefault(); console.log( $( this ).attr( 'href' ) ); >);
Делегирование событий
Поведение всплывающих событий позволяет нам делать «делегирование событий» — связывание обработчиков с элементами высокого уровня, а затем определение, какие элементы низкого уровня инициировали событие. Так, мы могли бы связать событие с маркированным списком, а затем выяснить, какой элемент инициировал событие:
$( '#my-unordered-list' ).on( 'click', function( event ) < console.log( event.target ); // записываем элемент, который вызвал событие >);
Конечно, если наш маркированный список содержит пункты, а они в свою очередь содержат другую разметку, при этом мы в действительности заботимся только о нажатом пункте списка, то в суете всё это может оказаться неаккуратным. К счастью, jQuery предоставляет помощника, который позволяет нам определить, о каких элементах нам стоит заботиться, когда идёт привязка к элементу высокого уровня.
Делегирование событий имеет два основных преимущества. Во-первых, это позволяет нам привязывать меньше обработчиков событий, чем если бы мы отслеживали щелчки по отдельным элементам; к тому же это может дать большой прирост производительности. Во-вторых, это позволяет нам привязать родительские элементы вроде маркированного списка и наши обработчики событий будут срабатывать как ожидалось, даже если поменяется содержимое.
Например, этот код добавляет новый элемент списка после настройки делегирования события; щелчок по новому пункт работает прекрасно, без каких-либо дополнительных событий.
Резюме
В этом разделе мы рассмотрели различные способы взаимодействия пользователя с нашей страницей, в том числе, как мы можем использовать делегирование события более эффективно. В следующем разделе мы перейдём к анимации элементов с помощью методов jQuery.
Автор: Ребекка Мёрфи
Последнее изменение: 11.06.2016
- Основы JavaScript
- Азы jQuery
- Обход и манипуляция
- События и делегирование событий
- Анимация с jQuery
- AJAX
Как называется объект который вызвал событие
Возвращает строку со значением атрибута name объекта.
objectName.name
frameRef.name
frameRef.frames.name
radioName[index].name
selectName.options.name
windowRef.name
windowRef.frames.nаmе
Применение
Атрибут этого свойства зависит от объекта. Он может быть изменен в любой момент.Это свойство ссылается на внутренние имена объектов button, reset и submit, а не на подписи кнопок.Например, после открытия нового окна с помощью:
indexOutline = window.open('http://www.dvgu.ru/outline.htrnl","MenuPage")
и выполнения команды
document. write (indexOutline. name)
JavaScript вернет строку "MenuName" , то есть присвоенное окну имя. У всех переключателей в группе имена одинаковы, каждый из них идентифицируется своей позицией.
Связанные элементы
Свойство объектов button, checkbox, frame, password, radio, reset, select, submit, text, textarea и window.
См. свойство value.
Содержит информацию о броузере на клиентском компьютере. navigator
Применение
Объект navigator возвращает информацию о броузере, такую как имя и версия броузера. Одно из основных применений этого объекта состоит в определении платформы, используемой на клиентском компьютере, для учета особенностей конкретного броузера, подобных обработке символа новой строки или генерации случайных чисел. function UnixMachine() <
(navigator.appVersion.lastIndexOf('Unix') !=-1 return true
else
return false
>
Событие происходит в тот момент, когда элемент формы select, text или textarea теряет фокус.
Применение
Событие потери фокуса (blur) может использоваться для проверки корректности ввода данных пользователем. Зтот обработчик события отличается от обработчика onChange, который вызывается только в случае изменения значения поля.
Связанные элементы
Обработчик событий для объектов select, text, textarea.
См. методы focus и blur.
См. обработчики событий onChange и onFocus.
Событие происходит в тот момент, когда значение элемента формы select, text или textarea изменилось и элемент потерял фокус.
Применение
Зтот обработчик особенно полезен для проверки корректности ввода данных пользователем.
Cвязанные элемвнты
Обработчик событии для объектов Select text textarea
См, обработчики событий onBlur и onFocus onClick (Обработчик события)
Вызывается после щелчка левой кнопкой мыши на объекте
Событие происходит в тот момент, когда пользователь перехoдит к элементу формы select, text или textarea ввода данных.
Применение
Злемент формы получает фокус в тот момент, когда пользователь переходит к этому элементу формы с помощью клавиш Tab или щелчка мыши. Выделение символов внутри поля при водит к вызову обработчика события onSelect.Одним из применений обработчика on Focus является вывод на экран всплывающей подсказки, когда элемент выбирается первый раз.
Связанные элементы
Обработчик событий для объектов select, text, textarea.
См. обработчики событий onBlur и onChange.
Вызывается, когда загрузка документа в окно или в кадр закончена.
Применение
Событие load возникает в тот момент, когда броузер заканчивает загрузку окна или всех кадров внутри тега .
Связанные элементы
Обработчик событий для объекта window.
См. обработчик события onUnload.
Обработчик события 0nSelect вызывается в тот момент, когда выделен текст внутри элемента формы.
Применение
Событие select вызывается выбором части или всего текста в объектах text или textarea.
Связанные элементы
Обработчик событий для объектов text и textarea.
Событие происходит в момент щелчка мышью на кнопке Subm' для посылки данных формы на сервер.
Применение
Обработчик события onSubmit запускается в момент от правки пользователем данных формы на сервер. Любое отличное от false возвращаемое значение, в том числе пропуск оператора return, приводит к отправке данных на сервер. Для получения более ясного кода рекомендуется вставлять оператор return в обоих случаях.
function feedbackSubmit () . сроки кода.
if (!validData) <
return true >
else return false; >
>
Связанные элементы
Обработчик событий для объекта form.
См. объект st.htm#submit.
См. метод submit. onUnload (Обработчик события)
Вызывается, когда пользователь выходит из документа.
Применение
Когда несколько событий unload включено в иерархию кадров, порядок операций – от дочернего к родительскому. Например, событие unload включено в два документа и родительский тег , которыи загрузил их. Когда дочерний документ изменяется, его событие unload обрабатывается, но событие unload тега не происходит. Когда пользователь выбирает опцию, заменяющую родительский документ на новый источник, событие unload самого верхнего уровня будет обработано.
Связанные элементы
Обработчик события объекта window.
См. обработчик события onLoad.
Создает новый документ или экземпляр окна.
document.open([MIMEtype])
window.open("URL", "windowName" ("windowFeatures")
Применение
Для документа метод open открывает поток вывода для метoдов write или writeln. Eсли тип MIME является версие text или image (например text/html или image/gif) документ будет открыт для показа. Иначе поток будет направлен в plug–in. Eсли документ уже существует в целевом окне, метод open очищает это окно. Поток закрывается помощью метода document.close () .
Для окна метод open открывает новое окно броузера, подобно выбору пункта меню File -> New Web Browser броузера. Пр использовании аргумента URL метод загружает в новое окнo документ; в противном случае новое окно остается пустым. При использовании метода в программе обработки событи форма должна включать объект window; в противном случа подразумевается обьект dncument.
Параметр windowFeatures описывается в виде разделенного запятыми списка параметров, где =1 или =yes – включено и =0 или =no – отключено. windowFeatures включают управление выводом инструментальной панели, окна URL, кнопок каталогов, строки состояния, строки меню, полос прокрутки, возможностью изменения размеров, сохранением истории навигации, шириной и высотой.
Связанные элементы
Метод обьектов document и window.
См. методы clear, close, write, и writeln.
Этот массив параметров является свойством элемента формы select. Массив создается с помощью тегов внутри набора тегов .
formName.selectName.options[index]
forms[index].elements[index].options[indех]
Применение
Индекс первого параметра – ноль, второго – 1 и так далее. Более подробная информация содержится в описании объекта select
Связанные элементы
См. объект select. parent (Свойство)
Ссылается на вызывающий документ в текущем кадре, созданном тегом .
parent
parent.frameName
parent.frames[index]
parent.property
Применение
Использование свойства parent дает доступ к другим кадрам, созданным тем же самым тегом . Например, пусть два вызываемых кадра называются index и contents. Тогда кадр index может выводить текст в кадр contents, используя синтаксис:
parent.contents.document.write("Здесь был Вася")
Связанные элементы
Свойство объектов document и window. parse (Метод)
Преобразует строку даты типа "Jan 11, 1996" в количество миллисекунд, прошедших с полуночи 1 января 1970 года.
Применение
Эта функция может использоваться для возврата даты на основе значения строки. При передаче строки со временем она возвращает значение времени. Так как parse – статическая функция объекта Date, она вceгда используется как Date.parse () , а не как метод созданного объекта Date. Date.parse (" Jan 11, 1996");
Today = new Date ();
Date.parse(Today.toLocaleString())
Связанные элементы
Метод обьекта Date.
См. метод UTC.
Применение
Метод parseFloat анализирует строковый аргуме и возвращает число с плавающей точкой, если первый элемент переданной строки – знак "плюс", знак "минус" деcятичное число "е" (основание натурального логарифма) или цифра Если parseFloat сталкивается с недопустимым символом, то метод возвращает значение, основанное на подстроке cле дующей до этого символ, игнорируя вce последующие. Если первый же символ недопустим, parseFloat возвращает одно из двух значений, в зависимости от платформы: Windows – 0, не Windows – NaN.
Связанные элементы
См. методы isNaN, parseInt
Анализирует строковый аргумент и возвращает целое число, основанное на указанной системе счисления.
parseint(string [,radix])
Применение
При параметре radix, равном 10, string преобразовывается в десятичное число, при 8 преобразовывается в восьмеричное и при 16 – в шестнадцатеричное. Значения, большие10, для оснований, превышающих 10, представляются символами от A до F вместо чисел. Использование radix, равного 2, служит для преобразований в двоичные числа. Числа с плавающей запятой будут преобразованы в целые числа. Правила обработки строки идентичны правилам для parseFloat. Ecли radix опущен или система счисления конфликтует с первыми символами, JavaScript использует систему счисления, анализируя первые символы строки.
Символы Система счисления
0 8 (восьмеричная)
0х 16 (шестнадцатеричная)
другие 10(десятичная
Cвязанные элементы
См. методы isNaN, parseFloat
Окно ввода пароля в форме HTML
document.formName.passwordName
document.forms[index].element[index]
Символы пароля маскируются звездочками в целях защиты
Применение
password – текстовое поле, в котором символы, вводимые пользователем, в целях защиты маскируются звездочками.Любые значения по умолчанию, включенные как часть области определения HTML, очищаются при загрузке страницы. Этим предотвращаются намеренные или случайные нарушения защиты. Несмотря на то что свойство defaultValue допустимо для объекта password, оно всегда возвращает нулевое значение.
Возвращаемое значение объекта password может быть программно обработано внутри сценария, однако рекомендуется не использовать литералы (буквенное значение пароля) в тексте сценария из очевидных соображений безопасности.
Связанные элементы
Свойство объекта form.
См. объект text.
См. свойства defaultValue, name и value.
См. методы focus, blur и select.
Извлекает из URL ту его часть, которая содержит путь.
location.pathname
link.pathnarne
links[index].pathname
Применение
Хотя pathname может быть изменено в любое время, всегда безопаснее изменить весь URL сразу, используя свойство href.
Связанные элементы
Свойство объекта form
См. свойства hash, host, hostname, href, port, protocol и search.
Возвращает значение числа пи.
Math.PI
Применение
Значение числа пи приблизительно равно 3.14159. Зто – отношение длины окружности к диаметру.
circumference = 2 * Matti.PI * radius area = Math.PI * Math.pow(radius,2)
Связанные элементы
Свойство объекта Math.
Извлекает из URL номер порта.
location.port
link.port
links[index].port
Применение
Значение порта – подстрока свойства host в свойстве href,
Возвращает основание, возведенное в степень.
Math.pow(argument)
Применение
Многие языки программирования используют оператор ^ для операции возведения в степень. JavaScript имеет для этого собственный метод. Символ ^ используется в JavaScript для выполнения поразрядной операции XOR.
Связанные элементы
Метод объекта Math.
См. методы ехр и log. prompt (Метод)
Отображает диалоговое окно ввода пользователя.
[windowName.]prompt(message[inputDefault])
Применение
Eсли первоначальное значение для inputDefault не определено, диалоговое окно предлагает значение .
var userID = prompt("Please enter your ID",&"";)
Связанные элементы
Метод обьекта window.
См. методы alert и confirm.
Возвращае метод доступа к файлу
location.protocol
link.protocol
links[index].protocol
Применение
Строка, возвращаемая этим свойством, – начальная часть URL до двоеточия включительно. Это та часть URL, которая указывает метод доступа (nttp, ftp и т. п.).
about информация о броузере
ftp протокол загрузки файлов
http протокол передачи гипертекста
mailto адрес электронной почты
news узел новостей
file ссылка на файл на локальной машине
javascript предшествует набору команд JavaScript
Связанные элементы
Свойство объекта form.
См. свойства hash host, hostname, hгef, pathname, port и search.
Набор переключателей.
formName radioName[index]
forms [index].elements[index]
Применение
Объекты radio создаются внутри HTML-тега и представляют собой переключатели. Набор переключателей позволяет пользователю выбирать один элемент из группы. При ссылке на объект с использованием имени переключателя индекс состоит из кнопок с одинаковым свойством namе. При ссылке на переключатель с использованием массива elements каждый переключатель представляет собой отдельный элемент в индексе.
Связанные элементы
Свойство объекта form.
См. объекты сheckbox и select.
См. метод click.
См. обработчик события onClick.
Возвращает случайное число в интервале между 0 и 1 (только для UNIX).
Math.random()
Применение
Метод random реализован только на UNIX-платформах – пользователи Windows и Macintosh должны использовать альтернативную форму генерации случайного числа. Пример такой формы включен в раздел "Примеры применения JavaScript"
Связанные элементы
Метод объекта Math. referrer (Свойство)
URL документа, который привел к текущему документу.
document.referrer
Применение
Возвращает строку только для чтения, содержащую полный URL того документа, который вызвал текущий документ Это свойство может использоваться со сценарием CGI, чтобы отслеживать, как пользователь перешел к текущей странице.
document.write("document.referrer")
Связанные элементы
Свойство объекта form.
Кнопка для возвращения всем объектам form значений по умолчанию.
formName.resetButtonName
forms[index].elements[index]
Применение
Этот объект соответствует кнопке Reset, созданной тегом HTML ,в озвращающей все объекты fоrm к их значениям по умолчанию.
Объект reset должен быть создан внутри тега и не может управляться из программы обработки события onClick. При нажатии кнопки все объекты формы возвращаются к их значениям по умолчанию. Однако программа обработки события onClick может в дополнение к восстановлению значений по умолчанию вызывать другие действия.
Связанные элементы
Свойство объекта form.
Cм объекты button, submit
Cм. свойства narne и value.
Cм, метод click.
Cм. обработчик события onClick.
Oкругляет число до ближайшего целого.
Math.round(argument)
Oкругляет аргумент с плавающей точкой до ближайшего большего целого числа, если десятичная часть больше или равна 0.5, или до ближайшего меньшего целого числа, если десятичная часть меньше, чем 0.5.
Math.round (2. 1) // Возвращает 2
Math.round(2. 9) ) // Возвращает 3
Cвязанные элементы
Метод обьекта Маth.
Объект события
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/introduction-browser-events.
Чтобы хорошо обработать событие, недостаточно знать о том, что это – «клик» или «нажатие клавиши». Могут понадобиться детали: координаты курсора, введённый символ и другие, в зависимости от события.
Детали произошедшего браузер записывает в «объект события», который передаётся первым аргументом в обработчик.
Свойства объекта события
Пример ниже демонстрирует использование объекта события:
Свойства объекта event :
event.type Тип события, в данном случае click event.currentTarget Элемент, на котором сработал обработчик. Значение – в точности такое же, как и у this , но бывают ситуации, когда обработчик является методом объекта и его this при помощи bind привязан к этому объекту, тогда мы можем использовать event.currentTarget . event.clientX / event.clientY Координаты курсора в момент клика (относительно окна)
Есть также и ряд других свойств, в зависимости от событий, которые мы разберём в дальнейших главах, когда будем подробно знакомиться с событиями мыши, клавиатуры и так далее.
Объект события доступен и в HTML
При назначении обработчика в HTML, тоже можно использовать переменную event , это будет работать кросс-браузерно:
Это возможно потому, что когда браузер из атрибута создаёт функцию-обработчик, то она выглядит так: function(event) < alert(event.type) >. То есть, её первый аргумент называется "event" .
Особенности IE8-
IE8- вместо передачи параметра обработчику создаёт глобальный объект window.event . Обработчик может обратиться к нему.
Работает это так:
elem.onclick = function() < // window.event - объект события alert( window.event.clientX ); >;
Кроссбраузерное решение
Универсальное решение для получения объекта события:
element.onclick = function(event) < event = event || window.event; // (*) // Теперь event - объект события во всех браузерах. >;
Строка (*) , в случае, если функция не получила event (IE8-), использует window.event .-событие event .
Можно написать и иначе, если мы сами не используем переменную event в замыкании:
element.onclick = function(e) < e = e || event; // Теперь e - объект события во всех браузерах. >;
Итого
- Объект события содержит ценную информацию о деталях события.
- Он передаётся первым аргументом event в обработчик для всех браузеров, кроме IE8-, в которых используется глобальная переменная window.event .
Кросс-браузерно для JavaScript-обработчика получаем объект события так:
element.onclick = function(event) < event = event || window.event; // Теперь event - объект события во всех браузерах. >;
Обработка и инициация событий
События в .NET основаны на модели делегата. Модель делегата соответствует шаблону разработки наблюдателя, который позволяет подписчику зарегистрироваться у поставщика и получать от него уведомления. Отправитель события отправляет уведомление о событии, а приемник событий получает уведомление и определяет ответ на него. В этом разделе описываются основные компоненты модели делегата, использование событий в приложениях и реализация событий в коде.
События
Событие — это сообщение, посланное объектом, чтобы сообщить о совершении действия. Это действие может быть вызвано пользовательским взаимодействием, например нажатием кнопки, или какой-то другой программной логикой, например изменением значения свойства. Объект, вызывающий событие, называется отправителем событий. Отправителю событий не известен объект или метод, который будет получать (обрабатывать) созданные им события. Обычно событие является членом отправителя событий; например, событие Click — член класса Button, а событие PropertyChanged — член класса, реализующего интерфейс INotifyPropertyChanged.
Чтобы определить событие, необходимо использовать ключевое слово event в C# или Event в Visual Basic в сигнатуре класса события и задать тип делегата для события. Делегаты описаны в следующем разделе.
Как правило, для вызова события добавляется метод, помеченный как protected и virtual (в C#) или Protected и Overridable (в Visual Basic). Назовите этот метод On EventName; например, OnDataReceived . Метод должен принимать один параметр, который определяет объект данных события, являющийся объектом типа EventArgs или производного типа. Этот метод предоставляется, чтобы производные классы могли переопределять логику для вызова события. Производный класс должен вызывать метод On EventName базового класса, чтобы зарегистрированные делегаты получили событие.
В следующем примере показан способ объявления события ThresholdReached . Событие связано с делегатом EventHandler и возникает в методе OnThresholdReached .
class Counter < public event EventHandler ThresholdReached; protected virtual void OnThresholdReached(EventArgs e) < EventHandler handler = ThresholdReached; handler?.Invoke(this, e); >// provide remaining implementation for the class >
Public Class Counter Public Event ThresholdReached As EventHandler Protected Overridable Sub OnThresholdReached(e As EventArgs) RaiseEvent ThresholdReached(Me, e) End Sub ' provide remaining implementation for the class End Class
Делегаты
Делегат — это тип, содержащий ссылку на метод. Делегат объявляется с сигнатурой, указывающей тип возвращаемого значения и параметры для методов, на которые он ссылается, и может содержать ссылки только на методы, соответствующие его сигнатуре. Таким образом, делегат эквивалентен указателю на строго типизированную функцию или обратному вызову. Объявления делегата достаточно для определения класса делегата.
У делегатов широкая область применения в .NET. В контексте событий делегат — это посредник (или механизм, подобный указателю) между источником события и кодом, обрабатывающим событие. Делегат связывается с событием за счет включения типа делегата в объявление события, как показано в примере в предыдущем разделе. Дополнительные сведения о делегатах см. в разделе, посвященном классу Delegate.
Эти делегаты являются многоадресными, то есть в них могут храниться ссылки на несколько методов обработки событий. Дополнительные сведения см. на справочной странице класса Delegate. Делегаты позволяют гибко и точно управлять обработкой событий. Делегат выступает как диспетчер событий для класса, вызывающий событие за счет ведения списка зарегистрированных обработчиков для события.
public delegate void ThresholdReachedEventHandler(object sender, ThresholdReachedEventArgs e);
Public Delegate Sub ThresholdReachedEventHandler(sender As Object, e As ThresholdReachedEventArgs)
Данные событий
Данные, связанные с событием, могут быть предоставлены с помощью класса данных события. .NET предоставляет множество классов данных событий, которые можно использовать в приложениях. Например, класс SerialDataReceivedEventArgs — класс данных события SerialPort.DataReceived. В .NET имена всех классов данных событий оканчиваются ключевым словом EventArgs . Определить, какой класс данных события связан с событием, можно по делегату этого события. Например, делегат SerialDataReceivedEventHandler содержит класс SerialDataReceivedEventArgs в качестве одного из своих параметров.
Класс EventArgs является базовым типом для всех классов данных событий. Класс EventArgs используется также, если событие не содержит связанных данных. При создании события, которое лишь уведомляет другие классы о том, что что-то произошло, и не передает никаких данных, используйте класс EventArgs в качестве второго параметра в делегате. Если данные не предоставляются, можно передать значение EventArgs.Empty. Делегат EventHandler содержит класс EventArgs в качестве параметра.
Если требуется создать пользовательский класс данных события, создайте класс, производный от класса EventArgs, а затем укажите все члены, необходимые для передачи данных, связанных с событием. В большинстве случаев следует использовать схему именования .NET и завершать имя класса данных события ключевым словом EventArgs .
В следующем примере показан класс данных события с именем ThresholdReachedEventArgs . Он содержит свойства, относящиеся только к вызываемому событию.
public class ThresholdReachedEventArgs : EventArgs < public int Threshold < get; set; >public DateTime TimeReached < get; set; >>
Public Class ThresholdReachedEventArgs Inherits EventArgs Public Property Threshold As Integer Public Property TimeReached As DateTime End Class
Обработчики событий
Для обработки события в приемнике события необходимо определить метод обработчика события. Этот метод должен соответствовать сигнатуре делегата обрабатываемого события. В обработчике событий выполняются действия, необходимые при возникновении события, например сбор данных, введенных пользователем при нажатии кнопки. Чтобы получать уведомления при возникновении события, метод обработчика события должен быть подписан на событие.
В следующем примере показан метод обработчика события c_ThresholdReached , который соответствует сигнатуре делегата EventHandler. Метод подписывается на событие ThresholdReached .
class Program < static void Main() < var c = new Counter(); c.ThresholdReached += c_ThresholdReached; // provide remaining implementation for the class >static void c_ThresholdReached(object sender, EventArgs e) < Console.WriteLine("The threshold was reached."); >>
Module Module1 Sub Main() Dim c As New Counter() AddHandler c.ThresholdReached, AddressOf c_ThresholdReached ' provide remaining implementation for the class End Sub Sub c_ThresholdReached(sender As Object, e As EventArgs) Console.WriteLine("The threshold was reached.") End Sub End Module
Обработчики статических и динамических событий
.NET позволяет подписчикам регистрироваться для получения уведомлений о событиях как статически, так и динамически. Обработчики статических событий действуют в течение всего жизненного цикла класса, события которого они обрабатывают. Обработчики динамических событий активируются и деактивируются во время выполнения программы, обычно в ответ на определенную условную логику программы. Например, они могут использоваться, если уведомления о событиях требуются только в определенных условиях, либо приложение предоставляет несколько обработчиков событий и выбор конкретного обработчика зависит от условий среды выполнения. В примере в предыдущем разделе показано, как динамически добавлять обработчик события. Дополнительные сведения см. в разделах события (в Visual Basic) и события (в C#).
Создание нескольких событий
Если класс создает несколько событий, компилятор создает одно поле для каждого экземпляра делегата события. При большом количестве событий стоимость хранения одного поля на делегата может оказаться неприемлемой. Для таких случаев .NET предоставляет свойства события, которые можно использовать вместе с другой структурой данных для хранения делегатов события.
Свойства событий состоят из объявлений событий и методов доступа к событиям. Методы доступа к событиям — это определяемые пользователем методы, добавляющие или удаляющие экземпляры делегата события из структуры данных хранения. Обратите внимание, что использование свойств события снижает быстродействие по сравнению с полями события, поскольку перед вызовом каждого делегата события его необходимо извлечь. Необходимо найти компромисс между памятью и скоростью. Если ваш класс определяет много событий, которые вызываются нечасто, необходимо реализовать свойства событий. Дополнительные сведения см. в разделе Практическое руководство. Обработка нескольких событий с помощью их свойств.
Связанные статьи
| Заголовок | Описание |
|---|---|
| Практическое руководство. Вызов и прием событий | Содержит примеры вызова и приема событий. |
| Практическое руководство. Обработка нескольких событий с помощью их свойств | Показывает, как использовать свойства событий для обработки нескольких событий. |
| Шаблон разработки наблюдателя | Описывает шаблон разработки, позволяющий подписчику зарегистрироваться у поставщика и получать от него уведомления. |
См. также
- EventHandler
- EventHandler
- EventArgs
- Delegate
- События (Visual Basic)
- События (Руководство по программированию в C#)
- Общие сведения о событиях и перенаправленных событиях (приложения для UWP)
- События в приложениях Магазина Windows 8.x