JavaScript-高级篇之事件

  1. 什么是事件
  2. 掌握事件流
  3. 掌握DOM事件流与IE事件处理程序
  4. 掌握跨浏览器的事件处理程序
  5. 掌握event对象的常用属性及方法
  6. 掌握常用的事件类型

事件

事件是可以被JavaScript侦测到的行为,通俗的讲就是当用户与Web页面进行某些交互时,解释器就会创建响应的event对象以描述事件信息

事件定义

一共有三种方式:

  1. 直接在HTML中定义元素的事件相关属性
    缺点:违反了内容与行为相分离的原则,应尽可能少用
<button onclick=alert('hello')>按钮</button>
  1. DOM0级事件,在JS中为元素的事件相关属性赋值
    此语法实现了内容与行为相分离,但元素扔只能绑定一个监听函数
document.getElementById('btn').onclick = function(){
    //...
}
document.body.onload = init;
function init(){
    //...
}
  1. DOM2级事件,高级事件处理方式,一个事件可以绑定多个监听函数
    此语法可以为一个元素绑定多个监听函数,但需要注意浏览器兼容性问题

参数 : 事件类型 事件句柄 false冒泡(默认false)/true捕获

btn.addEventListener('click',function(){     
    //...
},false) 
btn.addEventListener('click',function(){},flase);   //DOM
btn.attachEvent('onclick',function(){});    //IE
document.body.addEventListener('load',init);
document.body.attachEvent('onload',init);
function init(){
    //...
}

1.html中定义,html中写js代码,强耦合,不利于复用代码
2.DOM0级事件,事件对象的属性添加绑定事件,松耦合,缺点是有且只有一个事件句柄
3.DOM2级事件,通过addEventListener函数绑定事件,松耦合,绑定多个事件,事件捕获和事件冒泡

事件解绑

移除addEventListener()方法添加的事件句柄

element.removeEventListener(event,function,useCapture)

参数:
event : 必须,字符串,要移除的事件名称
function : 必须,指定要移除的函数
useCapture : 可选,布尔值,指定移除事件句柄的阶段

var fun = function(){   //解绑成功需要将事件句柄定义
    //...
}
btn.removeEventListener('click',fun,false)   

解绑成功要保证参数一致

IE事件流

添加事件

用于IE8以及以下的浏览器
attachEvent()
语法 : element.attachEvent(event,function)
功能 : 用于向指定元素添加事件句柄
参数 : event事件名,必须加'on'前缀
function绑定事件的函数

移除事件

detachEvent()
同上

跨浏览器事件处理程序

事件句柄中,IE中的事件句柄 this是指向window

<button id="mybtn">点击我</button>
<script>
    //兼容所有浏览器
    //addEventListener attachEvent
    var eventUtil = {
        addHandler : function(element,type,handler){
            //绑定事件
            //chrome,firefox,ie9等
            //ie8及以下浏览器
            if (element.addEventListener) {
                element.addEventListener(type,handler,false);
            }else if (element.attachEvent) {
                element.attachEvent('on'+type,handler);
            }else{
                element['on'+type] = null;
            }
        },
        removeHandler : function(element,type,handler){
            //移除事件
            if (element.removeEventListener) {
                element.removeEventListener(type,handler,false);
            }else if (element.detachEvent) {
                element.detachEvent('on'+type,handler);
            }else{
                element['on'+type] = null
            }
        }
    }
    var btn = document.getElementById('mybtn');
    var handler = function(){
        alert('clicked');
    }
    eventUtil.addHandler(btn,'click',handler);
    // eventUtil.removeHandler(btn,'click',handler);
</script>

事件冒泡和事件捕获

事件周期

解释器创建一个event对象后,会按如下过程将其在html元素间进行传播:
第一阶段 : 事件捕获,事件对象沿DOM树向下传播
第二阶段 : 目标触发,运行事件监听函数
第三阶段 : 事件冒泡,事件沿DOM树向上传播

IE的事件模型中没有事件捕获阶段

事件周期
<div id="parent">
    <div id="child">click son</div>     
</div>
<script>
    //事件冒泡 
    document.getElementById('parent').addEventListener('click',function(e){
        alert('parent事件触发,'+this.id)    
    },false);
    document.getElementById('child').addEventListener('click',function(e){
        alert('child事件触发,'+this.id)
    },false);
    //点击后 child事件触发 parent事件触发

    //事件捕获
    document.getElementById('parent').addEventListener('click',function(e){
        alert('parent事件触发,'+this.id)    
    },true);
    document.getElementById('child').addEventListener('click',function(e){
        alert('child事件触发,'+this.id)
    },true);
    //点击后 parent事件触发 child事件触发
</script>

事件委托(原理是事件冒泡)

<div id="parent">
    <div id="child">click son</div>     
</div>
<ul id="ul">
    <li class="theli">1</li>
    <li class="theli2">2</li>
    <li class="theli3">3</li>
    <li class="theli4">4</li>
    <li class="theli5">5</li>
