javascript中 addEventListener和attachEvent以及element.onclick的区别

attachEvent是ie添加事件处理程序,接收两个参数,其中事件类型名称要加"on",

可以添加多个事件处理程序,按照添加顺序相反的顺序触发;

addEventListener是给非ie添加事件处理程序,接收三个参数,第一个是事件名,不需要加“on”,

第二个是绑定的函数,第三个参数是一个布尔值,是事件的方式,意思是是否使用useCatch方式,

如果是false,就使用传统的冒泡方式,如果为true,就在捕获阶段调用事件处理程序。

addEventListener可以添加多个事件处理程序,按照添加顺序触发

二者有个本质上的区别,attachEvent的事件处理程序会在全局作用域中运行,this等于window对象,

而addEventLinstener添加的事件处理程序是在其依附的元素的作用域中运行的,this等于绑定元素对象。

既然他们的this指向不同,那怎么才能实现相同的this指向呢?

如果想要实现this关键字指向相同的话,要用Function的apply或者call方法。示例代码如下:

function bind(el, fn, type){

var _fn = function(){

fn.apply(el, arguments);

};

window.addEventListener ? el.addEventListener(type, _fn, false) : el.attachEvent("on" + type, _fn);

}

即用el来代替_fn里的this。

el.onclick和addEventListener和attachEvent有什么区别呢?

本质的区别是el.onclick相当于在标签上写onclick,用addEventListener和attachEvent是通过DOM接口去绑定事件。

一个html文档的解析是有顺序的,先解析标签项,再解析DOM项,el.onclick事实上相当于写在标签上,

通过标签的onclick属性输入到文档,然后由文档解析成事件的。而后者,要在文档解析完成以后,

通过文档的dom接口去绑定的事件,虽然结果是一样的,都是click事件,但是过程是不同的。

通过这三种方式绑定的事件,怎么取消呢?

el.onclick:el.onclick=null;这样就可以取消绑定在el上的事件处理程序了。

通过addEventListener()添加的事件处理程序只能通过removeEventListener()来移除,并且移除时传入的参数与添加

处理程序时使用的参数相同。通过addEventListener()添加的匿名函数将无法移除。

通过attachEvent()添加的事件处理程序要通过detachEvent()来移除,其他的情况和addEventListener()一样。

如果都想在事件函数里面获取event对象,怎么获取呢?

这要分浏览器,IE和非IE的事件对象不同。兼容DOM的浏览器会将一个event对象传入到事件处理程序中,无论指定事件

处理程序时使用什么方法,都会传入event对象。

el.onclick=function(event){

  alert(event.type); //"click"

};

el.addEventListener("click",function(event){

  alert(event.type); //"click"

},false);

通过HTML标签属性指定的事件处理程序时,变量event中保存着event对象。

<input type="button" value="Click me" onclick="alert(event.type)"/> //"click"

在IE中,要访问event对象有几种不同的方式:

通过el.onclick绑定的事件处理程序中,event对象作为window对象的一个属性存在。

el.onclick=function(){

  var event=window.event;

  alert(event.type); //"click"

}

如果通过attachEvent()添加事件处理程序时,event对象作为参数被传入事件处理程序,

el.attachEvent("onclick",function(event){

  alert(event.type); //"click"

});

通过HTML标签属性指定的事件处理程序时,变量event中保存着event对象。这点和非IE一样。

综上,跨浏览器的事件对象获取方法是: return event?event:window.event;

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-03 15:16:25

javascript中 addEventListener和attachEvent以及element.onclick的区别的相关文章

addEventListener和attachEvent以及element.onclick的区别

attachEvent是ie添加事件处理程序,接收两个参数,其中事件类型名称要加"on", 可以添加多个事件处理程序,按照添加顺序相反的顺序触发; addEventListener是给非ie添加事件处理程序,接收三个参数,第一个是事件名,不需要加“on”, 第二个是绑定的函数,第三个参数是一个布尔值,是事件的方式,意思是是否使用useCatch方式, 如果是false,就使用传统的冒泡方式,如果为true,就在捕获阶段调用事件处理程序. addEventListener可以添加多个事件

