事件

一.事件流

事件流:事件的流向,时间的执行顺序。
当子元素和父元素都定义了相同的事件,比如都定义了onclick事件,当点击子元素时,父元素的onclick事件也会被触发,js把这种事件连续发生的机制为事件冒泡事件捕获
IE:事件从里向外发生,事件从最精确对象(target)开始触发,然后到最不精确(document)的对象触发,即事件冒泡
网景:事件从外向里发生,事件从最不精确的对象(document)开始触发,然后到最精确对象(target)触发,即事件捕获
W3C将两者进行中和,在任何W3C的事件模型中,事件先进入捕获阶段,再进入冒泡阶段

二.事件模型

JavaScript中的两种事件模型:DOM0,DOM2。

DOM0级事件模型

DOM0级事件模型是早期的事件模型,所有的浏览器都支持。
注册事件:在事件类型前面加on,如:onclick、onmouseover ......
解除事件:dom.onclick = null;
每个DOM对象只能注册一个相同类型的事件,注册多个则会发生覆盖,只执行最后一个事件函数。

DOM2级事件模型

DOM2级事件模型是较新的事件模型,IE8及以下是不支持的。注册一个相同类型的事件,注册多个不会发生覆盖。
注册事件:
addEventListener(type,fn,useCapture) 事件监听器
参数:type----事件类型,例:click、mouseover...
fn----事件处理函数
useCapture----布尔值true或 false 默认
( true表示事件捕获,false表示事件冒泡 )
为了兼容浏览器,第三个参数一般设置为false
解除事件:removeEventListener(type, fnName, useCapture)
每个DOM对象可以注册多个相同类型的事件,不会发生覆盖,会依次的执行各个事件函数。

因为IE678只支持事件冒泡,不支持事件捕获,所以它也不支持addEventListener( )方法
IE提供了另一个函数attachEvent( type , fn )
参数:type----事件类型,例:onclick、onmouseover
fn----事件处理函数
没有第三个参数
解除事件:detachEvent( type , fnName )

封装事件监听/移除函数(兼容)

//添加事件监听(兼容低版本浏览器)
        function addEvent(dom,type,cb){
            if(dom.attachEvent){
                dom.attachEvent('on'+type,cb);
            }else{
                dom.addEventListener(type,cb)
            }
        }


 //移除事件监听(兼容低版本浏览器)
        function removeEvent(dom,type,cbName){
            if(dom.detachEvent){
                dom.attachEvent('on'+type,cbName);
            }else{
                dom.removeEventListener(type,cbName);
            }
        }

触发事件

1.
btn.onclick = function(){ // DOM 0
    console.log("btn被点击")
}
btn.onclick();// 触发事件

2.
btn.addEventListener("click", function(){ // DOM 2
    console.log("btn被点击2")
})
// 创建一个事件对象
var e = new Event("click");
// 触发元素的一个事件
btn.dispatchEvent(e);

三.事件对象

1.event概念及作用

事件通常与函数结合使用,函数不会在事件发生前被执行

event事件对象只在事件发生的过程中才有效

event对象中包含了所有与事件相关的信息(私有的、共有的属性和方法)

在需要获取和事件相关的信息时使用,如:

获取键盘按下的按键码

获取鼠标的位置坐标

获取事件名称

获取事件生成的时间

获取事件的类型

等等......

2.获取event对象

所有浏览器都支持event对象,只是支持的方式不一样

FireFox、Chrome等浏览器要获取到event对象,需要从函数中传入,参数名随意

而IE在浏览器中event作为window对象的一个属性存在,可以直接使用 event 或 window.event 获取到

例如:

document.onmousedown=function ( e ){

    var ev = e || window.event ; //兼容各个浏览器

    console.log(ev);

};

注意 var ev = e || event ; 顺序!

3.鼠标/键盘相关属性

clientX/clientY属性: 返回当事件被触发时,鼠标指针的坐标(到浏览器窗口的坐标)
offsetX/offsetY属性: 返回当事件被触发时,鼠标指针的坐标(在事件源元素中的坐标)
pageX/pageY属性: 返回当事件被触发时,鼠标指针的坐标(整个页面中的坐标)
button属性: 返回触发事件的鼠标按键
which属性: 返回触发事件的按键码(针对键盘和鼠标事件) 火狐
keyCode属性: 返回键盘按键的按键码 IE

组合键:ctrlKey、altKey、shiftKey、metaKey

image.jpeg
image.png
image.png

4.其他属性/方法

在火狐中获得触发事件的元素
使用:event.target

在IE中获得触发事件的元素
使用:event.srcElement

// 兼容写法

var Target = event.target || event.srcElement;

event.relatedTarget 火狐获取触发事件的目标源,与target相反

event.fromElement IE获取触发事件的目标源,与srcElement相反

在mouseover事件中,它指向鼠标来自哪个元素(mouseenter)

var from=event.relatedTarget || event.fromElement;

event.relatedTarget 火狐获取触发事件的目标源,与target相反

event.toElement IE获取触发事件的目标源,与srcElement相反

在mouseout事件中,它指向鼠标去往的那个元素(mouseleave)

var to=event.relatedTarget||event.toElement;

阻止默认行为

event.preventDefault()  //火狐
event.returnValue = false  //IE
event.preventDefault ? event.preventDefault() : (event.returnValue = false);
return false;

阻止事件传播

event.stopPropagation()  //火狐
event.cancelBubble = true  //IE
event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);

四.事件委托

什么是事件:通俗讲onclick,onmouseover,onmouseout等就是事件。
什么是委托:就是这个事件本来是加在某些元素上的,而你却加到其他元素上来完成这个事件。

原理:利用事件传播的特征。
具体来说,事件委托就是事件目标自身不处理事件,而是把处理事件委托给其父元素,甚至是document 来完成。

优点:

  1. 提高性能和效率
  2. 减少事件注册,节省内存占用
  3. 未来元素无需再次注册事件
    ......

五.鼠标滚轮事件

在非火狐浏览器中
鼠标滚轮事件:onmousewheel
示例:
box.onmousewheel=function (ev){
var event=ev||window.event;
alert(event.wheelDelta);// 前推:120 后拉:-120
};

在火狐浏览器中
鼠标滚轮事件:DOMMouseScroll
示例:
box.addEventListener('DOMMouseScroll',function (ev){
alert(ev.detail);// 前推:-3 后拉:3
},false)

六.scroll 滚动条

scrollLeft:设置或获取当前左滚的距离,即左卷的距离;
scrollTop:设置或获取当前上滚的距离,即上卷的距离;
scrollHeight:获取对象可滚动的总高度;
scrollWidth:获取对象可滚动的总宽度;

获取页面的滚动条:
var pageScroll = document.body.scrollTop; //谷歌
var pageScroll = document.documentElement.scrollTop; //火狐 IE

onscroll 事件,元素滚动条在滚动时触发。

案例:
... ...

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