[js]事件模型及事件代理/委托

原文链接:http://www.cnblogs.com/xxcanghai/p/5205998.html

1、事件的三个阶段:事件捕获、目标、事件冒泡 (低版本的IE不支持捕获)

2、传统、IE和W3C不同绑定事件、解绑事件的方法有什么区别,参数分别是什么,以及事件对象e有什么区别

传统方法:

element.onclick = function(e){
        // ...
    };
  1. 传统绑定的优点

    • 非常简单和稳定,可以确保它在你使用的不同浏览器中运作一致
    • 处理事件时,this关键字引用的是当前元素,这很有帮组
  2. 传统绑定的缺点 
    • 传统方法只会在事件冒泡中运行,而非捕获和冒泡
    • 一个元素一次只能绑定一个事件处理函数。新绑定的事件处理函数会覆盖旧的事件处理函数
    • 事件对象参数(e)仅非IE浏览器及ie9以上(包括ie9)可用

IE方式:

element.attachEvent(‘onclick‘, function(){
        // ...
    });
  1. IE方式的优点

    • 可以为同一个元素绑定你所希望的多个事件,同时并不会覆盖先前绑定的事件。
  2. IE方式的缺点
    • IE仅支持事件捕获的冒泡阶段
    • 事件监听函数内的this关键字指向了window对象,而不是当前元素(IE的一个巨大缺点)
    • 事件对象仅存在与window.event参数中
    • 事件必须以ontype的形式命名,比如,onclick而非click
    • 仅IE可用。你必须在非IE浏览器中使用W3C的addEventListene

W3C方式

    element.addEventListener(‘click‘, function(e){
        // ...
    }, false);
  1. W3C绑定的优点

    • 该方法同时支持事件处理的捕获和冒泡阶段。事件阶段取决于addEventListener最后的参数设置:false (冒泡) 或 true (捕获)。
    • 在事件处理函数内部,this关键字引用当前元素。
    • 事件对象总是可以通过处理函数的第一个参数(e)捕获。
    • 可以为同一个元素绑定你所希望的多个事件,同时并不会覆盖先前绑定的事件
  2. W3C绑定的缺点
    • IE不支持,你必须使用IE的attachEvent函数替代。

适应各种浏览器

  var event = {
        addHander:function(element,type,fun){
            if(element.addEventListener){//dom2 非ie模式
                 element.addEventListener(type,fun,false);
            }else if(element.attachEvent){
                 element.attachEvent("on"+type,fun);//dom2 ie模式
            }else{
                 element["on"+type] = fun;//dom0 传统模式 支持ie8以上及非ie
            }
        },
        removerHander:function(element,type,fun){
            if(element.removeEventListener){
                 element.removeEventListener(type,fun,false);
            }else if(element.detachEvent){
                 element.detachEvent("on"+type,fun);
            }else{
                 element["on"+type] = null;
            }
        },
        getEvent:function(event){//event对象 非ie || ie
            return event ? event : window.event;
        },
        getTarget:function(event){//获取当前目标元素 非ie || ie
            return event.getTarget || event.srcElement;
        },
        preventDefalut:function(event){//阻止默认事件
            if(event.preventDefalut){
                event.preventDefalut();
            }else{
                event.returnValue = false;
            }
        },
        stopPropagation:function(event){//阻止捕获或冒泡
            if(event.stopPropagation){
                event.stopPropagation();
            }else{
                event.cancelBubble = true;
            }
        }
    }

3、事件的代理/委托的原理以及优缺点,这是靠事件的冒泡机制来实现的

  (1)、可以大量节省内存占用,减少事件注册,比如在table上代理所有td的click事件就非常棒

  (2)、可以实现当新增子对象时无需再次对其绑定事件,对于动态内容部分尤为合适

那么极有可能要求让你【实现事件模型】,即写一个类或是一个模块,有两个函数,

一个bind一个trigger,分别实现绑定事件和触发事件,

核心需求就是可以对某一个事件名称绑定多个事件响应函数,

然后触发这个事件名称时,依次按绑定顺序触发相应的响应函数。

时间: 2024-11-03 21:45:34

[js]事件模型及事件代理/委托的相关文章

JavaScript事件模型及事件代理

事件模型 JavaScript事件使得网页具备互动和交互性,我们应该对其深入了解以便开发工作,在各式各样的浏览器中,JavaScript事件模型主要分为3种:原始事件模型.DOM2事件模型.IE事件模型. 1.原始事件模型(DOM0级) 这是一种被所有浏览器都支持的事件模型,对于原始事件而言,没有事件流,事件一旦发生将马上进行处理,有两种方式可以实现原始事件: (1)在html代码中直接指定属性值:<button id="demo" type="button"

