Події document javascript. Події JavaScript. Події onclick javaScript і три способи обробки подій
Типи подій
На зорі розвитку Всесвітньої павутини веб-розробникам доводилося мати справу лише з невеликою кількістю подій: "load", "click", "mouseover" та іншими. Ці старі типи подій добре підтримуються всіма браузерами. У міру розвитку веб-платформи до неї були включені потужніші прикладні інтерфейси, а кількість подій суттєво збільшилася. Не існує стандарту, який визначав би повний набір подій, і кількість подій, що підтримуються, продовжує швидко збільшуватися. Ці нові події визначаються у двох джерелах:
Специфікація DOM Level 3 Events, яка після довгих років застою стала активно розроблятися під егідою консорціуму W3C.
Безліч нових прикладних інтерфейсів у специфікації HTML5 (і у пов'язаних з нею додаткових специфікаціях) визначають нові події, що використовуються, наприклад, для керування історією відвідувань, механізмом drag-and-drop (перетягнув та покинув), обміну повідомленнями між документами та програвання аудіо- та відеороликів.
Зверніть увагу, що багато нових типів подій поки що не отримали широкої підтримки і визначаються стандартами, які ще знаходяться на стадії проектування. Події, які вам найчастіше доведеться використовувати у своїх веб-додатках, зазвичай ставляться до категорії давно існуючих та підтримуваних усіма браузерами: це події для роботи з мишею, клавіатурою, HTML-формами та об'єктом Window. Ці події ми розглянемо.
Події завантаження документа
Більшість веб-застосунків абсолютно необхідно, щоб веб-браузер повідомляв їх про момент, коли закінчиться завантаження документа і він буде готовий для виконання операцій над ним. Цій меті служить подія loadв об'єкті Window. Подія load порушується лише після того, як документ та всі його зображення будуть повністю завантажені. Однак, зазвичай сценарії можна запускати відразу після синтаксичного аналізу документа, до того як будуть завантажені зображення. Можна суттєво скоротити час запуску веб-програми, якщо починати виконання сценаріїв за подіями, відмінними від load.
Подія DOMContentLoadedзбуджується, як тільки документ буде завантажено, розібраний синтаксичним аналізатором, і будуть виконані всі відкладені сценарії. До цього моменту зображення та сценарії з атрибутом async можуть продовжувати завантажуватись, але сам документ вже буде готовий до виконання операцій. Ця подія вперше була введена в Firefox і згодом була запозичена всіма іншими виробниками браузерів, включаючи корпорацію Microsoft, яка додала підтримку цієї події в IE9. Незважаючи на приставку DOM в імені, ця подія не є частиною стандарту моделі подій DOM Level 3 Events, але стандартизована специфікацією HTML5.
Під час завантаження документа змінюється значення властивості document.readyState. Кожна зміна значення цієї властивості в IE супроводжується подією readystatechange в об'єкті Document, завдяки чому в IE цю подію можна використовувати для визначення моменту появи стану complete. Специфікація HTML5 стандартизує подію readystatechange, але наказує збуджувати його безпосередньо перед подією load, тому не зовсім зрозуміло, в чому полягає перевага події readystatechange перед load.
У прикладі нижче визначається функція whenReady(). Функція, що передається функції whenReady(), викликається (як метод об'єкта Document) відразу, як тільки документ буде готовий до виконання операцій. whenReady() чекає появи подій DOMContentLoaded і readystatechange і використовує подію load тільки як запасний варіант, на випадок, якщо вона буде задіяна в старих браузерах, які не підтримують перші дві події. Функція whenReady() використовуватиметься у деяких сценаріях, наступних далі:
/* Передайте функції whenReady() свою функцію, і вона викличе її (як метод об'єкта документа), як тільки завершиться синтаксичний аналіз документа і він буде готовий до виконання операцій. Зареєстровані функції викликаються при першій же події DOMContentLoaded, readystatechange або load. Як тільки документ буде готовий і будуть викликані всі функції, колиReady() негайно викличе всі функції, які були передані їй. */ var whenReady = (function() ( // Ця функція повертається функцією whenReady() var funcs = ; // Функції, які повинні викликатися за подією var ready = false; // Отримає значення true при виклику функції handler // Обробник подій , який викликається, як тільки документ // буде готовий до виконання операцій function handler(e) ( // Якщо обробник вже викликався, просто повернути управління if (ready) return; // Якщо ця подія readystatechange і стан набула значення, // відмінне від "complete", значить, документ поки не готовий if (e.type==="readystatechange" && document.readyState !== "complete") return;// Викликати всі зареєстровані функції.// Зверніть увагу, що тут кожен раз перевіряється значення // властивості funcs.length, якщо одна з викликаних функцій // зареєструє додаткові функції.for(var i = 0; i
Події миші
З мишею пов'язано чимало подій. Усі вони перелічені у таблиці нижче. Всі події миші, окрім mouseenter і mouseleave, спливають. Для подій click, що виникають у посиланнях та кнопках відправки форм, передбачаються дії за замовчуванням, які можна скасувати. Теоретично є можливість скасувати подію contextmenu та запобігти появі контекстного меню, але деякі браузери мають параметри налаштування, які роблять цю подію невідмінною.
Тип | Опис |
---|---|
click | Високорівнева подія, що збуджується, коли користувач натискає та відпускає кнопку миші або іншим чином активує елемент. |
contextmenu | Подію, що скасовується, що збуджується перед виведенням контекстного меню. Поточні браузери виводять контекстне менюпо клацанню правої кнопки миші, тому цю подію можна також використовувати як подія click. |
dblclick | Збуджується, коли користувач виконує подвійне клацання. |
mousedown | Порушується, коли користувач натискає кнопку миші. |
mouseup | Порушується, коли користувач відпускає кнопку миші. |
mousemove | Порушується, коли користувач переміщає вказівник миші. |
mouseover | Порушується, коли вказівник миші розміщується над елементом. Властивість пов'язаного з Target (або від Element в IE) визначає елемент, з якого був переміщений покажчик миші. |
mouseout | Порушується, коли вказівник миші залишає елемент. Властивість відносятьсяТаргот (або доElement в IE) визначає елемент, на який був переміщений покажчик миші. |
mouseenter | Подібно до mouseover, але не спливає. Вперше з'явилося в IE і було стандартизовано HTML5, але поки підтримується не всіма браузерами. |
mouseleave | Подібно mouseout, але не спливає. Вперше з'явилося в IE і було стандартизовано HTML5, але поки підтримується не всіма браузерами. |
Об'єкт, що передається обробникам подій від миші, має властивості clientXі clientY, Визначальні координати покажчика щодо вікна. Щоб перетворити їх на координати документа, до них необхідно додати позиції смуг прокручування вікна.
Властивості altKey, ctrlKey, metaKeyі shiftKeyвизначають стани різних клавіш-модифікаторів, які могли утримуватися в натиснутому стані в момент події: з їх допомогою можна відрізняти просте клацання від клацання з натиснутою клавішею Shift, наприклад.
Властивість buttonвизначає, яка кнопка миші утримувалася у стані на момент події. Однак різні браузери записують у цю властивість різні значення, тому його складно використовувати переносним способом.
Деякі браузери збуджують подію click лише у випадку клацання лівою кнопкою. Тому, якщо потрібно обробляти клацання іншими кнопками, слід використовувати події, що рухаютьсявнизу та миші. Подія contextmenu зазвичай сигналізує про те, що було виконано клацання правою кнопкою, але, як зазначалося вище, в обробниках цієї події не завжди можливе запобігти появі контекстного меню.
У прикладі нижче демонструється функція drag(), яка при виклику з обробника події mousedown дозволяє користувачеві перетягувати мишею абсолютно позиціоновані елементи документа. Функція drag() працює з обома моделями подій, DOM та IE.
Функція drag() приймає два аргументи. Перший - елемент, що перетягується. Це може бути елемент, в якому виникла подія, що міститьсявниз, і містить його елемент (наприклад, можна дати користувачеві можливість схопити мишею елемент, який виглядає як заголовок вікна, і перетягнути його елемент, який виглядає як вікно). Однак у будь-якому випадку це має бути елемент документа, абсолютно позиціонований з допомогою CSS-атрибут position. Другий аргумент - об'єкт події, отриманий з подією, що мусивнаступити:
/* drag() - перетягування абсолютно позиціонованих HTML-елементів. Ця функція повинна викликатися з оброблювача події наобсяг. Наступні події мишіможуть викликати переміщення зазначеного елемента. Подія mouseup буде завершувати переміщення. Ця реалізація діє в обох моделях подій, стандартної та IE. Використовує функцію getScrollOffsets(). Аргументи: elementToDrag: елемент, що прийняв подію, вмикаєтьсявміст або містить його елемент. Цей елемент повинен мати абсолютну позиціонування. Значення його властивостей style.left та style.top будуть змінюватися при переміщенні вказівника миші користувачем. event: об'єкт Event, отриманий обробником події, що минуввласним. */ function drag(elementToDrag, event) ( // Перетворити початкові координати вказівника миші на координати документа var scroll = getScrollOffsets(); // Допоміжна функція, оголошена нижче var startX = event.clientX = scroll.x; var start clientY + scroll.y;// Початкові координати (щодо початку документа) елемента, який // буде переміщатися. var origY = elementToDrag.offsetTop;// Знайти відстань між точкою події mousedown і верхнім лівим кутом елемента.// Ця відстань буде враховуватися при переміщенні покажчика миші.var deltaX = startX - origX; подій mousemove і mouseup, // які підуть за подією mousedown.if (document.addEventListener) ( // Стандартна модель подій // Зареєструвати перехоплюючі обробники в документі document.addEventListener("mousemove", moveHandler, true); document.addEventListener("mouseup", upHandler, true); ) else if (document.attachEvent) ( // Модель подій IE для IE5-8 // У моделі подій IE перехоплення подій здійснюється викликом // методу setCapture() елемента. elementToDrag.setCapture(); elementToDrag.attachEvent("onmousemove", moveHandler), elementToDrag.attachEvent("onmouseup", upHandler); // Інтерпретувати втрату перехоплення подій миші як подія .stopPropagation) event.stopPropagation(); // Стандартна модель else event.cancelBubble = true; // IE // Запобігти виконанню дій, передбачених за умовчанням. if (event.preventDefault) event.preventDefault(); // Стандартна модель else event.returnValue = false; // IE /* Цей обробник перехоплює події способівпереміщення, що виникають у процесі перетягування елемента. Він відповідає за рух елемента. */ function moveHandler(e) ( if (!e) e = window.event; // Модель подій IE // Перемістити елемент у позицію покажчика миші з урахуванням позицій // смуг прокручування та зміщень щодо початкового клацання. var scroll = getScrollOffsets( ), elementToDrag.style.left = (e.clientX + scroll.x - deltaX) + "px"; elementToDrag.style.top = (e.clientY + scroll.y - deltaY) + "px"; // І перервати подальше поширення події if (e.stopPropagation) e.stopPropagation(); // Стандартна модель else e.cancelBubble = true; // IE ) /* Цей обробник перехоплює заключну подію mouseup, яка завершує операцію перетягування. */ function upHandler(e) ( if (!e) e = window.event; // Модель подій IE // Видалити перехоплюючі обробники подій. if (document.removeEventListener) ( // Модель подій DOM document.removeEventListener("mouseup") , upHandler, true); "onmouseup", upHandler); elementToDrag.detachEvent("onmousemove", moveHandler); elementToDrag.releaseCapture(); ) // І перервати подальше поширення події. e.cancelBubble = true; // IE ) ) // Повертає поточні позиції смуг прокручування у вигляді властивостей x та y об'єкта function getScrollOffsets(w) ( // Використовувати вказане вікно або поточне // якщо функція викликана без аргументу w = w | window // Наступний спосіб працює у всіх браузерах, крім IE версії 8 і нижче if (w.pageXOffset! = null) return (x: w.pageXOffset, y:w.pageYOffset); // Для IE (та інших браузерів) у стандартному режимі var d = w.document; if (document.compatMode == "CSSICompat") return (x: d.documentElement.scrollLeft, y: d.documentElement.scrollTop); // Для браузерів у режимі сумісності return (x: d.body.scrollLeft, y: d.body.scrollTop); )
Наступний фрагмент демонструє порядок використання функції drag() у HTML-файлі:
Це тест. Перевірка, перевірка, перевірка.
Найважливішим тут є атрибут onmouseown у вкладеному елементі
Події введення тексту
Браузер підтримує три старі події введення з клавіатури. Події keydown та keyup є низькорівневими подіями та розглядаються в наступному розділі. Однак подія keypressє високорівневим, що повідомляє, що було введено друкований символ.
Проект специфікації DOM Level 3 Events визначає більш узагальнену подію textinputгенерується у відповідь на введення тексту, незалежно від того, яким способом він був введений.
З пропонованим подією textinput і реалізованим в даний час подією textInput передається простий об'єкт події, що має властивість data, що зберігає введений текст. (Інша пропонована специфікацією властивість, inputMethod, повинна визначати джерело введення, але воно поки не реалізовано.) У разі введення з клавіатури властивість data зазвичай міститиме єдиний символ, але при введенні з інших джерел у ньому може міститися безліч символів.
Об'єкт події, що передається з подією keypress, має складнішу організацію. Подія keypress являє собою введення єдиного символу. Цей символ міститься в об'єкті події у вигляді числового значення кодового пункту Юнікоду і, щоб перетворити його на рядок, необхідно використовувати метод String.fromCharCode(). У більшості браузерів кодовий пункт символу зберігається у властивості keyCodeоб'єкт події. Однак з історичних причин у Firefox замість нього використовується властивість charCode.
У більшості браузерів подія keypress порушується тільки при введенні символу, що друкується. Однак у Firefox подія keypress порушується також для символів, що не друкуються. Щоб відрізнити ці два випадки (і проігнорувати символи, що не друкуються), можна перевірити, чи існує властивість charCode об'єкта події і чи містить вона значення 0.
Події textinput, textInput і keypress можна скасувати, щоб запобігти введенню символу. Тобто, ці події можна використовувати для фільтрації введення. Наприклад, можна запобігти введенню символів алфавіту в поле, призначене для введення числових даних.
У прикладі нижче демонструється модуль на мовою JavaScript, Що реалізує такого роду фільтрацію. Він шукає елементи із додатковим (нестандартним) атрибутом data-allowed-chars. Реєструє обробники подій textinput, textInput та keypress для всіх знайдених елементів та обмежує можливість введення символами регулярного вираження, заданими в атрибуті data-allowed-chars:
/* Фільтрування введення для елементів Цей модуль шукає всі елементи у документі, що мають атрибут "data-allowed-chars". Реєструє обробники подій keypress, textinput та textInput для цих елементів, щоб обмежити набір допустимих для введення символів, щоб дозволити вводити лише символи, вказані в атрибуті. Якщо елемент також має атрибут "data-messageid", значення атрибуту інтерпретується як id іншого елемента документа. Якщо користувач вводить неприпустимий символ, елемент із зазначеним id робиться видимим. Якщо користувач вводить допустимий символ, елемент із повідомленням ховається. Цей елемент з повідомленням призначається для виведення пояснень, чому введення користувача було відкинуто. Його оформлення необхідно реалізувати за допомогою CSS так, щоб він спочатку був невидимий. */ whenReady(function () ( // Викликає цю функцію, коли документ буде завантажений // Знайти всі елементи var inputelts = document.getElementsByTagName("input"); // Обійти їх у циклі for (var i = 0; i< inputelts.length; i++) { var elt = inputelts[i]; // Пропустить элементы, не являющиеся текстовыми полями ввода // и не имеющие атрибута data-allowed-chars if (elt.type != "text" || !elt.getAttribute("data-allowed-chars")) continue; // Зарегистрировать наш обработчик события в этом элементе input // keypress старое событие и реализовано во всех браузерах. // textInput поддерживается в Safari и Chrome с 2010 года. // textinput версия проекта стандарта "DOM Level 3 Events". if (elt.addEventListener) { elt.addEventListener("keypress", filter, false); elt.addEventListener("textInput", filter, false); elt.addEventListener("textinput", filter, false); } // textinput не поддерживается версиями IE, в которых не реализован // метод addEventListener() else { elt.attachEvent("onkeypress", filter); } } // Обработчик событий keypress и textInput, фильтрующий ввод пользователя function filter(event) { // Получить объект события и целевой элемент target var e = event || window.event; // Модель стандартная или IE var target = e.target || e.srcElement; // Модель стандартная или IE var text = null; // Введенный текст // Получить введенный символ или текст if (e.type === "textinput" || e.type === "textInput") text = e.data; else { // Это было событие keypress // Введенный печатаемый символ в Firefox сохраняется в свойстве charCode var code = e.charCode || e.keyCode; // Если была нажата какая либо функциональная клавиша, не фильтровать ее if (code < 32 || // Управляющий символ ASCII e.charCode == 0 || // Функциональная клавиша (в Firefox) e.ctrlKey || e.altKey) // Удерживаемая клавиша-модификатор return; // Не фильтровать это событие // Преобразовать код символа в строку var text = String.fromCharCode(code); } // Отыскать необходимую нам информацию в этом элементе input var allowed = target.getAttribute("data-allowed-chars"); // Допустимые символы var messageid = target.getAttribute("data-messageid"); // Сообщение id if (messageid) // Если указано значение id, получить элемент var messageElement = document.getElementById(messageid); // Обойти в цикле символы во введенном тексте for(var i = 0; i < text.length; i++) { var c = text.charAt(i); allowed = new RegExp(allowed, "i"); // Создаем регулярное выражение if (c.search(allowed) == -1) { // Недопустимый символ? // Отобразить элемент с сообщением, если указан if (messageElement) messageElement.style.visibility="visible"; // Отменить действия по умолчанию, чтобы предотвратить вставку текста if (e.preventDefault) e.preventDefault(); if (e.returnValue) e.returnValue = false; return false; } } // Если все символы оказались допустимыми, скрыть элемент // с сообщением, если он был указан if (messageElement) messageElement.style.visibility = "hidden"; } });
Нижче показаний зразок розмітки HTML, який використовує цей модуль:
На малюнку нижче показано використання цієї форми. Тут після введення імені я вставив цифру, яка була автоматично заблокована і з'явилося попереджувальне повідомлення:
Події keypress і textinput генеруються безпосередньо перед фактичною вставкою нового тексту в елемент документа, що має фокус введення, завдяки чому обробники цих подій можуть запобігти вставці тексту, скасувавши подію.
Браузери також реалізують подію input, що збуджується після вставлення тексту в елемент. Цю подію не можна скасувати і відповідний об'єкт події не містить інформації про вставлений текст - вона просто повідомляє про те, що текстовий вміст елемента змінилося. Якщо, наприклад, потрібно забезпечити введення лише символів у верхньому регістрі, можна визначити обробник події input, як показано нижче:
Подія input стандартизована у специфікації HTML5 і підтримується всіма сучасними браузерамикрім IE. Схожого ефекту в IE можна досягти, виявляючи зміну значення властивості value текстового елемента введення за допомогою нестандартної події propertychange.
Події клавіатури
Події keydownі keyupзбуджуються, коли користувач натискає чи відпускає клавішу на клавіатурі. Вони генеруються для кнопок-модифікаторів, функціональних кнопок і алфавітно-цифрових кнопок. Якщо користувач утримує клавішу натиснутою настільки довго, що вмикається режим автоповтору, буде згенеровано безліч подій keydown, перш ніж з'явиться подія keyup.
Об'єкт події, що відповідає цим подіям, має властивість keyCodeіз числовим значенням, яке визначає натиснуту клавішу. Для клавіш, що генерують друковані символи, у випадку властивість keyCode містить кодовий пункт Юнікоду, відповідний основному символу, зображеному на кнопці. Клавіші з літерами завжди генерують значення keyCode, що відповідають символам у верхньому регістрі, незалежно від стану клавіш Shift, оскільки саме такі символи зображені на клавішах.
Аналогічно цифрові клавіші завжди генерують значення keyCode, що відповідають цифровим символам, зображеним на клавішах, навіть якщо при цьому ви утримували натиснутою клавішу Shift, щоб ввести розділовий знак. Для клавіш, що не відповідають друкованим символам, властивість keyCode матиме деяке інше значення. Ці значення властивості keyCode ніколи не були стандартизовані. Однак у різних браузерахвони відрізняються не так сильно, щоб не можна було забезпечити переносимість.
Подібно до об'єктів подій миші, об'єкти подій клавіатури мають властивості altKey, ctrlKey, metaKeyі shiftKey, які набувають значення true, якщо в момент виникнення події утримувалася відповідна клавіша-модифікатор.
Події keydown та keyup, а також властивість keyCode використовуються вже більше десяти років, але вони так і не були стандартизовані. Проект стандарту DOM Level 3 Events стандартизує типи keydown та keyup подій, але не стандартизує властивість keyCode. Натомість він визначає нову властивість key, яка повинна містити назву клавіші у вигляді рядка. Якщо клавіша відповідає символу друку, властивість key повинна містити цей символ. Для функціональних клавіш властивість key повинна мати такі значення, як F2, Home або Left.
На момент написання цих рядків властивість key, що визначається стандартом DOM Level 3 Events, ще не було реалізовано в жодному браузері. Проте браузери на базі механізму Webkit, Safari та Chrome визначають в об'єктах цих подій властивість keyIdentifier. Для функціональних клавіш, подібно до властивості key, властивість keyIdentifier містить не число, а рядок з ім'ям клавіші, таким як Shift або Enter. Для клавіш, що відповідають символам друку, ця властивість містить менш зручне у використанні рядкове представлення кодового пункту Юнікоду символу. Наприклад, клавіші A відповідає значення U+0041.
Нижче наведено клас Keymap, який відображає ідентифікатори комбінацій клавіш, такі як PageUp, Alt_Z і ctrl+alt+shift+F5 у функції на мові JavaScript, що викликаються у відповідь на натискання цих комбінацій. Визначення прив'язок клавіш передаються конструктору Keymap() у формі об'єкта JavaScript, імена властивостей якого відповідають ідентифікаторам комбінацій клавіш, а значення цих властивостей містять посилання функції-обробники. Додавання та видалення прив'язок здійснюється за допомогою методів bind() та unbind().
Встановлюється об'єкт Keymap в HTML-елемент (зазвичай об'єкт Document) з допомогою методу install(). Під час встановлення об'єкта Keymap у цьому елементі реєструється обробник події keydown. Щоразу, коли натискається клавіша, обробник перевіряє наявність функції, що відповідає цій комбінації. Якщо функція є, вона викликається.
Обробник події keydown використовує властивість key, що визначається стандартом DOM Level 3 Events, якщо вона існує. В іншому випадку він намагається використовувати Webkit-властивість keyIdentifier. І як запасний варіант, обробник використовує нестандартну властивість keyCode:
// Функція конструктор function Keymap(bindings) ( this.map = (); // Визначити відображення ідентифікатор->обробник if (bindings) ( // Скопіювати в нього початкову карту прив'язок for(name in bindings) this.bind(name, bindings);))) // Зв'язує зазначений ідентифікатор клавіші із зазначеною функцією обробником Keymap.prototype.bind = function(key, func) (this.map = func;); // Видаляє прив'язку для вказаного ідентифікатора клавіші Keymap.prototype.unbind = function(key) (delete this.map;); // Встановлює цей об'єкт Keymap у вказаний HTML-елемент Keymap.prototype.install = function(element) ( var keymap = this; // Визначити функції обробника події function handler(event) ( return keymap.dispatch(event, element); ) // Встановити її if (element.addEventListener) element.addEventListener("keydown", handler, false);else if (element.attachEvent) element.attachEvent("onkeydown", handler); // Цей метод делегує обробку події клавіатури, спираючись на прив'язки Keymap.prototype.dispatch = function(event, element) ( // Спочатку немає імен клавіш-модифікаторів, ні імені клавіші var modifiers = ""; var keyname = null; / / Сконструювати рядки модифікаторів у канонічному вигляді із символів // у нижньому регістрі, розташувавши їх в алфавітному порядку if (event.altKey) modifiers += "alt_"; .metaKey) modifiers += "meta_"; if (event.shiftKey) modifiers += "shift_"; // Ім'я клавіші легко отримати, якщо реалізовано властивість key, // визначається стандартом DOM Level 3: if (event.key) keyname = event.key;// Для отримання імен функціональних клавіш в Safari і Chrome можна // використовувати властивість keyIdentifier else if(event.keyIdentifier && event.keyIdentifier.substring(0,2) !== "U+") keyname = event. keyIdentifier;// В іншому випадку можна використовувати властивість keyCode // і відображення коду > ім'я нижче else ke yname = Keymap.keyCodeToKeyName; // Якщо ім'я клавіші вдалося визначити, просто проігнорувати подію // і повернути управління. if (!keyname) return; // Канонічний ідентифікатор клавіші складається з імен модифікаторів // та імені клавіші в нижньому регістрі var keyid = modifiers + keyname.toLowerCase(); // Перевірити, чи є прив'язка даного ідентифікатора клавіші var handler = this.map; if (handler) ( // Якщо обробник для цієї клавіші, викликати його // Викликати функцію обробник var retval = handler.call(element, event, keyid); // Якщо обробник повернув false, скасувати дії за замовчуванням // і перервати спливання події if (retval === false) ( if (event.stopPropagation) event.stopPropagation(); // модель DOM else event.cancelBubble = true; // модель IE if (event.preventDefault) event.preventDefault(); / / DOM else event.returnValue = false; // IE) // Повернути значення, отримане від обробника return retval;))); // Допоміжна функція перетворення ідентифікатора клавіші на канонічну форму. // Нам необхідно перетворити ідентифікатор "meta" на "ctrl", щоб перетворити // ідентифікатор Meta-C на "Command-C" на комп'ютерах Macі "Ctrl-C" на всіх інших. Keymap.normalize = function(keyid) ( keyid = keyid.toLowerCase(); // У нижній регістр var words = keyid.split(/\s+|[\-+_]/); // Вичленувати модифікатори var keyname = words .pop();// keyname - останнє слово keyname = Keymap.aliases ||keyname;// Це псевдонім?words.sort(); .join("_"); // Об'єднати всі разом ) Keymap.aliases = ( // Відображення звичних псевдонімів клавіш у них // "офіційні" імена, що використовуються в DOM Level 3, і відображення кодів клавіш // в імена нижче. Ім'я та значення повинні складатися тільки із символів нижнього регістру "escape":"esc", "return":"enter", "delete":"del", "ctrl":"control", "space":"spacebar", "ins":"insert"); // Стара властивість keyCode об'єкта події keydown не стандартизована // Але наступні значення успішно можуть використовуватися в більшості браузерів і ОС. Keymap.keyCodeToKeyName = ( // Клавіші зі словами або стрілками на них 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Control", 18: "Alt", 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Spacebar", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 45: "Insert", 46: "Del", // Цифрові клавіші на основній клавіатурі (не на додатковій) 48: "0 ",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8", 57:"9", // Літерні клавіші. Зверніть увагу, що тут не розрізняються // символи верхнього та нижнього регістрів 65:"A", 66:"B", 67:"C", 68:"D", 69 : "E", 70: "F", 71: "G", 72: "H", 73: "I", 74: "J", 75: "K", 76: "L", 77:" M", 78: "N", 79: "O", 80: "P", 81: "Q", 82: "R", 83: "S", 84: "T", 85: "U" , 86:"V", 87:"W", 88:"X", 89:"Y", 90:"Z", // Цифрові клавіші на додатковій клавіатурі та клавіші зі розділовими знаками.// (Не підтримуються в Opera.) 96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7" ,104:"8", 105:"9",106:"Multiply", 107:"Add", 109:"S ubtract", 110:"Decimal", 111:"Divide", // Функціональні клавіші 112: F1, 113: F2, 114: F3, 115: F4, 116: F5, 117: F6, 118: F7, 119: F8, 120: "F9", 121: "F10", 122: "F11", 123: "F13", 125: "F14", 126: "F15", 127: "F16", 128: "F17" ", 129:"F18", 130:"F19", 131:"F20", 132:"F22", 134:"F23", 135:"F24", // Клавіші зі розділовими знаками для введення яких не потрібно // утримувати клавішу Shift. // Дефіс не може використовуватися таким способом, що переноситься: FF повертає // той же код, що і для клавіші Subtract 59:";", 61:"=", 186:";", 187:"=", // Firefox і Opera повертають 59,61 188:",", 190:".", 191:"/", 192:"`", 219:"[", 220:"\", 221:"]", 222: """);
Нижче наведено приклад використання об'єкта Keymap:
Window.onload = function() ( var keymap = new Keymap; // Створити новий об'єкт Keymap keymap.bind("ctrl+a", // Комбінація Ctrl+A function(event, keyid) ( alert("Ви натиснули: " + keyid) ));// Ще одна прив'язка Ctrl + Enter keymap.bind("ctrl+enter", function(event, keyid) (alert("Ви натиснули:" + keyid) ));keymap.install(document. body);// Встановлюємо об'єкт Keymap для всього документа);
Тема подій дуже важлива та дуже цікава. Завдяки їй можна робити дуже багато цікавих речей, від яких користувач буде в захваті. Подія у JavaScript- це певна дія, яка викликана або користувачем, або браузером. Наприклад, подією може бути клік миші по кнопці, рух миші, наведення фокусу на елемент, зміна значення в якомусь текстовому полі, зміна розмірів вікна браузера і таке інше.
Я підготував таблицю з усіма подіями (які я знаю, принаймні) у JavaScript. У ній Ви знайдете, по-перше, назву події, елементи, які можуть генерувати цю подію та опис самого події JavaScript.
Подія | Об'єкт | Причина виникнення |
Abort | Image | Переривання завантаження зображення |
Blur | Втрата фокусу елемента | |
Change | FileUpload, Select, Text, Textarea | Зміна значення |
Click | Area, Button, Checkbox, Document, Link, Radio, Reset, Submit | Клік миші на елементі |
DblClick | Area, Document, Link | Подвійний клік на елементі |
DragDrop | Window | Переміщення у вікно браузера |
Focus | Button, Checkbox, FileUpload, Frame, Layer, Password, Radio, Reset, Select, Submit, Text, Textarea, Window | Встановлення фокусування на елементі |
KeyDown | Натискання кнопки на клавіатурі | |
KeyPress | Document, Image, Link, Textarea | Утримання клавіші на клавіатурі |
KeyUp | Document, Image, Link, Textarea | Відпускання клавіші на клавіатурі |
Load | Document, Image, Layer, Window | |
MouseDown | Button, Document, Link | Натиснута кнопка миші |
MouseMove | Window | Миша в русі |
MouseOut | Area, Layer, Link | Миша виходить за межі елемента |
MouseOver | Area, Layer, Link | Миша знаходиться над елементом |
MouseUp | Button, Document, Link | Відпущено кнопку миші |
Move | Frame | Переміщення елемента |
Reset | Form | Скидання форми |
Resize | Frame, Window | Зміна розмірів |
Select | Text, Textarea | Виділення тексту |
Submit | Form | Передача даних |
Unload | Window | Вивантаження поточної сторінки |
Тепер розберемося з тим, як використовувати події у JavaScript. Існують так звані, обробники подій. Обробники подійтаки визначають, що відбуватиметься при виникненні певної події. Обробники подій у JavaScriptмає такий загальний вигляд:
OnНазваПодії
Тобто спочатку йде приставка. on", а далі назва подіїнаприклад такі обробники подій: onFocus, onClick, onSubmitі так далі. Думаю, тут питань не виникло. А тепер головне питання: " Як використовувати події у JavaScript?Область їх застосування величезна, і ми зараз з Вами розглянемо одне завдання. На сторінці є три посилання. Кожне з посилань відповідає за різний колір фону (припустимо, білий, жовтий і зелений). колір фону змінюється, коли миші відводять, колір фону повертається на колір за замовчуванням.
Білий
Жовтий
Зелений
Давайте розберемося із цим скриптом, а точніше з уже цілою HTML-сторінкоюз підтримкою JavaScriptі CSS(іншими словами, це приклад DHTML). Спочатку йдуть звичайні HTML-теги, з яких починається будь-яка HTML-сторінка. Далі ми створюємо стиль, в якому вимагаємо, щоб усі посилання на даній сторінці були синього кольору, підкреслені, і щоб вказівник миші на них був у вигляді "Pointer". Ви, можливо, скажіть: "А навіщо потрібно ставити стиль? Адже посилання і так точно такими ж і будуть". Правильно, посилання, але у нас посилань як таких немає (адже немає атрибуту hrefу тезі), тому вони будуть простим чорним текстом за умовчанням (щоправда, клацати по тексту теж можна). Тому стиль обов'язковий. Ви можете його прибрати та подивитися, що буде. А ще краще, поставте атрибут href(З будь-яким значенням, хоч порожнім) і поясніть, чому скрипт перестав працювати. Далі вже починається JavaScript. Ми створюємо змінну default_color, що відповідає за колір за промовчанням. Далі три функції:
Функція setTempColor()відповідає за тимчасову зміну кольору.
Функція setDefaultColor()відповідає за зміну кольору за промовчанням.
Функція defaultColor()встановлює колір тла за промовчанням.
Потім йдуть посилання з атрибутами у вигляді обробників подій. При наведенні мишки на посилання виникає подія MouseOverвідповідно, обробник події onMouseOverвикликає функцію setTempColor()та передає відповідний параметр. При знятті мишки з елемента виникає подія MouseOut, а далі викликається функція defaultColor(), яка робить колір тла колір за замовчуванням. І, нарешті, при натисканні мишки за посиланням ( обробник onClick) викликається функція setDefaultColor(), яка встановлює колір, заданий у параметрі кольором фону за замовчуванням. Як бачите, все досить просто.
Це був принцип використання подій у JavaScript, а далі все залежить лише від Вашої фантазії!
Обробка подій
Клієнтські програми на мові JavaScript засновані на моделі програмування, коли виконання програми керується подіями. У такому стилі програмування веб-браузер генерує подію, коли з документом чи деяким його елементом щось відбувається. Наприклад, веб-браузер генерує подію, коли завершує завантаження документа, коли користувач наводить вказівник на гіперпосилання або натискає клавішу на клавіатурі.
Якщо JavaScript-додаток цікавить певний тип події для певного елемента документа, він може зареєструвати одну або більше функцій, які будуть викликатися при виникненні цієї події. Майте на увазі, що це не є унікальною особливістю веб-програмування: всі програми з графічним інтерфейсомкористувача діють саме таким чином - вони постійно чекають, поки щось станеться (тобто чекають на події), і відгукуються на те, що відбувається.
Тип події- Це рядок, що визначає тип дії, що спричинив подію. Тип "mousemove", наприклад, означає, що користувач перемістив покажчик миші. Тип "keydown" означає, що була натиснута клавіша на клавіатурі. А тип «load» означає, що завершилося завантаження документа (або іншого ресурсу) з мережі. Оскільки тип події – це просто рядок, його іноді називають іменем події.
Мета події- це об'єкт, у якому виникла подія чи з яким ця подія пов'язана. Коли говорять про подію, зазвичай згадують тип і мету події. Наприклад, подія "load" об'єкта Window або подія "click" елемента
Обробник події- це функція, що обробляє, чи відгукується подія. Програми повинні зареєструвати свої функції обробників подій у веб-браузері, вказавши тип події та ціль. Коли у вказаному цільовому об'єкті виникне подія вказаного типу, браузер викличе обробник. Коли обробники подій викликаються для якогось об'єкта, ми іноді говоримо, що браузер «порушив» або «згенерував» подію.
Об'єкт події- це об'єкт, пов'язаний з певною подією та містить інформацію про цю подію. Об'єкти подій передаються функції обробника події як аргументу (крім IE8 і більше ранніх версійде об'єкт події доступний тільки у вигляді глобальної змінної event). Усі об'єкти подій мають властивість type, що визначає тип події, та властивість target, Що визначає мету події.
Для кожного типу події в пов'язаному об'єктіподії визначається набір властивостей. Наприклад, об'єкт, пов'язаний з подіями від миші, включає координати покажчика миші, а об'єкт, пов'язаний з подіями від клавіатури, містить інформацію про натиснуту клавішу і про натиснені клавіші-модифікатори. Для багатьох типів подій визначаються лише стандартні властивості, такі як type та target, і не передається ніякої додаткової корисної інформації. Для таких типів подій важлива сама наявність події, і жодна інша інформація не має значення.
Поширення події- це процес, під час якого браузер вирішує, у яких об'єктах слід викликати обробники подій. У разі подій, призначених для єдиного об'єкта (таких як подія "load" об'єкта Window), потреба в їх поширенні відсутня. Однак, коли певна подія виникає в елементі документа, вона поширюється, або спливає, вгору по дереву документа.