前言:今天才发现,原来我对DOM事件理解的如此不够深入,仅限于做点正常的页面,顿时感觉自己不是一个合格的前端程序员,现在,我就用这篇文章也算是给大家做一个小测试,看你们对DOM事件有多少的了解呢~~
关键词:DOM事件,addEventListener,onclick~~......
正文:
一、这是一个小例子:
<head>
<script>
function print(){
console.log('hi');
}
</script>
</head>
<body>
<button id=x onclick="print">A</button>
<button id=y onclick="print()">B</button>
<button id=z onclick="print.call()">C</button>
</body>
js:
x.onclick = print
y.onclick = print() //undefined
z.onclick = print.call() //undefined
现在,问题来了,ABCXYZ几种方法里面哪个会打印出hi~~
六秒钟思考,6,5,4,3,2,1
答案:BCX会打印出hi
二、这是第二个小例子:
<body>
<button id=xxx >A</button>
</body>
js:
xxx.addEventListener('click',function(){
console.log(1);
})
xxx.onclick = function (){
console.log(1);
}
请问,这两个有什么区别吗?
答案:
xxx.onclick = function (){//是属性,唯一
console.log(1);
}
一个节点只能有这样的一个onclick,试想如下情况:
xxx.onclick = function (){
console.log(1);
}
xxx.onclick = function (){
console.log(2);
}
那请问是打印出1还是2呢?答案是2.那1去哪里呢,当然是被2覆盖了。试想如果在工作中,你和你的同事出现了上述情况,,,,后续大家自行脑补。
onclick说完了,我们说下
xxx.addEventListener('click',function(){
console.log(1);
}),这个和onclick有什么区别呢?xxx.addEventListener,这是个队列,是个
事件监听队列。当你写出如下代码时
xxx.addEventListener('click',function(){
console.log(1);
})
xxx.addEventListener('click',function(){
console.log(2);
})
会先打出1,再打出2.为什么?我先问你一个问题,队列的特点是什么?答:
先进先出
xxx拥有一个队列 eventListeners ,你不能直接访问他,但是你可以通过addEventListener往这个队列里排一个队,现在,排是排进去了,但是怎么走呢?
三、这是第三个小例子:
function f1 (){
console.log('1');
}
function f2 (){
console.log('2');
}
function f3 (){
console.log('3');
}
xxx.addEventListener('click',f1})
xxx.addEventListener('click',f2})
xxx.removeEventListener('click',f1})
xxx.addEventListener('click',f3})
xxx.removeEventListener('click',f3})
答案:只打印出2
那现在有没有什么方法让addEventListener click点击一次再点击就不行了呢?
function f1 (){
console.log('1');
xxx.addEventListener('click',f1})
}
xxx.addEventListener('click',f1})
也就是触发一次事件后马上再把它从队列里移走。
网友评论