addEventListener, bubbling и capturing, attachEvent и dettachEvent, кроссбраузерная привязка обработчика события
addEventListener
addEventListener
добавляет обработчик для определенного события
Синтаксис для addEventListener
js
elem.addEventListener(event, listener, capture);
Параметры:
elem
элемент, чьи события будем перехватыватьevent
(событие)
строка, наименование события (без префикса 'on
')listener
(обработчик)
функция, которой будет передаваться событиеcapture
(этап события)
этап события - булевое значение, еслиtrue
, то осуществляетсяcapture
, еслиfalse
-bubling
(всплытие). По умолчанию, можно и нужно третьим параметром указыватьfalse
, то есть всплытие.
removeEventListener
removeEventListener
удаляет указанную функциюо бработчик события
js
void removeEventListener(String тип, Function обработчик, Boolean фазаЗахвата);
Аргументы
- тип
Тип события, обработчик которого удаляется. - обработчик
Функцияобработчик события, которая должна быть удалена. - фаза Захвата
Значениеtrue
, если удаляется перехватывающий обработчик события, иfalse
, если удаляется обычный обработчик события.
js
removeEventListener (событие, обработчик события, этап события)
HTML
<span id="test">Тест</span>
<script type="text/javascript">
function consoleS(){console.log('Тест')};
var test=document.getElementById('test');
test.addEventListener('click',consoleS,false);
</script>
bubbling
и capturing
bubbling
- (всплытие) порядок выполнения
событий должен подниматься («булькать») вверх по структуре DOM-дерева.
capturing
- обработка событий идет вниз по DOM-дереву. В IE события всегда будут «булькать» подниматься вверх.
В остальных браузерах по умолчанию стоит также bubbling
, но можно регулировать (через 3-й параметр метода addEventListener
: если передать значение true
, то событие будет срабатывать на фазе захвата, если false
– то после окончания захвата, на фазе всплытия)
attachEvent
и dettachEvent
IE не поддерживает addEventListener
и removeEventListener
,
однако для IE существуют аналогичные методы attachEvent
(on
+ событие(event
), обработчик события(listener
)) и detachEvent
(on
+ событие(event
), обработчик события(listener
) ).
Кроссбраузерная привязка обработчика события
Для кроссбраузерной привязки обработчика события можно использовать конструкцию if...else
:
javascript
var test=document.getElementById('test');
function consoleS(){console.log('Тест')};
if(test.addEventListener)
{ // all browsers
test.addEventListener("click",consoleS,false)
}
else
{ // IE
test.attachEvent("onclick",alerting)
}
Есть функция для перебора методов привязки обработчика события:
javascript
function addEvent(elem, type, handler)
{
if (elem.addEventListener)
{
elem.addEventListener(type, handler, false)
}
else
{
elem.attachEvent("on"+type, handler)
}
}
elem
– елемент, к которому привязывается событие;type
– событие;handler
– обработчик события
Соответственно, есть функция для перебора методов отвязки обработчика события:
js
function removeEvent(elem, type, handler)
{
if (elem.removeEventListener)
{
elem.removeEventListener(type, handler, false)
}
else
{
elem.detachEvent("on"+type, handler)
}
}
Пример использования
Ниже приведен пример (использованы материалы статьи) для кроссбраузерной привязки и отвязки обработчика события для элемента:
HTML
<div id="a">Клик</div>
<div id="b">Отменить обработчик события</div>
<div id="c">Поновить обработчик события</div>
javascript
function addEvent(elem, type, handler)
{
if (elem.addEventListener)
{
elem.addEventListener(type, handler, false)
}
else
{
elem.attachEvent("on"+type, handler)
}
}
function removeEvent(elem, type, handler)
{
if (elem.removeEventListener)
{
elem.removeEventListener(type, handler, false)
}
else
{
elem.detachEvent("on"+type, handler)
}
}
var a,b,c;
a=document.getElementById('a');
b=document.getElementById('b');
c=document.getElementById('c');
var num=0;
var ind='yes';
//Подсчёт количества событий
function clickCount()
{
a.innerHTML="Событий: "+num;
num+=1;
}
//Отмена событмя клика для элемента #a
function cancelCount()
{
if(ind == 'yes')
{
removeEvent(a,"click",clickCount);
b.innerHTML = "Отменить обработчик события";
c.innerHTML = "Обновить обработчик события";
ind = 'no'
}
else
{
alert('Вы уже отменили обработчик события')
}
}
// Обновляем
function refreshCount()
{
if(ind != 'yes')
{
addEvent(a,"click",clickCount);
b.innerHTML="Отменить обработчик события";
c.innerHTML="Обработчик события обновлен";
ind = 'yes'
}
else
{
alert('Вы уже обновили обработку события')
}
}
addEvent(a,"click",clickCount);
addEvent(b,"click",cancelCount);
addEvent(c,"click",refreshCount);
Комментарии к статье