Ðи можемо не ÑÑлÑки пÑизнаÑаÑи обÑобники, але й генеÑÑваÑи подÑÑ Ð· JavaScript.
ÐоÑиÑÑÑваÑÑÐºÑ Ð¿Ð¾Ð´ÑÑ Ð¼Ð¾Ð¶Ð½Ð° викоÑиÑÑовÑваÑи Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ âгÑаÑÑÑниÑ
компоненÑÑвâ. ÐапÑиклад, коÑеневий ÐµÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð°Ñого влаÑного Ð¼ÐµÐ½Ñ Ð½Ð° оÑÐ½Ð¾Ð²Ñ JS може викликаÑи подÑÑ, ÑÐºÑ Ð¿Ð¾Ð²ÑдомлÑÑÑ, Ñо вÑдбÑваÑÑÑÑÑ Ð· менÑ: open (Ð¼ÐµÐ½Ñ Ð²ÑдкÑиÑо), select (вибÑано елеменÑ) ÑоÑо. ÐнÑий код може пÑоÑлÑÑ
овÑваÑи ÑÑ Ð¿Ð¾Ð´ÑÑ Ñа дÑзнаваÑиÑÑ Ñо вÑдбÑваÑÑÑÑÑ Ð· менÑ.
Ðи можемо генеÑÑваÑи не ÑÑлÑки абÑолÑÑно Ð½Ð¾Ð²Ñ Ð¿Ð¾Ð´ÑÑ, ÑÐºÑ Ð¼Ð¸ вигадÑÑмо Ð´Ð»Ñ Ð²Ð»Ð°ÑниÑ
ÑÑлей, але й вбÑдованÑ, ÑÐ°ÐºÑ Ñк click, mousedown ÑоÑо. Це може бÑÑи коÑиÑно Ð´Ð»Ñ Ð°Ð²ÑомаÑизованого ÑеÑÑÑваннÑ.
ÐонÑÑÑÑкÑÐ¾Ñ Ð¿Ð¾Ð´Ñй
ÐбÑÐ´Ð¾Ð²Ð°Ð½Ñ ÐºÐ»Ð°Ñи подÑй ÑÑвоÑÑÑÑÑ ÑÑÑаÑÑ ÑÑ, подÑÐ±Ð½Ñ Ð´Ð¾ клаÑÑв елеменÑÑв DOM. ÐоÑÑÐ½Ñ â Ñе вбÑдований ÐºÐ»Ð°Ñ Event.
Ðи можемо ÑÑвоÑÑваÑи обâÑкÑи Event на зÑазок ÑÑого:
let event = new Event(type[, options]);
ÐÑгÑменÑи:
-
type â Ñип подÑÑ, ÑÑдок, Ñк-оÑ
"click"або Ð½Ð°Ñ Ð²Ð»Ð°Ñний, напÑиклад,"my-event". -
options â обâÑÐºÑ Ð· двома необовâÑзковими влаÑÑивоÑÑÑми:
bubbles: true/falseâ ÑкÑоtrue, Ñо подÑÑ ÑпливаÑ.cancelable: true/falseâ ÑкÑоtrue, Ñо âÑипова дÑÑâ може бÑÑи попеÑеджена. ÐÑзнÑÑе ми побаÑимо, Ñо Ñе ознаÑÐ°Ñ Ð´Ð»Ñ ÐºÐ¾ÑиÑÑÑваÑÑÐºÐ¸Ñ Ð¿Ð¾Ð´Ñй.
Типово обидва паÑамеÑÑи Ñ Ñ Ð¸Ð±Ð½Ð¸Ð¼Ð¸:
{bubbles: false, cancelable: false}.
dispatchEvent
ÐÑÑÐ»Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑа подÑÑ Ð¼Ð¸ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ âзапÑÑÑиÑиâ ÑÑ Ð½Ð° елеменÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ elem.dispatchEvent(event).
ÐоÑÑм обÑобники ÑеагÑÑÑÑ Ð½Ð° неÑ, Ñк на звиÑÐ°Ð¹Ð½Ñ Ð¿Ð¾Ð´ÑÑ Ð±ÑаÑзеÑа. ЯкÑо подÑÑ Ð±Ñла ÑÑвоÑена з пÑапоÑом bubbles, вона ÑпливаÑ.
У Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾Ð¼Ñ Ð½Ð¸Ð¶Ñе пÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð¿Ð¾Ð´ÑÑ click ÑнÑÑÑÑÑÑÑÑÑ Ð² JavaScript. ÐбÑобник пÑаÑÑÑ Ñак Ñамо, Ñк ÑкÑо б клÑкнÑли кнопкÑ:
<button id="elem" onclick="alert('ÐлÑк!');">ÐвÑоклÑк</button>
<script>
let event = new Event("click");
elem.dispatchEvent(event);
</script>
ÐÑнÑÑ ÑпоÑÑб вÑдÑÑзниÑи âÑпÑавжнÑâ коÑиÑÑÑваÑÑÐºÑ Ð¿Ð¾Ð´ÑÑ Ð²Ñд ÑакоÑ, ÑÐºÑ Ð·Ð³ÐµÐ½ÐµÑовано ÑкÑипÑом.
ÐлаÑÑивÑÑÑÑ event.isTrusted Ð¼Ð°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ true Ð´Ð»Ñ Ð¿Ð¾Ð´Ñй, ÑÐºÑ Ð²ÑдбÑваÑÑÑÑÑ Ð² ÑезÑлÑÑаÑÑ ÑеалÑниÑ
дÑй коÑиÑÑÑваÑа, Ñ false Ð´Ð»Ñ Ð¿Ð¾Ð´Ñй, згенеÑованиÑ
ÑкÑипÑом.
ÐÑиклад ÑпливаннÑ
Ðи можемо ÑÑвоÑиÑи ÑпливаÑÑÑ Ð¿Ð¾Ð´ÑÑ Ð· Ð½Ð°Ð·Ð²Ð¾Ñ "hello" Ñ Ð·Ð»Ð¾Ð²Ð¸Ñи ÑÑ Ð½Ð° document.
ÐÑе, Ñо нам поÑÑÑбно, Ñе вÑÑановиÑи bubbles на true:
<h1 id="elem">ÐÑивÑÑ Ð²Ñд ÑкÑипÑа!</h1>
<script>
// ловимо на document...
document.addEventListener("hello", function(event) { // (1)
alert("ÐÑивÑÑ Ð²Ñд " + event.target.tagName); // ÐÑивÑÑ Ð²Ñд H1
});
// ...запÑÑк подÑÑ Ð½Ð° елеменÑÑ!
let event = new Event("hello", {bubbles: true}); // (2)
elem.dispatchEvent(event);
// обÑобник докÑменÑа акÑивÑÑÑÑÑÑ Ñа вÑдобÑазиÑÑ Ð¿Ð¾Ð²ÑдомленнÑ.
</script>
ÐÑимÑÑки:
- Ðам ÑлÑд викоÑиÑÑовÑваÑи
addEventListenerÐ´Ð»Ñ Ð½Ð°ÑÐ¸Ñ ÐºÐ¾ÑиÑÑÑваÑÑÐºÐ¸Ñ Ð¿Ð¾Ð´Ñй, оÑкÑлÑкиon<event>ÑÑнÑÑ Ð»Ð¸Ñе Ð´Ð»Ñ Ð²Ð±ÑÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ñй,document.onhelloне пÑаÑÑÑ. - ÐоÑÑÑбно вÑÑановиÑи
bubbles:true, ÑнакÑе подÑÑ Ð½Ðµ Ñпливе.
ÐеÑ
анÑка ÑÐ¿Ð»Ð¸Ð²Ð°Ð½Ð½Ñ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð° Ð´Ð»Ñ Ð²Ð±ÑдованиÑ
(click) Ñ ÐºÐ¾ÑиÑÑÑваÑÑкиÑ
(hello) подÑй. Також Ñ ÐµÑапи пеÑеÑ
Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ñа ÑпливаннÑ.
MouseEvent, KeyboardEvent Ñа ÑнÑÑ
ÐÑÑ ÐºÐ¾ÑоÑкий ÑпиÑок клаÑÑв Ð´Ð»Ñ Ð¿Ð¾Ð´Ñй ÑнÑеÑÑейÑÑ ÐºÐ¾ÑиÑÑÑваÑа з UI Event specification:
UIEventFocusEventMouseEventWheelEventKeyboardEvent- â¦
Ðи Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи ÑÑ
замÑÑÑÑ new Event, ÑкÑо ми Ñ
оÑемо ÑÑвоÑиÑи ÑÐ°ÐºÑ Ð¿Ð¾Ð´ÑÑ. ÐапÑиклад, new MouseEvent("click")
ÐÑавилÑний конÑÑÑÑкÑÐ¾Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÑÑ Ð²ÐºÐ°Ð·Ð°Ñи ÑÑандаÑÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð´Ð»Ñ ÑÑого ÑÐ¸Ð¿Ñ Ð¿Ð¾Ð´ÑÑ.
Ð¢Ð°ÐºÑ Ñк clientX/clientY Ð´Ð»Ñ Ð¿Ð¾Ð´ÑÑ Ð¼Ð¸ÑÑ:
let event = new MouseEvent("click", {
bubbles: true,
cancelable: true,
clientX: 100,
clientY: 100
});
alert(event.clientX); // 100
ÐвеÑнÑÑÑ ÑвагÑ: ÑÑого не можна бÑло б зÑобиÑи за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ конÑÑÑÑкÑоÑа Event.
ÐавайÑе ÑпÑобÑÑмо:
let event = new Event("click", {
bubbles: true, // ÑÑлÑки влаÑÑивоÑÑÑ bubbles Ñа cancelable
cancelable: true, // пÑаÑÑÑÑÑ Ð² Event конÑÑÑÑкÑоÑÑ
clientX: 100,
clientY: 100
});
alert(event.clientX); // undefined, невÑдома влаÑÑивÑÑÑÑ ÑгноÑÑÑÑÑÑÑ!
ÐÑÑм, ми можемо обÑйÑи Ñе, пÑизнаÑивÑи event.clientX=100 безпоÑеÑеднÑо пÑÑÐ»Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑа. Тож Ñе пиÑÐ°Ð½Ð½Ñ Ð·ÑÑÑноÑÑÑ Ñа доÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñавил. ÐодÑÑ, ÑÑвоÑÐµÐ½Ñ Ð±ÑаÑзеÑом, завжди маÑÑÑ Ð¿ÑавилÑний Ñип.
Ðовний Ð¾Ð¿Ð¸Ñ Ð²Ð»Ð°ÑÑивоÑÑей Ð´Ð»Ñ ÑÑÐ·Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑÑ ÑнÑеÑÑейÑÑ ÐºÐ¾ÑиÑÑÑваÑа Ñ Ð² ÑпеÑиÑÑкаÑÑÑ, напÑиклад, MouseEvent.
ÐоÑиÑÑÑваÑÑÐºÑ Ð¿Ð¾Ð´ÑÑ
ÐÐ»Ñ Ð½Ð°ÑиÑ
влаÑниÑ
, абÑолÑÑно новиÑ
ÑипÑв подÑй, ÑакиÑ
Ñк "hello", ми Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи new CustomEvent. ТеÑ
нÑÑно CustomEvent â Ñе Ñе ж Ñаме, Ñо й Event, за одним винÑÑком.
У дÑÑгий аÑгÑÐ¼ÐµÐ½Ñ (обâÑкÑ) ми можемо додаÑи додаÑÐºÐ¾Ð²Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ detail Ð´Ð»Ñ Ð±ÑдÑ-ÑÐºÐ¾Ñ ÑпеÑÑалÑÐ½Ð¾Ñ ÑнÑоÑмаÑÑÑ, ÑÐºÑ Ð¼Ð¸ Ñ
оÑемо пеÑедаÑи Ñазом Ñз подÑÑÑ.
ÐапÑиклад:
<h1 id="elem">ÐÑивÑÑ Ð²Ñд Ðвана!</h1>
<script>
// додаÑÐºÐ¾Ð²Ñ Ð²ÑдомоÑÑÑ Ð½Ð°Ð´Ñ
одÑÑÑ Ñазом Ñз подÑÑÑ Ð´Ð¾ обÑобника
elem.addEventListener("hello", function(event) {
alert(event.detail.name);
});
elem.dispatchEvent(new CustomEvent("hello", {
detail: { name: "Ðван" }
}));
</script>
ÐлаÑÑивÑÑÑÑ detail може мÑÑÑиÑи бÑдÑ-ÑÐºÑ Ð´Ð°Ð½Ñ. ТеÑ
нÑÑно ми могли б жиÑи Ñ Ð±ÐµÐ· ниÑ
, оÑкÑлÑки ми можемо пÑизнаÑиÑи бÑдÑ-ÑÐºÑ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð·Ð²Ð¸ÑÐ°Ð¹Ð½Ð¾Ð¼Ñ Ð¾Ð±âÑкÑÑ new Event пÑÑÐ»Ñ Ð¹Ð¾Ð³Ð¾ ÑÑвоÑеннÑ. Ðле CustomEvent забезпеÑÑÑ ÑпеÑÑалÑне поле detail, Ñоб ÑникнÑÑи конÑлÑкÑÑв з ÑнÑими влаÑÑивоÑÑÑми подÑÑ.
ÐÑÑм Ñого, ÐºÐ»Ð°Ñ Ð¿Ð¾Ð´ÑÑ Ð¾Ð¿Ð¸ÑÑÑ Ñка Ñаме Ñе подÑÑ, Ñ ÑкÑо вона коÑиÑÑÑваÑÑка, Ñо ми Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи CustomEvent, Ñоб Ñвно вказаÑи на Ñе.
event.preventDefault()
ÐагаÑо бÑаÑзеÑÑв, ÑÐºÑ Ð¼Ð°ÑÑÑ âÑÐ¸Ð¿Ð¾Ð²Ñ Ð´ÑÑâ, Ñк-Ð¾Ñ Ð¿ÐµÑÐµÑ Ñд за поÑиланнÑм, видÑÐ»ÐµÐ½Ð½Ñ ÑоÑо.
ÐÐ»Ñ Ð½Ð¾Ð²Ð¸Ñ ÐºÐ¾ÑиÑÑÑваÑÑÐºÐ¸Ñ Ð¿Ð¾Ð´Ñй, безÑмовно, Ð½ÐµÐ¼Ð°Ñ ÑÐ¸Ð¿Ð¾Ð²Ð¸Ñ Ð´Ñй бÑаÑзеÑа, але код, Ñкий надÑÐ¸Ð»Ð°Ñ ÑÐ°ÐºÑ Ð¿Ð¾Ð´ÑÑ, може маÑи влаÑÐ½Ñ Ð¿Ð»Ð°Ð½Ð¸, Ñо ÑобиÑи пÑÑÐ»Ñ ÑнÑÑÑÑÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´ÑÑ.
ÐикликаÑÑи event.preventDefault(), обÑобник подÑÑ Ð¼Ð¾Ð¶Ðµ надÑÑлаÑи Ñигнал пÑо Ñе, Ñо ÑÑ Ð´ÑÑ ÑлÑд ÑкаÑÑваÑи.
У ÑÑÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð²Ð¸ÐºÐ»Ð¸Ðº elem.dispatchEvent(event) повеÑÑÐ°Ñ false. Ркод, Ñкий його надÑÑлав, знаÑ, Ñо пÑодовжÑваÑи не поÑÑÑбно.
ÐавайÑе подивимоÑÑ Ð½Ð° пÑакÑиÑний пÑиклад â кÑолик, Ñо Ñ Ð¾Ð²Ð°ÑÑÑÑÑ (могло б бÑÑи менÑ, Ñо закÑиваÑÑÑÑÑ, або ÑоÑÑ Ð¿Ð¾Ð´Ñбне).
ÐижÑе ви можеÑе побаÑиÑи ÑÑнкÑÑÑ #rabbit Ñ hide(), ÑÐºÑ Ð·Ð°Ð¿ÑÑкаÑÑÑ Ð¿Ð¾Ð´ÑÑ "hide", Ñоб ÑÑÑ Ð·Ð°ÑÑÐºÐ°Ð²Ð»ÐµÐ½Ñ ÑÑоÑони знали, Ñо кÑолик збиÑаÑÑÑÑÑ ÑÑ
оваÑиÑÑ.
ÐÑдÑ-Ñкий обÑобник може пÑоÑлÑÑ
аÑи ÑÑ Ð¿Ð¾Ð´ÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ rabbit.addEventListener('hide',...) Ñ, ÑкÑо поÑÑÑбно, ÑкаÑÑваÑи дÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ event.preventDefault(). Ð¢Ð¾Ð´Ñ ÐºÑолик не зникне:
<pre id="rabbit">
|\ /|
\|_|/
/. .\
=\_Y_/=
{>o<}
</pre>
<button onclick="hide()">Hide()</button>
<script>
function hide() {
let event = new CustomEvent("hide", {
cancelable: true // без ÑÑого пÑапоÑÑÑ preventDefault не ÑпÑаÑÑÑ
});
if (!rabbit.dispatchEvent(event)) {
alert('ÐбÑобник запобÑг дÑÑ');
} else {
rabbit.hidden = true;
}
}
rabbit.addEventListener('hide', function(event) {
if (confirm("ÐикликаÑи preventDefault?")) {
event.preventDefault();
}
});
</script>
ÐвеÑнÑÑÑ ÑвагÑ: подÑÑ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° маÑи пÑÐ°Ð¿Ð¾Ñ cancelable: true, ÑнакÑе виклик event.preventDefault() ÑгноÑÑÑÑÑÑÑ.
ÐÐºÐ»Ð°Ð´ÐµÐ½Ñ Ð¿Ð¾Ð´ÑÑ Ñ ÑÐ¸Ð½Ñ Ñонними
Як пÑавило, подÑÑ Ð¾Ð±ÑоблÑÑÑÑÑÑ Ð² ÑеÑзÑ. ТобÑо: ÑкÑо бÑаÑÐ·ÐµÑ Ð¾Ð±ÑоблÑÑ onclick Ñ Ð²ÑдбÑваÑÑÑÑÑ Ð½Ð¾Ð²Ð° подÑÑ, напÑ. кÑÑÑÐ¾Ñ Ð±Ñло пеÑемÑÑено, ÑÐ¾Ð´Ñ ÑÑ Ð¾Ð±Ñобка ÑÑавиÑÑÑÑ Ð² ÑеÑгÑ, вÑдповÑÐ´Ð½Ñ Ð¾Ð±Ñобники mousemove бÑдÑÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ð½Ñ Ð¿ÑÑÐ»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð½Ñ Ð¾Ð±Ñобки onclick.
ÐинÑÑком Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸, коли одна подÑÑ Ð¿Ð¾ÑинаÑÑÑÑÑ Ð· ÑнÑоÑ, напÑ. викоÑиÑÑовÑÑÑи dispatchEvent. Ð¢Ð°ÐºÑ Ð¿Ð¾Ð´ÑÑ Ð¾Ð±ÑоблÑÑÑÑÑÑ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾: викликаÑÑÑÑÑ Ð½Ð¾Ð²Ñ Ð¾Ð±Ñобники подÑй, а поÑÑм вÑдновлÑÑÑÑÑÑ Ð¾Ð±Ñобка поÑоÑÐ½Ð¾Ñ Ð¿Ð¾Ð´ÑÑ.
ÐапÑиклад, Ñ ÐºÐ¾Ð´Ñ Ð½Ð¸Ð¶Ñе подÑÑ menu-open ÑнÑÑÑÑÑÑÑÑÑ Ð¿Ñд ÑÐ°Ñ onclick.
Ðона обÑоблÑÑÑÑÑÑ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾, не ÑекаÑÑи закÑнÑÐµÐ½Ð½Ñ Ð¾Ð±Ñобки onclick:
<button id="menu">ÐÐµÐ½Ñ (клÑкни мене)</button>
<script>
menu.onclick = function() {
alert(1);
menu.dispatchEvent(new CustomEvent("menu-open", {
bubbles: true
}));
alert(2);
};
// ÑпÑаÑÑовÑÑ Ð¼Ñж 1 Ñа 2
document.addEventListener('menu-open', () => alert('вкладена подÑÑ'));
</script>
ÐоÑÑдок Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñакий: 1 â вкладена подÑÑ â 2.
ÐаÑважÑе, Ñо вкладена подÑÑ menu-open ловиÑÑÑÑ Ð½Ð° document. ÐоÑиÑÐµÐ½Ð½Ñ Ñа обÑобка Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ñ Ð¿Ð¾Ð´ÑÑ Ð·Ð°ÐºÑнÑÑÑÑÑÑÑ Ð´Ð¾ Ñого, Ñк опÑаÑÑÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²ÐµÑнеÑÑÑÑ Ð´Ð¾ зовнÑÑнÑого ÐºÐ¾Ð´Ñ (onclick).
Це ÑÑоÑÑÑÑÑÑÑ Ð½Ðµ ÑÑлÑки dispatchEvent, Ñ Ð¹ ÑнÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸. ЯкÑо обÑобник подÑй Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ Ð¼ÐµÑоди, ÑÐºÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑÑÑ ÑнÑÑ Ð¿Ð¾Ð´ÑÑ, вони Ñакож обÑоблÑÑÑÑÑÑ ÑинÑ
Ñонно, вкладеним ÑпоÑобом.
СкажÑмо, нам Ñе не подобаÑÑÑÑÑ. Ðи б Ñ
оÑÑли ÑпоÑаÑÐºÑ Ð¿Ð¾Ð²Ð½ÑÑÑÑ Ð¾Ð±ÑобиÑи onclick, незалежно вÑд menu-open або бÑдÑ-ÑкиÑ
ÑнÑиÑ
вкладениÑ
подÑй.
Ð¢Ð¾Ð´Ñ Ð¼Ð¸ можемо або помÑÑÑиÑи dispatchEvent (або ÑнÑий виклик, Ñо ÑнÑÑÑÑÑ Ð¿Ð¾Ð´ÑÑ) в кÑнеÑÑ onclick, або, можливо, кÑаÑе, загоÑнÑÑи його в setTimeout з нÑлÑÐ¾Ð²Ð¾Ñ Ð·Ð°ÑÑимкоÑ:
<button id="menu">ÐÐµÐ½Ñ (клÑкни мене)</button>
<script>
menu.onclick = function() {
alert(1);
setTimeout(() => menu.dispatchEvent(new CustomEvent("menu-open", {
bubbles: true
})));
alert(2);
};
document.addEventListener('menu-open', () => alert('вкладена подÑÑ'));
</script>
Ð¢ÐµÐ¿ÐµÑ dispatchEvent запÑÑкаÑÑÑÑÑ Ð°ÑинÑ
Ñонно пÑÑÐ»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð½Ñ Ð¿Ð¾ÑоÑного Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñ, вклÑÑаÑÑи menu.onclick, ÑÐ¾Ð¼Ñ Ð¾Ð±Ñобники подÑй повнÑÑÑÑ Ð²ÑдокÑемленÑ.
ÐоÑÑдок Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ ÑÑаÑ: 1 â 2 â вкладена подÑÑ.
ÐÑдÑÑмки
Щоб ÑÑвоÑиÑи подÑÑ Ð· кодÑ, нам ÑпоÑаÑÐºÑ Ð¿Ð¾ÑÑÑбно ÑÑвоÑиÑи обâÑÐºÑ Ð¿Ð¾Ð´ÑÑ.
Ðазовий конÑÑÑÑкÑÐ¾Ñ Event(name, options) пÑÐ¸Ð¹Ð¼Ð°Ñ Ð´Ð¾Ð²ÑлÑне ÑмâÑ Ð¿Ð¾Ð´ÑÑ Ñа обâÑÐºÑ Ð¿Ð°ÑамеÑÑÑв Ñз двома влаÑÑивоÑÑÑми:
bubbles: trueÑкÑо подÑÑ Ð¼Ð°Ñ ÑпливаÑи.cancelable: trueÑкÑоevent.preventDefault()повинен пÑаÑÑваÑи.
ÐнÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑи вбÑдованиÑ
подÑй, Ñк-Ð¾Ñ MouseEvent, KeyboardEvent ÑоÑо, пÑиймаÑÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ, Ñ
аÑакÑеÑÐ½Ñ Ð´Ð»Ñ ÑÑого ÑÐ¸Ð¿Ñ Ð¿Ð¾Ð´ÑÑ. ÐапÑиклад, clientX Ð´Ð»Ñ Ð¿Ð¾Ð´Ñй миÑÑ.
ÐÐ»Ñ ÐºÐ¾ÑиÑÑÑваÑÑкиÑ
подÑй ми Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи конÑÑÑÑкÑÐ¾Ñ CustomEvent. ÐÑн Ð¼Ð°Ñ Ð´Ð¾Ð´Ð°ÑÐºÐ¾Ð²Ñ Ð¾Ð¿ÑÑÑ Ð· Ð½Ð°Ð·Ð²Ð¾Ñ detail, ми Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð¿ÑизнаÑиÑи Ñй данÑ, Ñо ÑÑоÑÑÑÑÑÑÑ Ð¿Ð¾Ð´ÑÑ. Ð¢Ð¾Ð´Ñ Ð²ÑÑ Ð¾Ð±Ñобники зможÑÑÑ Ð¾ÑÑимаÑи до ниÑ
доÑÑÑп Ñк event.detail.
ÐезважаÑÑи на ÑеÑ
нÑÑÐ½Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²ÑÑÑÑ Ð³ÐµÐ½ÐµÑÑÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñй бÑаÑзеÑа, ÑакиÑ
Ñк click або keydown, ми Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ ÐºÐ¾ÑиÑÑÑваÑиÑÑ Ñим з Ð²ÐµÐ»Ð¸ÐºÐ¾Ñ Ð¾Ð±ÐµÑежнÑÑÑÑ.
Ðи не Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð³ÐµÐ½ÐµÑÑваÑи подÑÑ Ð±ÑаÑзеÑа, оÑкÑлÑки Ñе Ñ Ð°ÐºÐµÑÑÑкий ÑпоÑÑб запÑÑÐºÑ Ð¾Ð±ÑобникÑв. ÐайÑаÑÑÑÑе Ñе ознака Ð¿Ð¾Ð³Ð°Ð½Ð¾Ñ Ð°ÑÑ ÑÑекÑÑÑи.
ÐбÑÐ´Ð¾Ð²Ð°Ð½Ñ Ð¿Ð¾Ð´ÑÑ Ð¼Ð¾Ð¶ÑÑÑ Ð±ÑÑи ÑÑвоÑенÑ:
- Як Ñвний Ñ Ð°Ðº, Ñоб змÑÑиÑи ÑÑоÑÐ¾Ð½Ð½Ñ Ð±ÑблÑоÑеки пÑаÑÑваÑи належним Ñином, ÑкÑо вони не забезпеÑÑÑÑÑ ÑнÑÐ¸Ñ Ð·Ð°ÑобÑв взаÑмодÑÑ.
- ÐÐ»Ñ Ð°Ð²ÑомаÑизованого ÑеÑÑÑваннÑ, Ñоб âклÑкнÑÑи кнопкÑâ в ÑкÑипÑÑ Ñа пеÑевÑÑиÑи, Ñи пÑавилÑно ÑеагÑÑ ÑнÑеÑÑейÑ.
ÐоÑиÑÑÑваÑÑÐºÑ Ð¿Ð¾Ð´ÑÑ Ð· наÑими влаÑними назвами найÑаÑÑÑÑе генеÑÑÑÑÑÑÑ Ð´Ð»Ñ Ð°ÑÑ ÑÑекÑÑÑÐ½Ð¸Ñ ÑÑлей, Ñоб ÑигналÑзÑваÑи пÑо Ñе, Ñо вÑдбÑваÑÑÑÑÑ Ð² наÑÐ¸Ñ Ð¼ÐµÐ½Ñ, повзÑÐ½ÐºÐ°Ñ , каÑÑÑелÑÑ ÑоÑо.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)