为事件找对象
操作处理对象
其中,操作处理对象,包括但不限于修改样式,读取样式
事件的冒泡
上面给出了当后代元素为某事件绑定响应函数时,其祖先元素也有某个相同的事件时,而且祖先元素也绑定了响应的函数,那么会出现冒泡行为
其次,如果给一个父元素的某个事件绑定了响应函数,那么,浏览器默认在该父元素的子元素内也会发生该事件,并激发该行为,比如:下面这个例子
<! DOCTYPE html >
< html lang = " zh" >
< head>
< meta charset = " UTF-8" >
< meta http-equiv = " X-UA-Compatible" content = " IE=edge" >
< meta name = " viewport" content = " width=device-width, initial-scale=1.0" >
< title> div移动</ title>
< style>
#box1 {
width : 200px;
height : 200px;
background-color : #bfa;
position : absolute;
}
#box2 {
width : 500px;
height : 500px;
background-color : pink;
}
</ style>
< script>
window. onload = function ( ) {
var box1 = document. getElementById ( "box1" ) ;
document. documentElement. onmousemove = function ( event ) {
event = event || window. event;
var left = event. clientX;
var top = event. clientY;
var distanceX = document. documentElement. scrollLeft || document. body. scrollLeft;
var distanceY = document. documentElement. scrollTop || document. body. scrollTop;
console. log ( distanceX) ;
console. log ( distanceY) ;
box1. style. left = left + distanceX + "px" ;
box1. style. top = top + distanceY + "px" ;
}
}
</ script>
</ head>
< body style = " height : 2000px" >
< div id = " box2" >
< div id = " box1" > </ div>
</ div>
</ body>
</ html>
此时发现,box1此时也可以在box2里面动,因为,我为document.documentElement(HTML)对象绑定了一个鼠标移入事件
因此,即使没有为box2设置鼠标移入事件,但是box1仍然可以移入到box2中,这相当于"事件的冒泡",但是这个根据上面的事件冒泡给出的定义可能不好理解,我们可以从侧面来证明是事件的冒泡的作用产生的,比如,我们为通过事件对象,来取消冒泡,具体加入以下代码
<! DOCTYPE html >
< html lang = " zh" >
< head>
< meta charset = " UTF-8" >
< meta http-equiv = " X-UA-Compatible" content = " IE=edge" >
< meta name = " viewport" content = " width=device-width, initial-scale=1.0" >
< title> div移动</ title>
< style>
#box1 {
width : 200px;
height : 200px;
background-color : #bfa;
position : absolute;
}
#box2 {
width : 500px;
height : 500px;
background-color : pink;
}
</ style>
< script>
window. onload = function ( ) {
var box1 = document. getElementById ( "box1" ) ;
document. documentElement. onmousemove = function ( event ) {
event = event || window. event;
var left = event. clientX;
var top = event. clientY;
var distanceX = document. documentElement. scrollLeft || document. body. scrollLeft;
var distanceY = document. documentElement. scrollTop || document. body. scrollTop;
console. log ( distanceX) ;
console. log ( distanceY) ;
box1. style. left = left + distanceX + "px" ;
box1. style. top = top + distanceY + "px" ;
}
var box2 = document. getElementById ( "box2" ) ;
box2. onmousemove = function ( event ) {
event = event || window. event;
event. cancelBubble = true ;
}
}
</ script>
</ head>
< body style = " height : 2000px" >
< div id = " box2" >
< div id = " box1" > </ div>
</ div>
</ body>
</ html>
我们可以发现,box1不能再移入到box2中
事件的委派 ,结合Js基础的第114个视频,好好理解
下面谈谈我在此练习中遇到的问题
问题一:把下面图片中的红色方框的内容写到对应的响应事件外面,导致当点击多次按钮时,只能在原来的ul中li的基础之上,始终只能添加一个li
也就是写成了这样
出现上面情况的原因是,相当于,我每次点击按钮时,添加的都是全局中的li,并没有添加新增加的li,因为每一个li是不一样的
问题二:为了解决利用事件的冒泡的前提,再来解决事件的委派时的问题,此处获取了event.target来确认点击的是哪个节点,此处使用的是给想要的节点添加class,通过下面图中的event.target.className=="test"来判断,但是有一个问题在于,class="a b c"中可以设置多个属性名,当此练习中的class中不止一个,上面的判断就会导致一些问题,视频末尾提到可以利用“正则表达式来解决”