Магија иза ЈаваСцрипт препознавања догађаја
Догађаји су суштинска компонента кодирања за свакога ко је макар мало експериментисао са ЈаваСцрипт-ом. Писање кода као аддЕвентЛистенер покретање радњи на одређеним интеракцијама, као што је притискање дугмета или тастера, може бити познато искуство. Можда вас занима како ЈаваСцрипт увек препознаје да обрађује догађај, чак и у ситуацијама када име аргумента функције није декларисано као „догађај“.
Нарочито када се чини да објекат догађаја није експлицитно наведен, ово може бити збуњујуће. На пример, можда ћете бити знатижељни како претраживач одређује које информације ће дати вашој функцији и где догађај потиче од писања кода као што је доцумент.аддЕвентЛистенер("кеидовн", фунцтион(евент) {...}).
Систем управљања догађајима у ЈаваСцрипт-у садржи одређене скривене механизме. Без обзира на име параметра, претраживач аутоматски испоручује објекат догађаја функцији повратног позива када је прикачен слушалац догађаја. Ово гарантује да функција увек добија податке који су јој потребни за управљање догађајем.
Овај пост ће истражити унутрашње функционисање ЈаваСцрипт система догађаја и показати како се догађаји идентификују и прослеђују, без обзира на име аргумента.
Цомманд | Пример употребе |
---|---|
addEventListener() | Руковалац догађаја може да се повеже са одређеним типом догађаја (као што је „кеидовн“) користећи ову технику. Он осигурава да се догађај чује и, када се догоди, покреће назначену функцију. |
KeyboardEvent() | Конструктор догађаја на тастатури. То је корисно за тестирање јер омогућава програмерима да програмски реплицирају догађај са тастатуре (као што је кеидовн). |
event.key | Када се притисне тастер, ово својство добија вредност кључа из објекта догађаја. Означава одређени тастер који је притиснут, као што је „а“, „Ентер“ или „Схифт“. |
jest.fn() | Лажна функција коју генерише Јест функција. За симулацију позива функција и испитивање њиховог понашања без развоја целокупне логике, ово је посебно корисно у тестирању јединица. |
dispatchEvent() | Догађај се може ручно покренути на елементу користећи овај приступ. Користи се у читавим примерима за слање догађаја „кључног притиска“, који слушалац догађаја може пресрести и користити за тестирање. |
expect() | Екпецт(), компонента Јест оквира за тестирање, користи се за проверу да ли вредност или функција функционишу како је предвиђено. Проверава да ли је обрађивач догађаја у примеру позван са одговарајућим догађајем. |
try...catch | Одељак посвећен решавању грешака. Блок цатцх се покреће у случају да било који код унутар блока три изазове грешку, спречавајући скрипту да се поквари. |
console.error() | Поруке о грешци се штампају на конзоли помоћу ове команде. Користи се за евидентирање детаља о грешци унутар блока цатцх, што помаже у решавању проблема. |
Како ЈаваСцрипт аутоматски препознаје догађаје у слушаоцима догађаја
аддЕвентЛистенер је једна од најважнијих ЈаваСцрипт функција за управљање интеракцијама корисника. Уз помоћ ове методе, руковалац догађаја може да се прикачи одређеном типу догађаја—као што је „клик“ или „прекидање тастера“. Прегледач аутоматски шаље објекат догађаја функцији повратног позива када користите аддЕвентЛистенер. Сви детаљи догађаја, укључујући притиснут тастер и клик на елемент, садржани су у овом објекту. Интересантна ствар је да ће претраживач увек обезбедити објекат догађаја, без обзира на име параметра у функцији — „евент“, „е“ или „евт“.
Прво, видимо једноставно подешавање користећи догађај „кеидовн“ у горњим примерима. Претраживач креира објекат догађаја и шаље га функцији повратног позива када корисник притисне тастер. Након тога, функција евидентира догађај на конзоли, приказујући све релевантне информације, укључујући кључни погодак и додатне карактеристике догађаја. Важно је запамтити да не морате експлицитно да декларишете објекат догађаја јер ЈаваСцрипт већ препознаје да обрађује догађај на основу типа који сте унели у аддЕвентЛистенер.
Такође смо размотрили замену функција стрелице за конвенционалне изразе функције. Понашање је исто за функције стрелице и њихову сажетију синтаксу: претраживач ће увек дати објекат догађаја функцији, без обзира на то како је функција конструисана. Да би се руковалац догађајима поново користио, такође смо га модуларили у посебан метод под називом "хандлеКеиДовн". Ово чини код јаснијим и лакшим за одржавање омогућавањем да се иста функција повеже са бројним слушаоцима догађаја или поново користи у различитим деловима вашег кода.
Коришћење покушај...ухвати, уведено је руковање грешкама како би се још више повећала робусност. За апликације у стварном свету, ово је кључна карактеристика јер помаже у спречавању пада у случају да дође до непредвиђених околности током руковања догађајима. На пример, блок цатцх ће евидентирати грешку без мешања у остатак скрипте ако објекат догађаја није формиран како се очекује. На крају, да бисмо били сигурни да се руковалац понаша како је предвиђено, развили смо јединични тест који симулира догађаје притиска на тастер користећи Јест. За веће пројекте, тестирање је од суштинског значаја јер осигурава да се функције руковања догађајима правилно извршавају у различитим ситуацијама.
Истраживање руковања догађајима у ЈаваСцрипт-у: Како функционишу параметри догађаја
Фронт-енд ЈаваСцрипт са слушаоцима догађаја за кориснички унос
// Approach 1: Basic event listener with "event" parameter
document.addEventListener("keydown", function(event) {
// The browser automatically passes the event object to this function
console.log(event); // Outputs the event object
});
// Explanation: The event object is implicitly passed to the function by the browser.
Коришћење функција стрелице за руковање догађајима у ЈаваСцрипт-у
Фронт-енд ЈаваСцрипт са ЕС6 функцијама стрелице
// Approach 2: Using ES6 arrow functions
document.addEventListener("keydown", (e) => {
// Arrow function also accepts the event object, regardless of its name
console.log(e); // Outputs the event object
});
// Explanation: The event object is still passed, even with the shorthand arrow function syntax.
Модуларни ЈаваСцрипт: руковалац догађаја са могућношћу поновне употребе
Модуларни ЈаваСцрипт за вишекратне руковаоце догађајима
// Approach 3: Modularizing the event handler for reuse
function handleKeyDown(event) {
// Function to handle keydown event, reusable in other contexts
console.log("Key pressed:", event.key); // Logs the key that was pressed
}
// Attaching the handler to the keydown event
document.addEventListener("keydown", handleKeyDown);
// Explanation: Separate function increases modularity and reusability.
Обезбеђивање робусности руковања догађајима уз руковање грешкама
Оптимизован ЈаваСцрипт са руковањем грешкама за робусност
// Approach 4: Adding error handling for more robust event handling
function handleKeyDown(event) {
try {
// Attempt to process the key event
console.log("Key pressed:", event.key);
} catch (error) {
// Handle any potential errors
console.error("Error handling keydown event:", error);
}
}
document.addEventListener("keydown", handleKeyDown);
// Explanation: Adding try-catch blocks improves code reliability.
Тестирање руковања догађајима помоћу јединичних тестова
Јест се користи у ЈаваСцрипт јединичним тестовима за валидацију слушалаца догађаја.
// Approach 5: Unit testing the event handler using Jest
const handleKeyDown = jest.fn((event) => {
return event.key; // Return the key for testing
});
// Simulate a keydown event in the test environment
test("handleKeyDown function receives keydown event", () => {
const event = new KeyboardEvent("keydown", { key: "a" });
document.dispatchEvent(event);
expect(handleKeyDown).toHaveBeenCalledWith(event);
});
// Explanation: Unit tests ensure the event handler behaves correctly.
Како функционише ширење догађаја у ЈаваСцрипт руковању догађајима
Пропагација догађаја је још једна важна компонента ЈаваСцрипт система догађаја. Догађај, као што је „притисак на тастер“ или „клик“, не дешава се тек тако и завршава се тамо. Она наставља да функционише. Уместо тога, прати распоред компоненти у току догађаја. Фаза хватања, циљна фаза и фаза мехурића су три фазе овог тока. Већина догађаја је подразумевано у фази мехурића, што значи да се шире попут ефекта таласања од циљног елемента до његових претходника.
Уз употребу техника као stopPropagation() и stopImmediatePropagation(), ЈаваСцрипт програмери могу да регулишу како се догађаји шире. На пример, можете користити event.stopPropagation() да спречите појављивање догађаја ако не желите да се догоди више у ДОМ хијерархији. Када више од једног елемента слуша исти догађај, али желите да се покрене само један одређени руковалац, ово је заиста корисно.
Штавише, један ефикасан метод који користи пропагацију догађаја је делегирање догађаја. Можете додати ослушкивач догађаја родитељском елементу и пустити да му се догађаји „покрећу“, за разлику од додавања једног сваком подређеном елементу. У ситуацијама када морате да управљате догађајима на динамички уведеним ставкама, овај приступ је веома ефикасан. Олакшава администрацију кода и смањује употребу меморије, посебно у апликацијама са пуно интерактивних компоненти.
Уобичајена питања о ЈаваСцрипт догађајима и слушаоцима
- Шта је догађај који се појављује у ЈаваСцрипт-у?
- Феномен познат као „бубљење догађаја“ описује како догађај почиње на најдубљем елементу ДОМ хијерархије и креће се навише до најудаљенијих компоненти.
- Како могу да зауставим ширење догађаја?
- У фази појављивања, можете зауставити даље ширење догађаја помоћу event.stopPropagation() техника.
- Која је разлика између stopPropagation() и stopImmediatePropagation()?
- Догађај је спречен да прође stopPropagation(), и онемогућено је да се изводи заједно са било којим слушаоцима који су још присутни од стране stopImmediatePropagation().
- Шта је делегирање догађаја у ЈаваСцрипт-у?
- Додавањем слушаоца догађаја на родитељски елемент, а не на сваки појединачни подређени елемент, можете користити технику делегирања догађаја. Родитељ се обавештава када се нешто „провали“ од деце.
- Могу ли да додам више слушалаца за исти догађај?
- Заиста, можете повезати више од једног слушаоца догађаја са елементом за исти тип догађаја у ЈаваСцрипт-у. У редоследу којим су додани, сваки слушалац ће бити позван.
Завршна размишљања о руковању догађајима у ЈаваСцрипт-у
Функција аутоматског препознавања догађаја у ЈаваСцрипт-у је од суштинског значаја за савремени веб развој. Без обзира на име функције, језик чини руковање кеидовн и лакше кликните на догађаје тако што ћете му аутоматски дати објекат догађаја.
Уз коришћење овог система и најсавременијих метода као што су контрола ширења и делегирање догађаја, програмери могу ефикасно управљати сложеним интеракцијама корисника. Ако сте свесни ових техника, можете да креирате веб локације које су динамичније, интерактивније и које реагују на унос корисника.
Извори и референце за ЈаваСцрипт руковање догађајима
- Детаљна документација о ЈаваСцрипт-у аддЕвентЛистенер метода и руковање објектима догађаја могу се наћи на МДН Веб документи - аддЕвентЛистенер .
- За дубинско истраживање ширења и делегирања ЈаваСцрипт догађаја, погледајте ЈаваСцрипт.инфо - Бубблинг анд Цаптуринг .
- Разумевање кључних концепата тестирања ЈаваСцрипт догађаја помоћу Јест-а је разрађено на Јест Доцументатион .