Skip to content

事件对象

事件对象封装了事件的相关信息

获取事件对象

  • 通过事件处理函数的参数获取
  • 旧版本的IE浏览器通过window.event获取

事件对象的通用成员

  • target & srcElement

事件目标(事件源)

事件委托:通过给祖先元素注册事件,在程序处理程序中判断事件源进行不同的处理。

通常,事件委托用于动态生成元素的区域。

  • currentTarget

当前目标:获取绑定事件的元素,等效于this

  • type

字符串,得到事件的类型

  • preventDefault & returnValue

preventDefault方法

阻止浏览器默认行为。

dom0的方式:在事件处理程序中返回false

针对a元素,可以设置为功能性链接解决跳转问题

  • stopPropagation方法

阻止事件冒泡

  • eventPhase

得到事件所处的阶段

1: 事件捕获 2: 事件目标 3: 事件冒泡

实践

html
<!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>
</head>

<body>
    <p>
        <input type="text" id="txt">
        <button id="btnAdd">添加</button>
    </p>
    <ul>
        <li>
            <span>列表1</span>
            <button>删除</button>
        </li>
        <li>
            <span>列表2</span>
            <button>删除</button>
        </li>
        <li>
            <span>列表3</span>
            <button>删除</button>
        </li>
    </ul>

    <script>
        var btnAdd = document.getElementById("btnAdd");
        var txt = document.getElementById("txt");
        var ul = document.getElementsByTagName("ul")[0];
        btnAdd.onclick = function() {
            var value = txt.value;
            var li = document.createElement("li");
            li.innerHTML = `<span>${value}</span>
            <button>删除</button>`;
            ul.appendChild(li);
            txt.value = "";
        }

        ul.onclick = function(e) {
            if (e.target.tagName === "BUTTON") {
                e.target.parentElement.remove();
            }
        }
    </script>
</body>

</html>
html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>变更栏目框</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .container{
            width: 390px;
            height: 655px;
            margin: 0 auto;
            margin-top: 20px;
        }
        .top{
            width: 100%;
            height: 10%;
            border-bottom: 2px solid #ccc;
        }
        .content{
            width: 100%;
            height: 90%;
        }
        .top ul{
            width: 100%;
            height: 100%;
            display: flex;
            justify-content: space-around;
        }
        li{
            width: 25%;
            height: 100%;
            list-style: none;
            text-align: center;
            /* 将box-sizing设置为border-box,可以随意修改padding而不用修改盒子大小 */
            box-sizing: border-box;
            padding-top: 35px;
            font-size: 18px;
            color: #2c7bbb;
            cursor: pointer;
        }
        li:hover{
            color: #d32228;
        }
        .current{
            border-bottom: 4px solid #d32228;
            color: #d32228;
        }
        img{
            margin-top: 5px;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="top">
            <ul>
                <li data-src="images/1.png">电玩</li>
                <li data-src="images/2.png" class="current">网游</li>
                <li data-src="images/3.png">手游</li>
                <li data-src="images/4.png">数码</li>
            </ul>
        </div>
        <div class="content">
            <img src="./images/1.png" alt="" width="390">
        </div>
    </div>
    <script>
        var ul = document.querySelector(".container .top ul");
        var img = document.querySelector("img");
        ul.onclick = function(e){
            if(e.target.dataset.src){
                document.querySelector("li.current").classList.remove("current");
                img.src = e.target.dataset.src;
                e.target.classList.add("current");
            }
        }
    </script>
</body>
</html>
html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        ul {
            margin: 0;
            list-style: none;
            padding: 0;
        }

        .wrap {
            width: 200px;
            border: 1px solid #ccc;
            text-align: center;
            line-height: 2;
        }

        .title {
            background: rgb(236, 135, 52);
            display: block;
            cursor: pointer;
        }
    </style>
</head>

<body>
    <div class="wrap" id="wrap">
        <ul class="menu">

        </ul>
    </div>

    <script>
        var menu = [{
                name: "菜单一",
                children: ["商品一", "商品二", "商品三", "商品四"]
            },
            {
                name: "菜单二",
                children: ["商品一", "商品二", "商品三", "商品四"]
            }, {
                name: "菜单三",
                children: ["商品一", "商品二", "商品三", "商品四"]
            }, {
                name: "菜单四",
                children: ["商品一", "商品二", "商品三", "商品四"]
            }
        ];
        var ul = document.querySelector("ul.menu");
        menu.forEach(function(item) {
            var li = document.createElement("li");
            li.innerHTML = `<span class="title">${item.name}</span>`;

            var childUl = document.createElement("ul");
            item.children.forEach(function(child) {
                childUl.innerHTML += `<li>${child}</li>`;
            })
            li.appendChild(childUl);
            ul.appendChild(li);
        })

        ul.onclick = function(e) {
            if (e.target.className === "title") {
                var nextUl = e.target.nextElementSibling;
                var style = getComputedStyle(nextUl);
                if (style.display === "none") {
                    nextUl.style.display = "block";
                } else {
                    nextUl.style.display = "none";
                }
            }
        }
    </script>
</body>

</html>

MIT License