事件

添加事件的方法

  • HTML-on属性
    和后面两种方式不同,on属性的值是将会执行的代码,而不是一个函数。
    只会在冒泡阶段触发
<body onload="doSomething()">
<div onclick="console.log('触发事件')">
  • element节点的事件属性
    监听函数只会在冒泡阶段触发
    兼容性好,但是同一个事件只能绑定一个监听函数
  • addEventListener方法
    参数一:事件名称,大小写敏感
    参数二:监听函数
    参数三:可省,默认为false,只在冒泡阶段触发
    同一个事件能绑定多个监听函数
div1.addEventListener('click',function(){
     alert(2)
 })

移除事件的方法

 function fn(){
    alert(2)
}
div1.addEventListener('click',fn)
div1.removeEventListener('click',fn)
//这种方法并不能移除事件,因为两个函数的内存地址不同
div1.addEventListener('click',function(){
      alert(2)
})
div1.removeEventListener('click',function(){
      alert(3)
 })

事件的传播机制

当用户点击页面时,浏览器总是假定用户点击的是点击位置嵌套最深的节点
DOM2级规定事件有三个阶段:
1.从window对象到目标节点,捕获阶段
2.在目标节点上触发,目标阶段
3.从目标节点传导到window对象,冒泡阶段

    <div class='container'>
        <div class="box">
            <button type="" class="btn">按钮</button>
        </div>
    </div>
    <script>
        var container=document.querySelector('.container')
        var box=document.querySelector('.box')
        var btn=document.querySelector('.btn')
        container.addEventListener('click',function(){
            console.log('clicked container...')
        })
        box.addEventListener('click',function(){
            console.log('clicked box...')
        })
        btn.addEventListener('click',function(){
            console.log('clicked btn...')
        })

this指向

addEventListener方法指定的监听函数,内部的this对象总是指向触发事件的那个节点
以下写法的this对象都指向Element节点。

// JavaScript代码
element.onclick = print
element.addEventListener('click', print, false)
element.onclick = function () {console.log(this.id);}
// HTML代码
<element onclick="console.log(this.id)">

以下写法的this对象,都指向全局对象。

// JavaScript代码
element.onclick = function (){ doSomething() };
element.setAttribute('onclick', 'doSomething()');
// HTML代码
<element onclick="doSomething()">

event对象

事件发生后,会生成一个事件对象,作为参数,传递给监听函数
event.currentTarget
绑定事件的节点
event.target
浏览器假定用户点击的深层节点

使用事件代理

    <ul class="ct">
        <li>这里是</li>
        <li>饥人谷</li>
        <li>前端6班</li>
    </ul>
    <script>
        var ct = document.querySelector('.ct')
        ct.addEventListener('click',function(e){
       
            if(e.target.tagName.toLowerCase()==='li'){
                console.log(e.target.innerText)
            }
        })
        
    </script>

如何阻止事件冒泡? 如何阻止默认事件?

在事件的监听函数中使用:
e.stopPropagation()
e.preventDefault()

    <div class='container'>
        <div class="box">
            <button type="" class="btn">按钮</button>
        </div>
    </div>
    <a href="http://www.baidu.com">点击链接跳转到百度</a>
    <script>
        var container=document.querySelector('.container')
        var box=document.querySelector('.box')
        var btn=document.querySelector('.btn')
        var a=document.querySelector('a')
        container.addEventListener('click',function(e){
            console.log('clicked container...')
        })
        box.addEventListener('click',function(){
            console.log('clicked box...')
        })
        btn.addEventListener('click',function(e){
            e.stopPropagation()  // 阻止事件冒泡
            console.log('clicked btn...')
        })
        a.addEventListener('click',function(e){
           e.preventDefault()  // 阻止默认事件
           alert(1)
        })
    </script>

DOM0 事件和DOM2级在事件监听使用方式上有什么区别?

DOM0级

  • HTML语言,允许在元素标签属性中,直接定义某些事件的监听代码。在HTML标签的on属性上,定义要执行的代码
<p onclick='console.log(2)'></p>
  • Element节点有事件属性,可以指定监听函数
ele.onclick=function(){}

DOM2级
通过Element节点Document节点,Window对象的addEventListener 和 removeEventListener方法

window.addEventListener('load', doSomething, false)
第一种“HTML标签的on-属性”,违反了HTML与JavaScript代码相分离的原则;第二种“Element节点的事件属性”的缺点是,同一个事件只能定义一个监听函数,也就是说,如果定义两次onclick属性,后一次定义会覆盖前一次。因此,这两种方法都不推荐使用,除非是为了程序的兼容问题,因为所有浏览器都支持这两种方法。

addEventListener是推荐的指定监听函数的方法。它有如下优点:

1.可以针对同一个事件,添加多个监听函数。

2.能够指定在哪个阶段(捕获阶段还是冒泡阶段)触发回监听函数。

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

推荐阅读更多精彩内容

  • 声明:本文来源于http://www.webzsky.com/?p=731我只是在这里作为自己的学习笔记整理一下(...
    angryyan阅读 6,942评论 1 6
  • 事件是一种异步编程的实现方式,本质上是程序各个组成部分之间的通信。DOM支持大量的事件,本节介绍DOM的事件编程。...
    周花花啊阅读 592评论 0 3
  • 以下文章为转载,对理解JavaScript中的事件处理机制很有帮助,浅显易懂,特分享于此。 什么是事件? 事件(E...
    jxyjxy阅读 3,022评论 1 10
  • JavaScript 程序采用了异步事件驱动编程模型。在这种程序设计风格下,当文档、浏览器、元素或与之相关的对象发...
    劼哥stone阅读 1,250评论 3 11
  • 人生,明白一二就可以了,全明白了没劲,全不明白浑噩。明白那么一二,半梦半醒就可以了。只愿,此身越重洋,此身不勉强,就好。
    一芥余舟阅读 176评论 0 0