Події форми. Події форми Додаткова інформація про подію
Минулої теми розглядалися події, що виникають при натисканні клавіш. У цьому темі ми розглянемо інші події форми. У тому числі надсилання форми на сервер.
Елемент у фокусі
Коли елемент форми виявляється у фокусі, виникає подія focus, а коли елемент виходить з фокусу, спрацьовує подію blur. Створимо поле для введення та виведемо в консоль текст при отриманні ним фокусу та при виході з фокусу:
HTML код:
Немає сенсу у використанні цих подій зміни стилю елемента. Для цього CSS існує псевдоклас focus.
Введення значення
Подія inputвиникає, коли користувач друкує текст у полі для введення. Воно спрацьовує при додаванні або видаленні кожного символу, а також при копіюванні тексту в полі для введення. У деяких браузерах воно працює незвичайно: при кожному введенні символу створюється подія blur, після цього виконується обробник події input, а потім створюється подія focus. Якщо обробників подій focus та blur немає, то в цьому немає проблеми. Але якщо вони є, вони спрацьовуватимуть при кожному додаванні символу.
Додамо на сторінку ще один тэг і виведемо його значення під час введення тексту:
HTML код:
JavaScript:
28 |
var newv = document.getElementById("new_value"); newv.onchange = function () ( console.log("Значення змінено на: "+newv.value); ); |
Відправлення форми
Подія submit спрацьовує при надсиланні форми на сервер. Воно використовується для перевірки даних, які користувач запровадив у форму. У обробнику перевіряються значення елементів форми, і якщо якісь значення введені неправильно, робиться скасування відправки форми. При цьому зазвичай виводиться повідомлення, в якому зазначається, що потрібно виправити.
Помістимо створені теги у форму та додамо кнопку відправки форми:
HTML код:
У попередніх прикладах елементи форми вже були знайдені, тому обробник повторний пошук не проводиться.
Якщо форма заповнена правильно, тобто у всіх полях є хоча б два символи, то браузер спробує запустити файл, вказаний в атрибуті action, і виникне помилка, тому що такого файлу немає. Але в цьому немає жодного ризику, тому не треба боятися перевіряти роботу скрипту. Якщо в одному з полів введено менше двох символів, з'явиться повідомлення та відправка буде скасована. Якщо перевірок досить багато, можна кожної перевірки виводити своє повідомлення і скасовувати відправку форми.
The input Event fires when the value of element is used to create interactive controls for web-based forms in order to accept data from the user; wide wireless of types of input data and control widgets are available, depending on device and user agent. "> , елемент представляє контроль, що забезпечує меню опцій">
Bubbles | Yes |
---|---|
Cancelable | No |
Interface | InputEvent |
Event handler property | GlobalEventHandlers.oninput |
HTML
JavaScript
const input = document.querySelector("input"); const log = document.getElementById("values"); input.addEventListener("input", updateValue); function updateValue(e) ( log.textContent = e.target.value; )Result
Specifications
Specification | Status |
---|---|
HTML Living Standard |
Living Standard |
Document Object Model (DOM) Level 3 Events Specification Definition of "input event" in that specification. |
Obsolete |
Browser compatibility
Компактність таблиці в цій сторінці генерується з структурованих даних. Якщо ви знайдете, щоб дізнатися про ваші дані, клацніть на https://github.com/mdn/browser-compat-data і пишуть.
Update compatibility data on GitHub
Desktop | Mobile | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Android webview | Chrome для Android | Firefox for Android | Opera for Android | Safari on iOS | Samsung Internet | |
input event | Chrome Full support Yes | Edge Full support 79 Full support 79 No support 12 - 79 Notes Notes Не supported on select , checkbox , or radio inputs. | Firefox Full support Yes | IE Partial support 9 |
У цій статті розглянемо методи, які jQuery надає веб-розробнику для обробки подій.
Для роботи з подіями у сценаріях JavaScript браузернадає API (наприклад, функцію addEventListener). Використовуючи цю функцію, ви можете вказати код, який необхідно виконати, коли браузер для зазначеного елемента генеруватиме подію.
Обробка подій за допомогою методів jQuery
Синтаксис функції onПеред тим як переходити до додавання елементів обробників подій, ці елементи спочатку необхідно отримати. Дізнатися про те, як знайти потрібні елементи на сторінці можна у статті jQuery - Вибір елементів.
У jQuery повісити подію (слухач подій) на певний елемент можна за допомогою функцій on і one, а також коротких записів on.
// функція on.on (events, handler); // функція one.one (events, handler); // events - подія чи список подій через прогалину, у разі настання яких необхідно виконати обробник (handler) // handler - функція (обробник події) // короткий запис функції on .event(handler); // event - назва події (можна використовувати для обробки лише тих подій, для яких у jQuery створено такий короткий запис)
Функція one відрізняється від on тільки тим, що вона виконує обробник при настанні вказаної події лише один раз.
Наприклад, додамо за допомогою функції on подію click для всіх елементів із класом btn:
// використання як оброблювача анонімної функції $(".btn").on("click", function() ( // дії, які будуть виконані при настанні події... console.log($(this).text() ));)); // використання звичайної функції як обробник var myFunction = function() ( console.log($(this).text()); ) $(".btn").on("click", myFunction);
Наведений вище код, записаний з використанням короткого запису функції on:
$(".btn").click(function() ( // дії, які будуть виконані при настанні події... console.log($(this).text()); ));
Додаткова інформація про подію
Під час обробки події ви можете дізнатися деяку додаткову інформацію про неї. Передача цієї інформації, саме об'єкта Event в обробник події здійснюється завжди у вигляді першого аргументу.
$("#demo").on("click", function(e)( // e – об'єкт Event, що містить додаткову інформацію про подію // часто використовуються властивості об'єкта Event e.preventDefault(); //скасувати виконання дії за замовчуванням e.stopPropagation(); //зупинити подальше спливання події // e.type – отримати тип події // e.target – посилання на елемент, на якому сталася подія // e.currentTarget – посилання на поточний елемент (для якого спрацював обробник).Ця властивість, як правило, дорівнює функції this. e.pageY – координати курсору щодо лівого верхнього кута документа ));
Простір імен
У jQuery після вказівки імені події ви можете додатково вказати простір імен.
Наприклад:
// подія click у просторі імен first $("#demo").on("click.first",function()( console.log("1 обробник події click"); )); // подія click у просторі імен second $("#demo").on("click.second",function()( console.log("2 обробник події click"); ));
Простір імен – це дуже зручна річ. Вона використовується, наприклад, коли вам необхідно викликати не всі події, а лише з певним ім'ям.
// викликати подію click у просторі імен first $("#demo").trigger("click.first"); // викликати подію click у просторі імен second $("#demo").trigger("click.second");
Також за його допомогою дуже просто видаляти певні події:
//видалити обробники події click у просторі імен first $("#demo").off("click.first"); //видалити обробники події click у просторі імен second $("#demo").off("click.second");
Опис та приклади використання функцій trigger та off розглядаються у статті трохи нижче.
Передача додаткових даних до оброблювача
При необхідності ви можете передати дані в обробник події (за допомогою додаткового аргументу функції on). Доступ до переданих даних усередині обробника здійснюється через об'єкт Event.
Здійснюється це так (приклад):
...
Як повісити кілька подій на один елемент
Приклад використання одного обробника для кількох (2 або більше) подій:
$("#id").on("keyup keypress blur change", function(e) ( console.log(e.type); // тип події )); // або так var myFunction = function() ( ... ) $("#id") .keyup(myFunction) .keypress(myFunction) .blur(myFunction) .change(myFunction);
Для кожної події своя функція:
$("#id").on(( mouseenter: function() ( // обробник події mouseenter... ), mouseleave: function() ( // обробник події mouseleave... ), click: function() ( / / обробник події click...)));
Приклад використання в jQuery кілька обробників (функцій) на одну подію:
$("#demo").click(function()( console.log("1 обробник події click"); )); $("#demo").click(function()( console.log("2 обробник події click"); ));
Наприклад, дізнатися в якій черзі виконуватимуться події можна так:
Var eventList = $._data($("#demo"), "events"); console.log(eventList);
Програмний виклик події
Для виклику події з коду в jQuery є два методи:
- trigger - викликає зазначену подію елемента.
- triggerHandler - викликає обробник події, при цьому сама подія не відбувається.
jQuery - Подія завантаження сторінки (ready)
Процес додавання до деякого елемента оброблювача події зазвичай здійснюється після завантаження сторінки, тобто. коли DOM дерево документа вже побудовано. Інакше при написанні обробників ви можете звернутися до елементів, яких ще немає на сторінці.
Найкоротший запис події завантаження сторінки в jQuery виглядає так:
$(function()( // дії, які необхідно виконати після завантаження документа...));
Але, можна використовувати і більш довгий запис:
$(document).ready(function()( // дії, які необхідно виконати після завантаження документа...));
jQuery - Подія завантаження (load)
Подія load браузер генерує елементу, коли він і всі вкладені в нього елементи були повністю завантажені. Ця подія призначена лише для елементів, у яких є URL: image , script , iframe і window .
Наприклад, виконати функцію, коли сторінка буде повністю завантажена (включаючи картинки):
$(window).on("load", function() ( // дії після повного завантаження сторінки...));
Наприклад, виведемо повідомлення в консоль, коли вказане зображення буде завантажено:
...
jQuery - Події миші
У jQuery для відстеження дій миші найчастіше використовують такі події:
- mousedown
- mouseup
- click
- mousemove
- wheel
- hover
- mouseenter
- mouseover
- mouseleave
- mouseout
jQuery - Подія клік (click)
Подія click є складною подією, вона виникає після генерування подій, переміщенихвниз і mouseup . Подія рухаєтьсяназад виникає, коли вказівник знаходиться над елементом і кнопка миші натиснута. Подія mouseup відбувається, коли вказівник знаходиться над елементом і кнопка миші відпущена. Подія click генерується, коли курсор знаходиться над елементом, а клавіша миші натиснута і відпущена. Ці події можуть отримувати будь-які HTML елементы.
Наприклад, повісимо обробник на подію onclick елемента window . При настанні цієї події обробник виводитиме номер натиснутої клавіші та координати курсору:
$(window).on("click", function(e) ( // обробка події click... console.log("Натиснута кнопка: " + e.which); //1 - ліва кнопка, 2 - середня кнопка, 3 - права console.log("Координати курсору: x = "+ e.pageX + "; y = "+ e.pageY); ));
Наприклад, повісимо подію onclick на всі елементи з класом btn:
$(".btn").on("click", function()( // код обробника події натискання кнопки...)); Короткий запис події на кліку: $(".btn").click(function()( ... ));
Наприклад, розберемо, як можна приховати блок через деякий час після події.
...
jQuery - Подія при наведенні (hover)
jQuery - Що являє собою подію hover
Подія при піднесенні курсору є складною і складається з 2 подій:
- входження (mouseenter, mouseover);
- Покидання (mouseleave, mouseout).
Події mouseenter і mouseleave в jQuery відрізняються від mouseover і mouseout тільки тим, що вони не виникають коли курсор відповідно входить і залишає внутрішні елементи елемента, що прослуховується. Іншими словами події mouseover і mouseout спливають, а mouseenter і mouseleave - ні.
Наприклад, змінимо колір елемента списку під час піднесення до нього курсора:
- Ручка
- Олівець
- Лінійка
Ті ж самі дії, але використанням mouseover і mouseout:
$("ul>li"). mouseover(function()( // при вході в елемент $(this).css("color","orange"); )). mouseout(function()( // при залишенні елемента $(this).css("color","black"); ));
Дані методи необов'язково використовувати разом, їх можна також застосовувати окремо.
Наприклад, підрахуємо кількість відвідувань елемента при настанні події "Навести мишею":
Замість використання mouseenter і mouseleave можна використовувати подію hover .
Наприклад, перепишемо наведений вище приклад, використовуючи hover:
$("ul>li").hover(function()( // при вході в елемент $(this).css("color","orange"); ), function()( // при залишенні елемента $( this).css("color","black"); ));
При використанні події hover в jQuery перший обробник використовується для завдання дій при входженні курсору в елемент (mouseenter), а другий - при залишанні (mouseleave).
Якщо вказати події hover один обробник, він буде виконуватися як обробки наведення миші, так її залишення.
Наприклад:
$("h1").hover(function()( console.log("Відбулося події входу в елемент або виходу з нього"); ));
jQuery - Подія руху миші
Подія мишіпереміщається до елемента, коли вказівник миші переміщується всередині нього. Будь-який HTML елемент може отримувати цю подію.
$(".target").mousemove(function(e) ( console.log("Викликаний обробник для події mousemove."); console.log("Координати щодо лівого верхнього кута документа: " + e.pageX + ", " + e.pageY); console.log("Координати курсору всередині мети: " + e.offsetX + ", " + e.offsetY); ));
jQuery - Подія коліщатка миші (wheel)
Прослуховування події прокручування коліщатка (wheel) мишки можна здійснити так:
$(window).on("wheel", function(e) ( // код обробника (наприклад)... console.log("Кількість прокручених пікселів: " + e.originalEvent.deltaY); if (e.originalEvent). deltaY< 0){ console.log("Прокручиваем вверх"); } else { console.log("Прокручиваем вниз"); } });
Дана подія на відміну від scroll генерується браузером тільки для коліщатка мишки, при цьому неважливо прокручується елемент чи ні, тобто. з ним можна працювати на елементах з overflow, рівним hidden. Ще одна відмінність полягає в тому, що wheel генерується до прокручування, а scroll - після неї.
jQuery – Події клавіатури
При натисканні клавіатури браузер генерує події в наступному порядку:
Keydown -> keypress -> keyup
- keydown (клавіша натиснута, але ще не відпущена);
- keypress (подія генерується для літер, цифр та інших клавіш, за винятком керуючих) – призначена для того, щоб отримати код символу (події keydown та keyup дозволяють дізнатися тільки про код клавіші, але не символу);
- keyup (генерується браузером під час відпускання клавіші).
Наприклад, напишемо обробник для прослуховування всіх подій, які відбуваються при натисканні клавіші:
...
Приклад, в якому показано, як можна прослухати подію keypress і дізнатися, чи натиснуто вказане поєднання клавіш:
$(document).keypress("c", function(e) ( if(e.ctrlKey) ( console.log("Натиснуто сполучення клавіш Ctrl+c"); ) ));
Приклад, як можна прослухати клавіші Ctrl+Enter:
$(document).keydown(function(e) ( // з підтримкою macOS X if ((e.ctrlKey || e.metaKey) && (e.keyCode == 13 || e.keyCode == 10))) ( / / ваші дії... ) )
Приклад, з використанням подій keydown та keyup:
...
jQuery – Події елементів форми
У jQuery можна виділити такі події для елементів форми і не тільки:
- focus (focusin)
- blur (фокус)
- change
- input (для текстових елементів форми)
- select
- submit
jQuery - Події отримання та втрати фокусу
Подія focus надсилається елементу, коли він отримує фокус. Ця подія генерується для елементів input , select і посилань (a href="..."), і навіть будь-яких інших елементів, які мають властивість tabindex . Отримання елементом фокусу зазвичай здійснюється за допомогою кліка або натискання клавіші Tab на клавіатурі. Подія focus не спливає.
Крім focus є ще схожа подія, називається вона focusin. На відміну від focus, ця подія спливає, і вона може, наприклад, використовуватися для виявлення події фокусу батьківськими елементами.
Подія blur надсилається елементу, коли він втрачає фокус. Так само як і focus, подія blur має схожу подію focusout. Ця подія відрізняється від blur тим, що вона може спливати. Цю можливість можна використовувати, наприклад, щоб одержати його на батьківських елементах, а не тільки на тому елементі, який його викликав (target).
Наприклад, при отриманні елементом divподії фокусу встановимо йому тло помаранчевого кольору:
...
Таке саме виконати з допомогою подій focus і blur не вийде, т.к. вони не спливають:
$("#demo input"). focus(function()( $(this).parent().css("background-color","orange"); )) .blur(function()( $(this).parent().css("background -color","inherit"); ));
jQuery - Подія зміни (change)
Подія change призначена для реєстрації зміни значення елементів input, textarea і select. Для елементів select , checkboxes і radio кнопок ця подія виникає відразу (тобто як тільки користувач робить якийсь вибір). Але для інших елементів ця подія не відбуватиметься доти, доки цей елемент не втратить фокус.
Приклад використання події change для стеження стану елемента checkbox . Доступність кнопки визначатиме залежно від того в якому стані (checked чи ні) знаходитиметься прапорець:
...
Приклад, в якому розглянемо, як отримати значення елемента select при його зміні:
...
Приклад, в якому розглянемо, як отримати всі вибрані елементи select при його зміні:
...
Приклад програмного виклику події change для select:
// list - id елемента change $("#list"). trigger("change"); // Короткий запис $("#list").change(); // виклик лише оброблювача події change $("#list"). triggerHandler("change");
Приклад використання події зміни зміни для отримання значення елемента input:
...
Але крім події change є ще подія input для текстових елементів. Ця подія на відміну від change генерується відразу, а не після того, як даний елементвтратить фокус.
Наприклад, використання події введення для отримання значення елемента input:
$("input").on("input",function()( var value = $(this).val(); console.log(value); ));
Приклад, в якому представлений один із способів отримання значення елемента:
...
Приклад, у якому розглянемо, як з допомогою події change отримати значення обраного елемента input з type , рівним radio:
Windows Linux macOS ...
jQuery - Подія вибору (select)
Подія вибору select генерується браузером, коли користувач усередині елементів input з type="text" або textarea виділяє текст.
$("#target").select(function() ( console.log("Викликаний обробник події select"); ));
jQuery – Подія відправлення форми (submit)
Подія submit виникає у елемента, коли користувач намагається надіслати форму. Ця подія може бути додана лише до елементів form .
Приклад використання події submit:
...
Програмний виклик відправлення форми:
$("#feedback").submit(); $("#feedback").trigger("submit");
jQuery - Подія прокручування (scroll)
Для відстеження стану скролінгу в jQuery використовується подія scroll.
Наприклад, повісимо на подію прокручування сторінки функцію, яка буде відображати елемент з класом scrollup , якщо величина прокручування більше 200px і приховувати його, якщо значення прокручування менше цієї величини.
// короткий запис функції $(window).scroll(function() ( // дії при скролінгу сторінки... if ($(this).scrollTop()>200) ( $(".scrollup").fadeIn() ; ) else ( $(".scrollup").fadeOut(); ) ));
jQuery - Подія зміни розмірів вікна (resize)
Для прослуховування події зміни вікна браузера використається resize:
Наприклад, створимо обробник, який буде при зміні вікна браузера виводити на кінець сторінки її ширину та висоту:
$(window).resize(function() ( $("body").append("
Ширина x Висота = "+ window.innerWidth + "x" + window.innerHeight + "
"); });jQuery - Скасування стандартної поведінки події
Деякі елементи HTML мають стандартну поведінку. Наприклад, коли користувач натискає на посилання, він переходить на адресу вказану в атрибуті href . Якщо вам ця дія не потрібна, то її можна скасувати. Для скасування стандартної поведінки необхідно викликати в обробнику цієї події метод preventDefault об'єкта event.
Наприклад, скасуємо стандартну поведінку всіх посилань на сторінці, що мають клас service:
$("a.service").on("click",function(e)( //скасовуємо стандартну дію браузера e.preventDefault(); // дії, які виконуватиме посилання... ));
Що таке спливання і як його зупинити
Окрім скасування стандартної дії, у механізмі подій є ще таке поняття як випливання. Воно полягає в тому, що коли браузер генерує подію, він це робить не тільки для поточного елемента (мети), але і для всіх його нащадків включаючи батька:
Поточний елемент (мета) -> батьківський елемент мети -> прабатьківський елемент -> ... -> document -> window
У jQuery бувають сценарії, коли в представленому ланцюжку у якогось елемента те саме є обробник для цієї події, яку виконувати не потрібно. І щоб ця подія не поширилася на цей елемент, її необхідно зупинити. Для цього в обробнику потрібного елемента необхідно викликати метод stopPropagation об'єкта event. Після виклику цього методу подія зупиниться і не спливатиме.
Наприклад, необхідно, щоб при піднесенні курсору до елемента з класом mark його вміст ставав помаранчевим кольором.
В даному випадку якщо не вказувати метод stopPropagation, то при піднесенні курсору до елемента span з класом mark дана подія виникне не тільки у нього, але й у всіх батьківських елементів. А це в цьому прикладі призведе до того, що зміниться колір не тільки тексту, укладеного в span, але й абзацу.
Якщо вам необхідно скасувати стандартну поведінку браузера і зупинити спливання події, то в jQuery замість виклику цих двох методів можна просто повернути як результат функції значення false .
$("a").on("click", function(e)( //e.preventDefault(); //e.stopPropagation(); ... return false; ));
Додавання подій до динамічно створених об'єктів
Для того, щоб повісити подію на елемент, якого ще немає, можна використовувати наступну конструкцію функції on:
$(document).on(eventName, selector, handler); // document або будь-який інший існуючий батьківський елемент // eventName - ім'я події // selector - селектор, що здійснює фільтрацію нащадків, для яких необхідно запустити обробник події // handler - обробник події
Цю дію можна здійснити тому, що подія спливає, і, отже, виникає в усіх предків цього елемента. А об'єкт, до якого спливають події на сторінці, є document . Тому здебільшого обирають саме його. Після цього знаючи селектор, функція on може програмно відібрати серед елементів (елемента, який викликав цю подію (target) та всіх її предків, включаючи батька) ті, які відповідають йому. І потім для всіх відібраних елементів виконати вказаний у функції on обробник. Дії, за допомогою яких обробка події переноситься на інший елемент (предок), називається в jQuery ще процесом делегування події.
Наприклад, додамо подію до елемента, якого ще немає на сторінці:
Делегування може застосовуватися не тільки для обробки подій динамічно створених об'єктів, але й для того, щоб не прив'язувати до кожного елемента (якщо їх на сторінці може бути багато) обробник.
Наприклад, заборонимо в коментарях переходити за зовнішніми посиланнями (такі дії перенаправлятимемо на сторінку away):
$(document).on("click","#comment a",function(e) ( if(!(location.hostname === this.hostname || !this.hostname.length))) ( e.preventDefault( );location.href="away?link="+encodeURIComponent($(this).attr("href")); ) ));
jQuery - Видалити обробник події
Видалення обробників події здійснюється за допомогою методу off. При цьому за допомогою нього можна видалити ті обробники, які додані за допомогою методу on .
Виклик методу off без аргументів зніме у зазначених елементів усі додані до них обробники подій.
Наприклад, відключимо всі обробники у елементів із класом link:
$(".link").off();
Наприклад, видалимо подію click у всіх елементів із класом link:
$(".link").off("link");
Спеціальний селектор (**) дозволяє видалити лише делеговані події зі збереженням не делегованих:
$(".link").off("click","**");
Видалити лише зазначені делеговані події (за допомогою селектора):
// додавання делегованої події $("ul").on("click","li", function()( // виводимо в консоль контент елемента li console.log($(this).text()); )) ; // Видалення делегованої події $("ul").off("click","li");
Видалити всі обробники openModal делегованої події click у просторі імен modal для елементів з класом show:
$("body").on("click.modal", ".show", openModal);
Створення події користувача
Для створення подій користувача в jQuery використовуються методи on і trigger .
Принцип створення спеціальної події jQuery розглянемо за допомогою такого прикладу: