②删除事件
1.传统注册事件
eventTarget.οnclick=null;
2.方法监听注册事件
eventTarget.removeEventListener(type,listener[,useCapture]);
<style>
div{
width:100px;
height:100px;
background-color:pink;
}
</style>
<body>
<div>
1
</div>
<div>
2
</div>
<div>
3
</div>
<script>
var div = document.querySelectorAll('div');
//①传统方式注册和删除
div[0].onclick=function(){
alert('点击事件1');
this.onclick=null;
}
//②监听方式的注册
div[1].addEventListener('click',function(){
alert('点击事件2');
})
//③监听方式的删除
function fn(){
alert('点击事件3');
div[2].removeEventListener('click',fn);
}
div[2].addEventListener('click',fn)
</script>
</body>
③DOM事件流
事件流描述的是从页面中接受事件的顺序
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流
比如给div注册了点击事件
DOM事件流分为三个阶段
1.捕获阶段
2.当前目标阶段
3.冒泡阶段
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流
注意:
1.JS代码中只能执行捕获或者冒泡其中的一个阶段
2.onclick和attachEvent只能得到冒泡阶段
3.捕获阶段,如果addEventListener 第三个参数是true,那么则处于捕获阶段
4.冒泡阶段,如果addEventListener 第三个参数是true,那么则处于冒泡阶段(更加关注)
5.有些事情是没有冒泡的,比如onblur,onfocus,onmouseenter,onmouseleave
<style>
.father{
margin:0px auto;
width:200px;
height:200px;
background-color:pink;
border:1px solid #fff;
}
.son{
margin:auto;
width:150px;
height:150px;
background-color:blue;
margin-top:25px;
}
</style>
<body>
<div class="father">
<div class="son">盒子</div>
</div>
<script>
var son = document.querySelector('.son');
var father = document.querySelector('.father');
//捕获阶段 document->html->body->father->son
son.addEventListener('click',function(){
alert('son');
},true);
father.addEventListener('click',function(){
alert('father');
},true);
//冒泡阶段 如果addEventListener第三个参数是false或者省略那么处于冒泡阶段
son.addEventListener('click',function(){
alert('son');
},false);
father.addEventListener('click',function(){
alert('father');
},false);
</script>
</body>
④事件对象(重要)
官方解释:
event对象代表事件的状态,比如键盘按键的状态、鼠标的位置、鼠标按钮的状态
简单理解:
事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象event,他有很多属性和方法
<body>
<div style="width:100px; height:100px; background-color:pink">
点击触发事件
</div>
<div style="width:100px; height:100px; background-color:pink">
点击通过监听触发
</div>
<script>
//事件对象
var div = document.querySelectorAll('div');
//1.event就是一个事件对象,写道我们侦听函数的小括号里面,当形参来看
//2.事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数
//3.事件对象是我们时间的一系列相关数据的集合 跟事件相关的
//比如鼠标点击里面就包含了鼠标的相关信息,比如鼠标坐标
//如果是键盘事件里面就包含的键盘事件的信息,比如判断用户按下了哪个键
//4.这个事件对象可以自己命名,比如event、evt、e
//5.事件对象也有兼容性问题,ie678通过window.event
//传统注册事件
div[0].onclick=function(event){
console.log(event);
//兼容ie678 版本方法
console.log(window.event);
//解决兼容性问题
e=e||window.event;
console.log(e);
}
//监听注册事件
div[1].addEventListener('click',function(event){
console.log(event);
})
</script>
</body>
⑤target和this的区别
e.target:返回的是触发事件的对象,
this:绑定哪个触发事件就返回哪一个
<body>
<div style="width:100px;height:100px;background-color:pink;">
这是一个盒子
</div>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script>
var div=document.querySelector('div');
var ul = document.querySelector('ul');
div.addEventListener('click',function(e){
console.log(e.target);
console.log(this);
})
ul.addEventListener('click',function(e){
console.log(e.target);
console.log(this);
})
</script>
</body>
常见的事件对象属性方法
⑥阻止事件冒泡
事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到DOM最顶层节点
stopPropagation()
<style>
.father{
margin:0px auto;
width:200px;
height:200px;
background-color:pink;
border:1px solid #fff;
}
.son{
margin:auto;
width:150px;
height:150px;
background-color:blue;
margin-top:25px;
}
</style>
<body>
<div class="father">
<div class="son">盒子</div>
</div>
<script>
var son = document.querySelector('.son');
var father = document.querySelector('.father');
//捕获阶段 document->html->body->father->son
son.addEventListener('click',function(){
alert('son');
},true);
father.addEventListener('click',function(){
alert('father');
},true);
//冒泡阶段 如果addEventListener第三个参数是false或者省略那么处于冒泡阶段
son.addEventListener('click',function(e){
alert('son');
<!----------------阻止冒泡------------------------>
e.stopPropagation();
},false);
father.addEventListener('click',function(){
alert('father');
},false);
</script>
</body>
⑦事件委托(代理、委派)
事件委托也称为时间代理,在jQuery里面称为事件委派
事件委托原理
不是给每个子节点单独设置事件监听器,而是事件监听器设置在其父结点上,然后利用冒泡原理影响设置每个子节点
案例
例如:给ul注册点击事件,然后利用事件对象的target来找到当前点击的li,因为点击li,事件会冒泡到ul上,ul有注册事件,就会触发事件监听器
<body>
<ul>
<li>1</li>
<li>2</li>
<li>4</li>
<li>3</li>
<li>5</li>
</ul>
<script>
var ul = document.querySelector('ul');
ul.addEventListener('click',function(e){
alert('quququuquq');
e.target.style.backgroundColor='pink';
})
</script>
</body>
⑧常用鼠标键盘事件
onclick:鼠标点击左键触发
onmouseover:鼠标经过触发
onmouseout:鼠标离开出发
onfocus:获得鼠标焦点出发
onblur:失去鼠标焦点触发
onmousemove:鼠标移动触发
onmouseup:鼠标弹起触发
onmousedown:鼠标按下触发
1.禁止鼠标右键菜单
contextmenu主要控制应该何时显示上下文,主要用于程序员取消默认的上下文的菜单
document.addEventListener('contextmenu',function(e){
e.preventDefault();
})
2.禁止鼠标选中
selectstart开始选中
document.addEventListener('selectstart',function(e){
e.preventDefault();
})
3.鼠标和键盘事件对象
event对象代表事件的状态,跟事件相关的一系列信息的集合,现阶段主要用
鼠标事件对象: MouseEvent
e.clientX
e.clientY
clint鼠标相对于浏览器可视区的x和y坐标
e.pageX
e.pageY
page鼠标相对于文档页面的x和y坐标(IE9+支持)
e.screenX
e.screenY
screen鼠标相对于电脑屏幕的x和y坐标
可以回顾一下本文章的④事件对象
<body>
<div style="width:100px; height:100px; background-color:pink">
点击触发事件
</div>
<div style="width:100px; height:100px; background-color:pink">
点击通过监听触发
</div>
<script>
//事件对象
var div = document.querySelectorAll('div');
//传统注册事件
div[0].onclick=function(event){
console.log(event.clientX);
console.log(event.clientY);
}
//监听注册事件
div[1].addEventListener('click',function(event){
console.log(event.clientX);
console.log(event.clientY);
})
</script>
</body>
键盘事件对象: keyboardEvent
onkeyup:某个键盘按键被松开时触发
onkeydown:某个键盘按键被按下时触发(识别功能键)
onkeypress:某个键盘按键被按下时触发(不识别功能键:ctrl shift等)
执行顺序:keydown->keypress->keyup
<body>
<script>
document.addEventListener('keyup',function(){
console.log('我弹起了');
})
document.addEventListener('keydown',function(){
console.log('我按下了down');
})
document.addEventListener('keypress',function(){
console.log('我按下了press');
})</script>
</body>
4.案例:跟随鼠标移动
<style>
img{
position:absolute;
width:10px;
height:10px;
}
</style>
<body>
<img src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1934942912,2600722552&fm=26&gp=0.jpg" alt>
<script>
var img=document.querySelector('img');
document.addEventListener('mousemove',function(e){
var x=e.pageX;
var y = e.pageY;
//不要忘记
img.style.left=x+'px';
img.style.top=y+'px';
});
</script>
</body>
5.案例:判断用户按下哪个键
<body>
<script>
document.addEventListener('keyup',function(e){
console.log('Up'+e.keyCode);
//弹起键盘的ASCII值
//1.keyup呵keydown事件不区分大小写,a和A得到的都是65
//1.keypress事件区分字母大小写
})
document.addEventListener('keypress',function(e){
console.log('Press:'+e.keyCode);
//弹起键盘的ASCII值
//1.keyup呵keydown事件不区分大小写,a和A得到的都是65
//1.keypress事件区分字母大小写
})
</script>
</body>
今天学完了,之前落下的太多,七天肯定学不完了
可能完了我会把标题改了,看看一个正常人无JavaScript基础,有C语言和HTML基础能多久学的很踏实