enter3017sky / mentor-program-2nd-blog

MTR02 學習紀錄
1 stars 2 forks source link

[筆記]DOM 深入精要 #26

Open enter3017sky opened 6 years ago

enter3017sky commented 6 years ago

DOM 事件


<html>
<!-- 行內屬性事件處理器模式 -->
<body onclick="console.log('fire/trigger attribute event handler')">
<div>click me</div>

<script>
// 屬性事件處理器模式
var elementDiv = document.querySelector('div');
elementDiv.onclick = function(){
    console.log('fire/trigger property event handler')
}

// addEventListener 方法模式
elementDiv.addEventListener('click', function(){
    console.log('fire/trigger addEventListener')
}, false);

</script>
</body>

屬性事件處理器模式


// 屬性事件處理器
elementDiv.onclick = function(){
    console.log("I'm first, but I get overridden/replaced");
}

// 覆寫/替換之前的值
elementDiv.onclick = function(){
    console.log('I win')
}

使用 preventDefault() 來取消預設的瀏覽器事件


document.querySelector('a').addEventListener('click', function(event){
    event.preventDefault(); // 停止<a>載入一個 URL 的預設事件
}, false);

document.querySelector('input').addEventListener('click', function(event){
    event.preventDefault(); // 停止核選方塊的預設事件,它會切換方塊狀態
}, false);

document.querySelector('textarea').addEventListener('keypress', function(event){
    event.preventDefault(); // 停止文字區域的預設事件,它會添加輸入的文字
}, false);

事件流

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>event flow 事件流</title>
</head>
<body>
    <div>click me to start event flow</div>
</body>
<script>
    // 在 addEventListener() 傳入一個布林參數 true 來觸發捕捉事件,而不是只有泡泡事件。

    // 1. 捕捉階段
    window.addEventListener('click', function(){
        console.log(1);
    }, true);

    // 2. 捕捉階段
    document.addEventListener('click', function(){
        console.log(2);
    }, true);

    // 3. 捕捉階段
    document.documentElement.addEventListener('click', function(){
        console.log(3);
    }, true);

    // 4. 捕捉階段
    document.body.addEventListener('click', function(){
        console.log(4);
    }, true);

    // 5. 在捕捉階段期間出現目標階段
    document.querySelector('div').addEventListener('click', function(){
        console.log(5);
    }, true);

    // 6. 在泡泡階段期間出現目標階段
    document.querySelector('div').addEventListener('click', function(){
        console.log(6);
    }, false);

    // 7. 泡泡階段
    document.body.addEventListener('click', function(){
        console.log(7);
    }, false);

    // 8. 泡泡階段
    document.documentElement.addEventListener('click', function(){
        console.log(8);
    }, false);

    // 9. 泡泡階段
    document.addEventListener('click', function(){
        console.log(9);
    }, false);

    // 10. 泡泡階段
    window.addEventListener('click', function(){
        console.log(10);
    }, false);

</script>
</html>