事件

1. 事件

IE的事件流是事件冒泡流
Netscape是的事件流是事件捕获流

DOM事件流 :规定事件包括三个阶段:

  1. 事件捕获阶段
  2. 处于目标阶段
  3. 事件冒泡阶段
事件流程.jpg

document > html > body > div (点击div元素事件)
在DOM事件流中,实际的目标元素(<div>元素)在捕获阶段不会接收到事件。这就意味着在捕获阶段,事件从document到<html>到<body>后就停止了。下一个阶段是“处于目标”阶段,于是事件在<div>元素上发生,并在事件处理中被看成是冒泡阶段的一部分。然后,冒泡阶段发生,事件又传播回文档。

2. 事件处理程序:响应事件的程序。

2.1 HTML事件处理程序:会创建一个封装着元素属性值的函数。

  • 函数中有一个局部变量event,也就是事件对象
  • 在函数内部,this值等于事件的目标元素。
    <input type="button" name="btn" value="Click Me" onclick="showMessage(event)" />

2.2 DOM0级事件处理程序:通过Javascript指定事件处理程序的传统方式,就是将一个函数赋值给事件处理程序。

  • 每个元素(包括windowdocument)都有自己的事件处理程序,如 onclickonready,属性的值设置为一个函数,就可以指定事件处理程序。
  • 使用DOM0级方法指定的事件处理程序被认为是元素的方法,因此事件处理程序是在元素的作用中运行,所以 this引用当前元素。
  • 事件对象: event
  • 删除事件处理程序:null
var btn = document.getElementById('myBtn');
btn.onclick = function(){
  alert();
}

btn.onclick = null;//删除事件处理程序

2.3 DOM2级事件处理程序:指定和删除事件处理程序

  • 接首3个参数:处理的事件名处理函数是否冒泡
    node.addEventListener(eventName, fn, boolean);
    node.removeEventListener(eventName, fn, boolean);
    boolean:
  • true 捕获阶段调用事件处理程序
  • false 冒泡阶段调用事件处理程序
  • 通过addEventListener()添加的事件处理程序只能用removeEventListener()移除,移除时传入的参数使用相同。意味着通过addEventListener()添加的匿名函数将无法移除
  • 可以添加多个事件处理程序,按照添加的顺序触发,同一个事件名也可以添加多次,按照添加的顺序执行。
  • 一般情况下都是将事件事件处理程序添加到冒泡阶段false,可以最大限度的兼容各种浏览器。
    <button type="button" id="btn">Click Me</button>
    <script type="text/javascript">
        "use strict"
        var btn = document.getElementById('btn');
        //事件不能取消,事件处理程序为匿名函数
        btn.addEventListener('click', function(event){
            console.log(this, event);//先执行1
        }, false);
        btn.addEventListener('click', function(event){
            console.log(this, event);//后执行2
        }, false);
    </script>

2.4 IE事件处理程序

  • 接受两个相同的参数: 事件名处理函数
    attachEvent(eventName, fn);
    detachEvent(eventName, fn);
  • IE8及更早版本只支持事件冒泡,所以事件处理程序都会被添加到冒泡阶段
  • 事件名是以on开头(与DOM级事件处理程序事件名一样,如onclick)。
  • IE事件处理程序会在全局作用域中执行,this指向window
  • 添加多个事件处理程序,以相反的顺序触发。
<button type="button" id="btn">Click Me</button>
<script type="text/javascript">
  "use strict"
  var btn = document.getElementById('btn');
  var handler = function(){
    alert(this);//IE事件作用域全局,this === window
  }
  btn.attachEvent('onclick', handler);//事件处理程序使用匿名函数将不能删除事件
  btn.attachEvent('onclick', handler);
  btn.detachEvent('onclick', handler);//删除事件处理程序,参数必须完全相同
</script>

view
2.window对象
1.window对象

2.5 跨浏览器事件处理程序

    <script type="text/javascript">
        var EventUtil = {
            addHandler: function(elem, type, handler){
                if (elem.addEventListener) { //DOM2级
                    elem.addEventListener(type, handler, false);
                }else if(elem.attachEvent) { //IE事件处理程序
                    elem.attachEvent("on" + type, handler); //兼容IE8及以下,加上on前缀
                }else{ //DOM0级
                    elem["on" + type] = handler;
                }
            },
            removeHandler: function(elem, type, handler){
                if (elem.removeEventListener) { //DOM2级
                    elem.removeEventListener(type, handler, false);
                }else if(elem.detachEvent) { //IE事件处理程序
                    elem.detachEvent("on" + type, handler); //兼容IE8及以下,加上on前缀
                }else{ //DOM0级
                    elem["on" + type] = null;
                }               
            }
        }
    </script>

3. 事件对象

所有浏览器都支持event对象。

** 3.1 DOM级事件对象**

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

推荐阅读更多精彩内容

  • JavaScript 程序采用了异步事件驱动编程模型。在这种程序设计风格下,当文档、浏览器、元素或与之相关的对象发...
    劼哥stone阅读 1,250评论 3 11
  • 以下文章为转载,对理解JavaScript中的事件处理机制很有帮助,浅显易懂,特分享于此。 什么是事件? 事件(E...
    jxyjxy阅读 3,023评论 1 10
  • 一、问答 1. dom对象的innerText和innerHTML有什么区别? innerHTML: 也就是从对象...
    饥人谷_罗伟恩阅读 586评论 0 2
  • 本章内容 理解事件流 使用事件处理程序 不同的事件类型 JavaScript 与 HTML 之间的交互是通过事件实...
    闷油瓶小张阅读 277评论 0 0
  • 2016年4月8日早上8点左右,年轻人下班回家的路上,说是近期工作到月底应该有个项目,需要紧张三个周,工作小...
    田园牧歌123阅读 125评论 0 0