整理之DOM事件阶段、冒泡与捕获、事件委托、ie事件和dom模型事件、鼠标事件

整理之DOM事件阶段 本文主要解决的问题: 事件流 DOM事件流的三个阶段 先理解流的概念 在现今的JavaScript中随处可见.比如说React中的单向数据流,Node中的流,又或是今天本文所讲的DOM事件流.都是流的一种生动体现.用术语说流是对输入输出设备的抽象.以程序的角度说,流是具有方向的数据. 事件流分事件冒泡与事件捕获 在浏览器发展的过程中,开发团队遇到了一个问题.那就是页面中的哪一部分拥有特定的事件? 可以想象画在一张纸上的一组同心圆,如果你把手指放在圆心上,那么你的手指指向的其

JS事件模型小结

08年年初的一篇blog,转到这个博客上,想想当年跨浏览器真是一座山: 前几天看dojo的文档,其中多次提到DOM2事件模型,以前学习这部分的内容,主要愤慨于IE的不兼容性了,现在对于DOM2事件模型的概念又有些模糊,所以翻出了js权威指南(V4)又复习了一下,简单作一小结.       JS权威指南中将JS事件模型分为四种            1.原始事件模型:属性事件处理模式            2.标准事件模型:DOM2对其作了标准化            3.IE事件模型(IE5.5

javascript的事件冒泡,阻止事件冒泡和事件委托, 事件委托是事件冒泡的一个应用。

首先,弄明白js 当中,什么是事件,事件模型在js中是如何设计的.什么是事件冒泡? 什么是“事件冒泡”呢?假设这里有一杯水,水被用某种神奇的方式分成不同颜色的几层.这时,从最底层冒出了一个气泡,气泡会一层一层地上升,直到最顶层.而你不管在水的哪一层观察都可以看到并捕捉到这个气泡.好了,把“水”改成“DOM”,把“气泡”改成“事件”.这就是“事件冒泡” 什么是事件委托呢?event delegation : 地址:http://davidwalsh.name/event-delegate One

【repost】JavaScript 事件模型 事件处理机制

什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击.鼠标经过某个特定元素或按下键盘上的某些按键.事件还可能是 Web 浏览器中发生的事情,比如说某个 Web 页面加载完成,或者是用户滚动窗口或改变窗口大小. 通过使用 JavaScript ,你可以监听特定事件的发生,并规定让某些事件发生以对这些事件做出响应. 今天的事件 在漫长的演变史,我们已经告

Android 事件模型

本文内容 基于监听的事件模型 基于回调的事件模型 Android 支持两种事件模型,基于监听的事件模型和基于回调的事件模型. 基于监听的事件模型 基于监听的事件模型是一种委托式的,更"面向对象"的事件处理,这跟 Java(或 C#)是一样的. 事件监听处理模型有三个对象: 事件源(Event Source),也就是 GUI 组件. 事件(Event),也就是 Event 对象,GUI 组件上所发生事件的相关信息. 事件监听器(Event Listener),负责监听事件源所发生的事件,

15.1-全栈Java笔记:Java事件模型是什么?事件控制的过程有哪几步??

应用前边两节上一章节的内容,大家可以完成一个简单的界面,但是没有任何的功能,界面完全是静态的,如果要实现具体功能的话,必须要学习事件模型. 事件模型简介及常见事件模型 对于采用了图形用户界面的程序来说,事件控制是非常重要的. 一个源(事件源)产生一个事件并把它(事件对象)送到一个或多个监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接收,监听器将处理这些事件. 一个事件源必须注册监听器以便监听器可以接收关于一个特定事件的通知. 每种类型的事件都有其自己的注册方法,一般形式为: v

201510091346_《JavaScript的事件模型——createEvent、initEvent、dispatchEvent》

1. 存在三种事件模型:原始事件模型(所有浏览器都支持).dom2(除ie外的浏览器都支持)事件模型.IE事件模型.Netscape事件模型. ----------------------------------------------------------------------------------------------------------------------------------------------- 2.详细模型 (1)原始事件模型 分为:语义事件onclick和输入

W3C DOM 事件模型(简述)

1.事件模型 由于事件捕获与冒泡模型都有其长处和解释,DOM标准支持捕获型与冒泡型,能够说是它们两者的结合体.它能够在一个DOM元素上绑定多个事件处理器,而且在处理函数内部,thiskeyword仍然指向被绑定的DOM元素,另外处理函数參数列表的第一个位置传递事件event对象.首先是捕获式传递事件,接着是冒泡式传递,所以,假设一个处理函数既注冊了捕获型事件的监听,又注冊冒泡型事件监听,那么在DOM事件模型中它就会被调用两次. [ oschina] 2.事件传播 A)冒泡模式(Bubble)IE