Kolejna szybka lekcja, poznajemy eventy w JavaScript. Konieczność, jeżeli chcemy mieć coś więcej niż apkę z mocarnym backendem, ale wszystko bez reaktywności.

Ok, poprzedni 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>
    <div id="myDiv">
        Text node in div
        <ul id="myUl">
            Text node in ul
            <li>Click Me</li>
            <li>Click Me</li>
            <li>Click Me</li>
        </ul>
    </div>
    <script src="./evtphase.js" defer></script>
</body>
</html>

No i teraz zmodyfikujemy poprzedni JS tak, aby eventy były odpalane w capture phase:

let div = document.querySelector("#myDiv");
let ul = document.querySelector("#myUl");
let liFirst = ul.querySelector("li");


liFirst.addEventListener("click", function(e){
    console.log(e.target);
    alert("li clicked");
    
});

ul.addEventListener("click", function(e){
    console.log(e.target);
    alert("ul clicked");
   
}, {capture: true});

div.addEventListener("click", function(e){
    console.log(e.target);
    alert("div clicked");
    
}, {capture: true});

I co mamy na klik li? Najpierw leci event kliku diva, potem ul, potem li (target phase). Potem event bąbelkuje w górę, ale nikogo to już nie obchodzi, bo listenerów tam nie ma.

Zresztą – napiszmy je:

liFirst.addEventListener("click", function(e){
    console.log(e.target);
    alert("li clicked - target phase");
    
});

ul.addEventListener("click", function(e){
    console.log(e.target);
    alert("ul clicked - capture/target phase");
   
}, {capture: true});

ul.addEventListener("click", function(e){
    alert("Ul clicked - bubble/target phase");
});

div.addEventListener("click", function(e){
    console.log(e.target);
    alert("div clicked - capture/target phase");
    
}, {capture: true});

div.addEventListener("click", function(e){
    alert("div clicked - bubble/target phase");
});

Pobawmy się tym, aż zrozumiemy. Eventy z caputre odpalane są w capture phase (albo target phase, ten element też można kliknąć, niekoniecznie jego dzieci). Eventy bez capture odpalają się w target phase oraz bubble phase.

Wiemy też jak działa bąbelkowanie i nie powinno nas tu nic dziwić, ale niech ta wiedza osiądzie.