事件监听器与内联事件的区别 addEventListener vs onclick

我们都知道,在javascript的DOM操作中,事件监听器与内联事件这两个方法可以实现相同的功能,那到底他们有何区别呢?

事件监听器Event Listeners (addEventListener and IE's attachEvent)
<pre>
element.attachEvent()只能使用于IE8及以下浏览器;
element.attachEvent('onclick', function() { /* do stuff here*/ });
</pre>

在大多数其它的其它浏览器包括IE9+,你可以按如下格式使用:
element.addEventListener('click', function() { /* do stuff here*/ }, false);

通过这种方式(DOM Level 2 events),我们可以附加无限个事件到同一个元素,唯一限制我们的就是客户端的内存和其它相关浏览器相关的性能了。

这种方式我们可以灵活地使用anonymous function、function reference或“闭包”:
<pre>
var myFunctionReference = function() { /* do stuff here*/ }

element.attachEvent('onclick', myFunctionReference);
element.addEventListener('click', myFunctionReference , false);
</pre>

另一个重要的addEventListener的特点是最后一个参数,用来控制事件监听器是如何来响应事件的传播机制的(也就是说是否启用capture)。当然,我用的是false在上例中,意思是不使用capture用bubble式,默认的方式,也是约95%的案例所用的处理方式。

但这个参数对于attachEvent()或元素内联事件inline events来说却并没有一个相应的参数来处理。

元素的内联事件Inline events

Ex:
(HTML onclick="" property and element.onclick)

大多数主流的浏览器支持内联事件Inline event中执行javascript代码,我们可以放置一个事件监听器event listener到元素的属性上,类似如下:

<a id="testing" href="#" onclick="alert('did stuff inline');">Click me</a>

大多数有经验的开发者会尽量避开这种方式,但他确实能达到想要的效果;
因为他太简单粗暴直接。
在此处,你可以不用“闭包”和匿名函数anonymous functions(尽管从类别上来说这个处理器自身就是一个匿名函数),因为你能控制的作用域是有限制的。

另一种方法是:

element.onclick = function () { /*do stuff here */ };

这种方法其实是等价于上面的内联事件的,只不过内联javascript希望能够使得你能有更多的作用域方面的控制(因此,你可以编写一个JavaScript脚本,而不是只有HTML)而且能够使用匿名函数、函数引用和“闭包”。

不过,相比以上方式的简单直接而言他们最大的缺点就非常突出了,我们可以也仅仅只可以添加一个内联事件,因为内联事件是作为元素的特性/属性attribute/property来存储在元素element上的,也就是说,元素的属性是可以覆写的.
看下例:
<pre>
var element = document.getElementById('testing');
element.onclick = function () { alert('did stuff #1'); };
element.onclick = function () { alert('did stuff #2'); };
</pre>

我们点击element元素时,可以看到仅仅只有"Did stuff #2"生效,因为第二个值覆盖了第一个分配的值,而且,同时我们也覆盖了元素原生的内联HTML的onclick特性/属性property,具体参看: http://jsfiddle.net/jpgah/

哪一种更好?

这个问题关乎浏览器兼容性的需要以及我们自身的需要,是否我们真的需要附加多个事件到同一个元素上呢?是否我们的项目更具前瞻性,可以用更超前的方式?如果是attachEvent()和addEventListener()都可以考虑,如果不是,一个小小的内联元素inline event也能搞惦这个把戏。

不过jQuery和一些其它类似的javascript框架已经把这些问题打包成了通用的解决方案了,同样的代码用jQuery来实现就很简单了,而且所有的不同类型的浏览器都兼容:
$(element).on('click', function () { /* do stuff */ });

最后,不要试着用一种方式来做这个事情,我们可以小改动一下来照顾一下老版本的浏览器:

function addEvent(element, evnt, funct){
  if (element.attachEvent)
   return element.attachEvent('on'+evnt, funct);
  else
   return element.addEventListener(evnt, funct, false);
}

// example
addEvent(document.getElementById('myElement'),'click',function () { alert('hi!'); }
);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容