事件对象
事件对象封装了事件的相关信息
获取事件对象
- 通过事件处理函数的参数获取
- 旧版本的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>