JavaScript события
Введение в события
Практически все JavaScript-приложения выполняют те или иные действия, откликаясь на различные события.
Событие - это сигнал от браузера о том, что что-то произошло.
Есть множество самых различных событий.
- DOM-события, которые инициируются элементами DOM. Например, событие click происходит при клике на элементе, а событие mouseover - когда указатель мыши появляется над элементом,
- События окна. Например событие resize - при изменении размера окна браузера,
- Другие события, например load, readystatechange. Они используются, скажем, в технологии AJAX.
Основные события
События мыши:
- click – происходит, когда кликнули на элемент левой кнопкой мыши
- contextmenu – происходит, когда кликнули на элемент правой кнопкой мыши
- mouseover – возникает, когда на элемент наводится мышь
- mousedown и mouseup – когда кнопку мыши нажали или отжали
- mousemove – при движении мыши
События на элементах управления:
- submit – посетитель отправил форму <form>
- focus – посетитель фокусируется на элементе, например нажимает на <input>
Клавиатурные события:
- keydown – когда посетитель нажимает клавишу
- keyup – когда посетитель отпускает клавишу
События документа:
- DOMContentLoaded – когда HTML загружен и обработан, DOM документа полностью построен и доступен.
События CSS:
- transitionend – когда CSS-анимация завершена.
Назначение обработчиков
Через атрибут HTML-тега
<input value="Нажми Меня" onclick="alert('Спасибо!');" type="button"/>
Можно назначить и функцию.
<script type="text/javascript">
function count_rabbits() {
for(var i=1; i<=3; i++) {
// оператор + соединяет строки
alert("Из шляпы достали " + i + " кролика!")
}
}
</script>
<input type="button" onclick="count_rabbits()" value="Считать кролей!"/>
Назначение обработчиков
Через свойство объекта
<input id="myElement" type="button" value="Нажми меня"/>
<script>
document.getElementById('myElement').onclick = function() {
alert('Спасибо')
}
<script>
function doSomething() {
alert('Спасибо')
}
document.getElementById('button').onclick = doSomething
// Обратите внимание - свойству присваивается именно
// сама функция-обработчик doSomething, а не doSomething():
можно и не создавать анонимную функцию, а использовать любую уже готовую:
Доступ к элементу через this
<button onclick="alert(this.innerHTML)">Нажми меня</button>
Когда использовать
input.onclick = function() { alert(1) }
// ...
input.onclick = function() { alert(2) } // заменит предыдущий
addEventListener и removeEventListener
element.addEventListener(event, handler[, phase]);
event
Имя события, например click
handler
Ссылка на функцию, которую надо поставить обработчиком.
// передать те же аргументы, что были у addEventListener
element.removeEventListener(event, handler[, phase]);
<input id="elem" type="button" value="Нажми меня"/>
<script>
function handler1() {
alert('Спасибо!');
};
function handler2() {
alert('Спасибо ещё раз!');
}
elem.onclick = function() { alert("Привет"); };
elem.addEventListener("click", handler1); // Спасибо!
elem.addEventListener("click", handler2); // Спасибо ещё раз!
</script>
Несколько обработчиков на одно событие одного элемента
Объект события - event
function doSomething(event) {
// event - будет содержать объект события
}
element.onclick = doSomething;
function showModal(event) {
// event - будет содержать объект события
event.preventDefault(); //предотвращение дейсвтия по умолчанию
// Код показа модального окна
}
var modalTrigger = document.querySelector("a[data-modal]");
modalTrigger.onclick = showModal;
как предотвратить действие браузера по умолчани
События мыши
Простые события
mousedown
Кнопка мыши нажата над элементом.
mouseup
Кнопка мыши отпущена над элементом.
mouseover
Мышь появилась над элементом.
mouseout
Мышь ушла с элемента.
mousemove
Каждое движение мыши над элементом генерирует это событие.
Комплексные события
click
Вызывается при клике мышью, то есть при mousedown, а затем mouseup на одном элементе
contextmenu
Вызывается при клике правой кнопкой мыши на элементе.
dblclick
Вызывается при двойном клике по элементу.
Координаты курсора
в окне: clientX/Y
<input onmousemove="this.value = event.clientX+':'+event.clientY">
Относительно документа: pageX/Y
<input onmousemove="this.value = event.pageX+':'+event.pageY">
События мыши: движение
mouseover/mouseout, mouseenter/mouseleave
Событие mouseover
происходит, когда мышь появляется над элементом, а mouseout
– когда уходит из него.
При переходе на потомка срабатывает mouseout на родителе.
mouseenter/mouseleave
mouseover/mouseout
Мышь: колёсико, событие wheel
wheel
- Свойство
deltaY
– количество прокрученных пикселей по горизонтали и вертикали. Существуют также свойстваdeltaX
иdeltaZ
для других направлений прокрутки.
window.onscroll = function() {
var scrolled = window.pageYOffset;
document.getElementById('showScroll').innerHTML = scrolled + 'px';
}
document.getElementById("myDIV").addEventListener("wheel", myFunction);
function myFunction(event) {
this.style.fontSize = event.deltaY + "px";
}
Прокрутка: событие scroll
Клавиатура: keyup, keydown, keypress
keydown/keyup
- происходят при нажатии/отпускании клавиши и позволяют получить её скан-код в свойстве keyCode.
<input onkeydown="this.nextElementSibling.innerHTML = event.keyCode"><b></b>
keypress
- Ввозникает сразу после keydown, если нажата символьная клавиша, т.е. нажатие приводит к появлению символа.
<input onkeypress="this.nextElementSibling.innerHTML = event.charCode"><b></b>
Тестовый стенд: keyup, keydown, keypress
Загрузка документа:
DOMContentLoaded, load,
beforeunload, unload
window.onbeforeunload = function() {
return "Данные не сохранены. Точно перейти?";
};
- DOMContentLoaded – браузер полностью загрузил HTML, и построил DOM-дерево.
- load – браузер загрузил все ресурсы.
- beforeunload/unload – уход со страницы.
window.onload = function() {
//.....
$slider.init();
};
document.addEventListener("DOMContentLoaded", ready);
События формы и ее элементов
<script>
var form = document.forms[0];
var select = form.elements.genre;
for (var i = 0; i < select.options.length; i++) {
var option = select.options[i];
if(option.selected) {
alert( option.value );
}
}
</script>
document.forms
Форму можно получить как document.forms[name/index].
form.elements
Элементы в форме: form.elements[name/index]. Каждый элемент имеет ссылку на форму в свойстве form. Свойство elements также есть у <fieldset>.
Значение элементов читается/ставится через value или checked.
<form name="form">
<select name="genre" multiple>
<option value="blues" selected>Мягкий блюз</option>
<option value="rock" selected>Жёсткий рок</option>
<option value="classic">Классика</option>
</select>
</form>
навигация по формам
Фокусировка: focus/blur
Событие focus вызывается тогда, когда пользователь фокусируется на элементе, а blur – когда фокус исчезает, например посетитель кликает на другом месте экрана.
input.onblur = function() {
if (isNaN(this.value)) { // введено не число
// показать ошибку
this.className = "error";
error.innerHTML = 'Вы ввели не число. Исправьте, пожалуйста.'
}
};
Метод focus()
age.onblur = function() {
if (isNaN(this.value)) { // введено не число
// показать ошибку
this.classList.add("error");
//... и вернуть фокус обратно
age.focus();
} else {
this.classList.remove("error");
}
};
Изменение: change, input, cut, copy, paste
Событие | Описание | Особенности |
---|---|---|
change |
Изменение значения любого элемента формы. Для текстовых элементов срабатывает при потере фокуса. | В IE8- на чекбоксах ждет потери фокуса, поэтому для мгновенной реакции ставят также onclick -обработчик или onpropertychange . |
input |
Событие срабатывает только на текстовых элементах. Оно не ждет потери фокуса, в отличие от change . |
В IE8- не поддерживается, в IE9 не работает при удалении символов. |
propertychange |
Только для IE10-. Универсальное событие для отслеживания изменения свойств элементов. Имя изменённого свойства содержится в event.propertyName . Используют для мгновенной реакции на изменение значения в старых IE. |
В IE9 не срабатывает при удалении символов. |
cut/copy/paste |
Срабатывают при вставке/копировании/удалении текста. Если в их обработчиках отменить действие браузера, то вставки/копирования/удаления не произойдёт. | Вставляемое значение получить нельзя: на момент срабатывания события в элементе всё ещё старое значение, а новое недоступно. |
Изменение: change, input
<input type="text" onchange="alert(this.value)">
<input type="button" value="Кнопка">
<input type="text"> oninput: <span id="result"></span>
<script>
var input = document.body.children[0];
input.oninput = function() {
document.getElementById('result').innerHTML = input.value;
};
</script>
JavaScript - события
By Alexey Kalyuzhnyi
JavaScript - события
- 2,861