Kilka przydatnych informacji przy pracy z eventami. Do dzieła.
Ok, markup:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button id="btn">Click me</button>
<script src="./multipleevents.js" defer></script>
</body>
</html>
Teraz JS:
let btn = document.querySelector("#btn");
btn.addEventListener("mousedown", function(e){
alert("Button clicked");
});
btn.addEventListener("mousedown", function(e){
if(e.button !== 2)
return;
alert("Button right clicked")
});
Dlaczego mousedown? Cóż, click event działa na lewy click. Prawy click to event 'contextmenu’. A my potrzebujemy coś wspólnego, co pokaże nam czym jest propagacja „wszerz”.
Dlaczego return? Nie wszystkie eventy posiadają możliwość wykonania preventDefault, mouse eventy tego nie mają. Więc aby wyjść z eventu mamy return (to jest jedna z opcji).
Ok, klikamy lewym, jeden event, klikamy prawym… dwa eventy. To jest właśnie propagacja wszerz, natychmiastowa propagacja. Możemy ją zatrzymać:
let btn = document.querySelector("#btn");
btn.addEventListener("mousedown", function(e){
e.stopImmediatePropagation();
alert("Button clicked");
});
btn.addEventListener("mousedown", function(e){
e.stopImmediatePropagation();
if(e.button !== 2)
return;
alert("Button right clicked")
});
Tylko teraz zarówno prawy jak i lewy dają pierwszy event. Bo tak to działa, że eventy na tym samym poziomie są uruchamiane w kolejności. I jak robimy prawy klik to robimy klik, odpalamy pierwszy event. Który blokuje propagację wszerz i się odpala.
Świadomi tego, jak to wszystko działa możemy napisać kod, który da nam oczekiwany rezultat:
let btn = document.querySelector("#btn");
btn.addEventListener("mousedown", function(e){
if(e.button !== 0)
return;
e.stopImmediatePropagation();
alert("Button clicked");
});
btn.addEventListener("mousedown", function(e){
if(e.button !== 2)
return;
e.stopImmediatePropagation();
alert("Button right clicked")
});
Sprawdźmy, czy ogarniamy co tu się dzieje. Więcej o eventach niebawem.