美文网首页
浅谈addEventListener和on的区别

浅谈addEventListener和on的区别

作者: 一座被占用 | 来源:发表于2017-01-13 23:43 被阅读0次

有的时候我会遇到导入本地文件<input class="IamInputElement" type="file"/>的情况,但是往往为了美观或者为了可以自己设计一个美观的样式而将input的样式设置为display:none。然后给出一个button,为button添加click时间,然后document.getElementByClassName("IamInputElement").click(),这样就可以实现对input框的点击了。

但是我们还需要获取到input输入的地址,这个时候往往会给input框添加上addEventListener事件:document.getXXX("XXX").addEventListener("change",function(e){

 var file   = e.target.files[0]

})

另外如果是react的话就可以用this.refs.XXX.addEventListener来实现(一般会在componentDidMount中实现)


以上作为一个分割线吧,虽然跟题目没有什么太大的关系。但是因为上面的问题而引起的对题目(addEventListener和on的区别)的思考。家长里短的说一下。

抛开上面的例子。以一个button为例子,在js中为他加上click点击事件的话可以使用。document.getElementById("thisIsButtonId").onclick = function(){

 //dosomething

}

通过以上的方法可以在button被点击的时候做出响应。

但是这种方法如果为同一个button添加多个响应事件,只会执行最后一个,因为后面的会覆盖前面的。

然后来看看addEventListener()方法:

document.getElementById("thisIsButtonId").addEventListener(“click”,function(){

 //dosomething

}),这个样子的话就可以实现跟上面一样的效果了。只是如果通过这个方法为button添加多个方法的时候每一个方法都会执行。

来看看某网站的文档说明:

这里面的bool型参数useCapture是控制执行的顺序的(useCapture默认为FALSE)

上面大概的意思是如果两个element都包含响应事件的话,useCapture控制执行的顺序:

如果useCapture为false:根据事件冒泡的顺序执行的。也就是说是根据被点击的元素向外逐个执行。

如果useCaptrue为true:跟上面相反。也叫事件捕获执行。


为什么使用addEventListener()呢?

第一:允许为一个event(例如:click)添加多个handler。

第二:为我们提供了可选的执行顺序,有useCaptrue来控制(如果我没有理解错的话)

第三:实用在任何DOM中,这个在最前面提到的react中使用到了。可以通过this.refs.XXX.addeventListener('click',function(){},false)

另外,addEventListener()过后需要removeEventListener()的话需要使用同一个function()也就是说document.getElementById("XX").addEventListener('click',function(){})

然后document.getElementById("XX").removeEventListener('click',function(){}),这样是不对的。因为前后两个的function是不一样的,即使他们的方法都是一模一样的。应该使用

function func(){//dosomething},然后将这个func放进去,这样的话两个方法用的就是同一个function了。但是要注意:func后面就不可以加“()”了


以前的时候很少看文档,现在慢慢养成这样的习惯吧。这次总结(如果这鬼东西也能叫总结的话),我看英文文档看的心好累。最后的时候感觉自己总结的狗屁不通。慢慢改进吧。x

相关文章

网友评论

      本文标题:浅谈addEventListener和on的区别

      本文链接:https://www.haomeiwen.com/subject/cnasbttx.html