javascript中addEventListener(attachEvent)详解

addEventListener 有三个参数:第一个参数表示事件名称(不含 on,如 "click"):第二个参数表示要接收事件处理的函数:第三个参数为 useCapture.例子如下:  <button type="button">点击我</button> <img src="11 (6).jpg" alt="" style="display:block"> <s

Javascript 的addEventListener()及attachEvent()区别分析

大家都知道事件的用法就是当某个事件(状况)被触发了之后就会去执行某个Function, 尤其是Javascript, 在当红AJAX的催化下, 了解Javascript的Event用法更加重要, 在这里就大概介绍一下avascript的Event用法. Mozilla中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target: 文档节点.document.window 或 XMLHtt

在javascript中关于submit和button提交表单区别

原文:在javascript中关于submit和button提交表单区别 原文来自:http://www.jb51.net/article/42236.htm submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了,submit和button,二者都以按钮的形式展现,看起来都是按钮,所不同的是type属性和处发响应的事件上. 1. 如果表单在点击提交按钮后需要用JS进行处理(包括输入验证)后再提交的话,通常都必须把submit改成button,即取消其自动提交的

(转)在javascript中关于submit和button提交表单区别

原文来自:http://www.jb51.net/article/42236.htm submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了,submit和button,二者都以按钮的形式展现,看起来都是按钮,所不同的是type属性和处发响应的事件上. 1. 如果表单在点击提交按钮后需要用JS进行处理(包括输入验证)后再提交的话,通常都必须把submit改成button,即取消其自动提交的行为, 否则,将会造成提交两次的效果,对于动态网页来说,也就是对数据库操作

JavaScript中querySelector()和getElementById()(getXXXByXX)的区别

在日常开发中,使用JavaScript获取元素的时候,最常用的方法就是document.getElementById(getXXXByXX)方法.但是最近发现有很多地方使用的是querySelector方法而不是使用前面的方法.去官方文档查看是这么说的: 文档对象模型Document引用的querySelector()方法返回文档中与指定选择器或选择器组匹配的第一个 html元素Element. 如果找不到匹配项,则返回null. 这句话看意思和getElementById(getXXXByXX

关于JavaScript中apply与call的用法意义及区别(转)

JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别.先来看看JS手册中对call的解释: call 方法调用一个对象的一个方法,以另一个对象替换当前对象.call([thisObj[,arg1[, arg2[,   [,.argN]]]]])参数thisObj可选项.将被用作当前对象的对象.arg1, arg2,  , argN可选项.将被传递方法参数序列.说明call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下

Javascript中call方法和apply方法用法和区别

第一次在博客园上面写博客,知识因为看书的时候发现了一些有意思的知识,顺便查了一下资料,就发到博客上来了,希望对大家有点帮助. 连续几天阅读<javascript高级程序设计>这本书了,逐渐发现了以前很多自己完全没有用过甚至见过的神奇知识点.今天在阅读到有关函数的属性和方法的时候,略感高级,于是乎,查阅了不少他人的博客,在此总结一下这两个方法的以下几个方面: 1.call()和apply()的作用和用法 2.什么时候用apply(),什么时候用call() 书上提到,每个函数都包含两个非继承而来

javascript中apply()方法和call()方法有什么区别?

JavaScript作为web前端开发的必用技术之一,在前端编写的过程中,都会涉及到.但在编写JavaScript的过程中,有一些方法却让人很是纳闷,比如apply()和call()方法. 存在即是合理的,很多时候在编程中,我们不得不用apply()和call()方法的场景,下面我们就通过代码来看看这两种方法的应用. <html> <body> <script> var product = "house"; var boss = { chooseWo