</ul>
<script>
    var ul = document.getElementById('ul');
    ul.addEventListener('click',function(){
        alert(event.target.className)
    })
</script>

event

event对象常用属性和方法
  • type : 事件的类型
  • srcElement/target : 事件源,就是发生事件的元素;
  • cancelBubble : 布尔属性,设为true的时候,将停止事件进一步气泡到包容层次的元素
    (e.cancelBubble = true相当于e.stopPropagation())
  • returnValue : 布尔属性,设置为false的时候可以阻止浏览器执行默认的事件动作
    (e.returnValue = false相当于e.preventDefault())
  • event.clientY,pageY,screenY : 浏览器顶部底边到鼠标位置(不包括滚动轴的距离) 浏览器顶部底边到鼠标位置(包括滚动轴) 屏幕顶部底边到鼠标位置
var btn = document.getElementById('child');
btn.addEventListener('click',function(e){
    alert(e.type)   //click
})
var parent = document.getElementById('parent');
parent.addEventListener('click',function(event){
    console.log(event.target);  //点击谁谁就是target
    console.log(event.currentTarget);   //事件绑定在谁身上,就指向谁
})

*srcElement,cancelBubble,returnValue是IE的属性 *

事件类型

  • onclick : 点击
  • onfocus : 元素获得焦点
  • onblur : 元素失去焦点
  • onmouseover : 鼠标移到某元素纸上
  • onmouseout : 鼠标从某元素移开
  • onmousedown : 鼠标按钮被按下
  • onmousemove : 鼠标被移动
  • onmouseup : 鼠标按键被松开
UI事件
  1. load : 当页面完全加载后在window上面触发
EventUtil.addHandler(window,'load',function(e){
    alert('loaded');
});
//图片预加载
var image = new Image();
EventUtil.addHandler(image,'load',function(event){
    alert('image loaded');
})
  1. resize : 窗口大小发生变化时触发
  2. scroll : 窗口发生滚动时触发
焦点事件
  1. blur : 元素失去焦点的时候触发
  2. focus : 元素获得焦点的时候触发(不支持冒泡)
  3. focusin : 元素获得焦点的时候触发,支持事件浏览器是IE5.5...支持冒泡
  4. focusout : 元素失去焦点的时候触发,支持事件浏览器是IE5.5...支持冒泡
鼠标事件
  1. click : 点击
  2. dblclick : 双击
  3. mousedown : 鼠标按下时触发的事件
  4. mouseup : 鼠标松开时触发的事件
  5. mousemove : 鼠标移动时触发的事件
  6. mouseout : 进入目标元素触发(目标元素与其子元素都会执行)
  7. mouseover : 离开目标元素触发(目标元素与其子元素都会执行)
  8. mouseenter : 只能进入目标元素触发
  9. mouseleave : 只能离开目标元素触发
键盘事件
  1. keydown
var myText = document.getElementById('myText');
//键码,任意键触发
EventUtil.addHandler(myText,'keydown',function(event){
    console.log(event.keyCode);
})
  1. keyup
  2. keypress : 按下字符键
  3. textInput : 输入信息时触发
EventUtil.addHandler(myText,'textInput',function(event){
    console.log(event.data);
})
  1. DOMContentLoaded : 在DOM树之后触发,快于load
移动端事件类型
  1. 手指触摸屏幕时触发
EventUtil.addHandler(myBtn,'touchstart',function(event){
    console.log('当前触摸屏幕的触摸点数组' + event.touches);
    console.log('数组中只包含引起事件的触摸点信息' + event.changedTouches);
    console.log('只包含放在元素上的触摸信息' + event.targetTouches);
})
  1. 手指在屏幕上滑动时触发
EventUtil.addHandler(myBtn,'touchmove',function(event){
    console.log(123456789);
})
  1. 手指从屏幕上移开时触发
EventUtil.addHandler(myBtn,'touchend',function(event){
    console.log(123456789);
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 总结: 鼠标事件 1.click与dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r阅读 1,605评论 2 10
  • 以下文章为转载,对理解JavaScript中的事件处理机制很有帮助,浅显易懂,特分享于此。 什么是事件? 事件(E...
    jxyjxy阅读 3,035评论 1 10
  • (续jQuery基础(1)) 第5章 DOM节点的复制与替换 (1)DOM拷贝clone() 克隆节点是DOM的常...
    凛0_0阅读 1,336评论 0 8
  • 第1章 鼠标事件 1-1 jQuery鼠标事件之click与dbclick事件 用交互操作中,最简单直接的操作就是...
    mo默22阅读 1,275评论 0 6
  • 人生百态无非如是。接近放假的时候因为很闲,所以在网上找各种各样的电影来消磨时间,然后看到了李安的三部曲,我心想就看...
    麋鹿霜白阅读 6,385评论 1 1