Event事件學習實用路線(5)——Event事件之事件委託——案例:實現簡易留言板

Event事件之事件委託——案例:實現簡易留言板這裏寫目錄標題

事件委託



  其實我們差不多已經知道什麼是事件委託了,現在我們通過一個小的案例,可以溫習一下事件委託。


案例:實現簡易留言板



我們簡單的實現一個簡易的留言板,可以提交留言也可以刪除。
在這裏插入圖片描述
我們看一下樣式,關於css樣式的學習,請參考xiao迪寫的css樣式學習使用路線系列了,這裏主要還是學習js關於事件的知識,就不再解釋css了。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
h2,
p {
    margin: 0;
}    
.box {
    margin: 30px auto;
    width: 300px;    
}
#user,
#message {
    box-sizing: border-box;
    width: 300px;
    border: 1px solid #000;
    padding: 10px;
    height: 100px;
    resize: none;
    display: block;
}
#user {
    padding: 0 10px;
    height: 30px;
    margin-bottom: 10px;
}
#btn {
    display: block;
    margin: 10px auto;
    width: 60%;
    height: 40px;
}
#list {
    border-top: 1px solid #000;
    padding: 10px 0 0;
    margin: 0;
    list-style: none;
}
#list li {
    position: relative;
    font: 14px/30px "宋體";
    border-bottom: 1px solid #000;
    padding: 0 15px;
    overflow: hidden;
}
.clos {
    position: absolute;
    right: 5px;
    top: 10px;
}
</style>
</head>
<body>
<div class="box">
    <input type="text" id="user" value="小明" />
    <textarea id="message">我就是傳說中的無敵小明</textarea>
    <button id="btn">提交留言</button>
    <ul id="list">
        <li style="height: auto">
            <h2 class="user">小王說:</h2>
            <p>呼叫無敵小明</p>
            <a href="javascript:;" class="clos">刪除<span>X</span></a>
        </li>
        <li style="height: auto">
            <h2 class="user">老師說:</h2>
            <p>小明滾出去</p>
            <a href="javascript:;" class="clos">刪除<span>X</span></a>
        </li>
    </ul>
</div>
</body>
</html>

在這裏插入圖片描述


先實現“提交留言”功能:

    // 給按鈕添加點擊事件
    // 創建元素 並且插入到ul列表當中
    var btn = document.querySelector("#btn");
    var user = document.querySelector("#user");
    var message = document.querySelector("#message");
    var list = document.querySelector("#list");

    btn.addEventListener("click", ()=>{
        // 創建一個li
        var li = document.createElement('li');
        li.innerHTML = `
            <h2 class="user">${user.value}</h2>
            <p>${message.value}</p>
            <a href="javascript:;" class="clos">刪除<span>X</span></a>`;
        // 向前插
        list.insertBefore(li, list.children[0]);
    });

在這裏插入圖片描述
接下來完成刪除功能:

用傳統的方式得先獲取a標籤後,再添加刪除事件,但這樣會有滯後性,因爲剛開始頁面只有兩個a標籤,而後面用戶增加的a標籤卻沒能增加刪除事件。這種方式是不實時的,它會有滯後性。

    // 給按鈕添加點擊事件
    // 創建元素 並且插入到ul列表當中
    var btn = document.querySelector("#btn");
    var user = document.querySelector("#user");
    var message = document.querySelector("#message");
    var list = document.querySelector("#list");
    var as = document.querySelectorAll('a');

    btn.addEventListener("click", ()=>{
        // 創建一個li
        var li = document.createElement('li');
        li.innerHTML = `
            <h2 class="user">${user.value}</h2>
            <p>${message.value}</p>
            <a href="javascript:;" class="clos">刪除<span>X</span></a>`;
        // 向前插
        list.insertBefore(li, list.children[0]);
    });

    console.log(as.length);

獲取的length是2,增加留言後,這裏的length就滯後了!
在這裏插入圖片描述
因爲最開始我們也不知道最後會有幾個a標籤,因此將事件添加到父級身上 (這裏父級li還是變的,因此再往上找父級ul始終是不變的)——大家顯然想到用事件委託

    // 給按鈕添加點擊事件
    // 創建元素 並且插入到ul列表當中
    var btn = document.querySelector("#btn");
    var user = document.querySelector("#user");
    var message = document.querySelector("#message");
    var list = document.querySelector("#list");
    

    btn.addEventListener("click", ()=>{
        // 創建一個li
        var li = document.createElement('li');
        li.innerHTML = `
            <h2 class="user">${user.value}</h2>
            <p>${message.value}</p>
            <a href="javascript:;" class="clos">刪除<span>X</span></a>`;
        // 向前插
        list.insertBefore(li, list.children[0]);
    });

    list.addEventListener("click", (e)=>{
        if (e.target.className == "clos")
        {
            var li = e.target.parentNode; // 父級元素(DOM中學到過)
            list.removeChild(li);
        }
    });

在這裏插入圖片描述

事件委託(事件代理)優缺點:



  • 優點:
    • 1)減少事件註冊(需要添加事件綁定的元素),節省內存;
    • 2)可以給將來(新增)的元素添加事件(在不刷新頁面的情況下)
  • 缺點:
    • 1)事件處理函數中需要判斷事件源,增加邏輯複雜度;
    • 2)祖父級和事件源之間不能有阻止冒泡
    • 3)建議就近委託,否則會導致瀏覽器頻繁的調用處理函數;
    • 4)容易出現誤判,所以寫好相應判斷

      相對於事件處理函數中需要判斷事件源增加邏輯複雜度的犧牲,比咱們要寫個循環添加事件要容易得多。
       要是在祖父級和事件源之間有阻止冒泡,那這個事件委託就無法實現了。
       總體優點大於缺點。



(後續待補充)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章