Web APIs DOM-事件高级(2)

103 阅读1分钟

鼠标经过事件

1.mouseover和mouseout会有冒泡效果 2.mouseenter和mouseleave没有冒泡效果

阻止默认行为,比如链接点击不跳转,表单域的不提交

//语法
e.preventDefault()

image.png 两种注册事件的区别

image.png

事件委托

事件委托是利用事件流的特征解决一些开发需求的指示技巧

优点:给父级元素加事件(可以提高性能)
原理:事件委托其实是利用事件冒泡的特性,给父元素加事件,子元素可以触发
实现:事件对象.target 可以获得真正触发事件的元素
//e.target
//渲染信息案例,点击录入按钮,可以增加学生信息,点击删除时也可以删除
<head>
<style>
* {
  margin: 0;
  padding: 0;
}

a {
  text-decoration: none;
  color:#721c24;
}
h1 {
  text-align: center;
  color:#333;
  margin: 20px 0;
 
}
table {
  margin:0 auto;
  width: 800px;
  border-collapse: collapse;
  color:#004085;
}
th {
  padding: 10px;
  background: #cfe5ff;
  
  font-size: 20px;
  font-weight: 400;
}
td,th {
  border:1px solid #b8daff;
}
td {
  padding:10px;
  color:#666;
  text-align: center;
  font-size: 16px;
}
tbody tr {
  background: #fff;
}
tbody tr:hover {
  background: #e1ecf8;
}
.info {
  width: 900px;
  margin: 50px auto;
  text-align: center;
}
.info  input {
  width: 80px;
  height: 25px;
  outline: none;
  border-radius: 5px;
  border:1px solid #b8daff;
  padding-left: 5px;
}
.info button {
  width: 60px;
  height: 25px;
  background-color: #004085;
  outline: none;
  border: 0;
  color: #fff;
  cursor: pointer;
  border-radius: 5px;
}
.info .age {
  width: 50px;
}
</style>
</head>
<body>
    <h1>新增学员</h1>
    <div class="info">
        姓名:<input type="text" class="uname" /> 年龄:<input type="text" class="age" />
        性别:
        <select name="gender" id="" class="gender">
            <option value="男"></option>
            <option value="女"></option>
        </select>
        薪资:<input type="text" class="salary" /> 就业城市:<select name="city" id="" class="city">
            <option value="北京">北京</option>
            <option value="上海">上海</option>
            <option value="广州">广州</option>
            <option value="深圳">深圳</option>
            <option value="曹县">曹县</option>
        </select>
        <button class="add">录入</button>
    </div>

    <h1>就业榜</h1>
    <table>
        <thead>
            <tr>
                <th>学号</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
                <th>薪资</th>
                <th>就业城市</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
            <!-- <tr>
            <td>1</td>
            <td>这是名称</td>
            <td>这是年龄</td>
            <td>这是性别</td>
            <td>这是工资</td>
            <td>这是所在城市</td>
            <td>
              <a href="javascript:" class="del">删除</a>
            </td>
          </tr> -->
        </tbody>
    </table>
    <script>
        //  获取数据
        // 姓名
        let uname = document.querySelector('.uname')
        // 性别
        let gender = document.querySelector('.gender')
        // 年龄
        let age = document.querySelector('.age')
        // 资新
        let salary = document.querySelector('.salary')
        // 城市
        let city = document.querySelector('.city')
        let tbody = document.querySelector('tbody')
        // 录入
        let add = document.querySelector('.add')
        // 删除按钮
        let del = document.querySelector('.del')
        //  1. 准备好数据后端的数据
        let arr = [
            // {
            //     stuId: 1005,
            //     uname: '瓜摊老板',
            //     age: 32,
            //     gender: '男',
            //     salary: '4300',
            //     city: '广州'
            // }
        ]
        //   封装成函数
        function init() {
            // 遍历数据
            let str = ''//结构
            for (let i = 0; i < arr.length; i++) {
                str += `
            <tr>
            <td>${arr[i].stuId}</td>
            <td>${arr[i].uname}</td>
            <td>${arr[i].age}</td>
            <td>${arr[i].gender}</td>
            <td>${arr[i].salary}</td>
            <td>${arr[i].city}</td>
            <td>
              <a href="javascript:" class="del" id='${arr[i].stuId}'>删除</a>
            </td>
          </tr>`

            }
            // 填充结构
            tbody.innerHTML = str
        }
        // 调用函数
        init()

        // 数据的新增
        // 1.准备好需要新增的数据,添加到数据源
        // 2.渲染,将生成的数据对象,追加到数组中,重新渲染
        //   点击录入生成数据
        add.addEventListener('click', function () {
            let obj = {
                stuId: arr.length > 0 ? arr[arr.length - 1].stuId + 1 : 1001,
                uname: uname.value,
                age: age.value,
                gender: gender.value,
                salary: salary.value,
                city: city.value
            }
            arr.push(obj)

            init()
        })
        // 动态渲染的元素(未来的元素)的事件绑定需要事件委托,给父元素绑定,让子元素触发
        tbody.addEventListener('click', function (e) {
            // console.log(e.target.id);
            // 点击删除才真正有效
            if (e.target.className = 'del') {
                // 获取当前删除的id
                let id = e.target.id
                for (let i = 0; i < arr.length; i++) {
                    if (id == arr[i].stuId) {
                        // 找到指定id直接删除
                        arr.splice(i, 1)
                        init()
                    }
                }
            }
        })
    </script>
</body>