`
jamm19860411
  • 浏览: 86529 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多
如果不使用类库或者没有自己的类库,储备一些常用函数总是有好处的。

(10)addEvent

网上最流行的版本是Scott Andrew的,据说javascript界曾举行一场比赛(此事件我们可以在Pro Javascript Techniques第100页看到)或浏览PPK的网站,征求添加事件与移除事件的函数,他就是其获奖者。下面就是他的实现:
function addEvent(elm, evType, fn, useCapture) {
  if (elm.addEventListener) {
    elm.addEventListener(evType, fn, useCapture);//DOM2.0
    return true;
  }
  else if (elm.attachEvent) {
    var r = elm.attachEvent('on' + evType, fn);//IE5+
    return r;
  }
  else {
    elm['on' + evType] = fn;//DOM 0
  }
}


下面是Dean Edwards 的版本
// addEvent/removeEvent written by Dean Edwards, 2005
// with input from Tino Zijdel
// http://dean.edwards.name/weblog/2005/10/add-event/
function addEvent(element, type, handler) {
    //为每一个事件处理函数分派一个唯一的ID
    if (!handler.$$guid) handler.$$guid = addEvent.guid++;
    //为元素的事件类型创建一个哈希表
    if (!element.events) element.events = {};
    //为每一个"元素/事件"对创建一个事件处理程序的哈希表
    var handlers = element.events[type];
    if (!handlers) {
        handlers = element.events[type] = {};
        //存储存在的事件处理函数(如果有)
        if (element["on" + type]) {
            handlers[0] = element["on" + type];
        }
    }
    //将事件处理函数存入哈希表
    handlers[handler.$$guid] = handler;
    //指派一个全局的事件处理函数来做所有的工作
    element["on" + type] = handleEvent;
};
//用来创建唯一的ID的计数器
addEvent.guid = 1;
function removeEvent(element, type, handler) {
    //从哈希表中删除事件处理函数
    if (element.events && element.events[type]) {
        delete element.events[type][handler.$$guid];
    }
};
function handleEvent(event) {
    var returnValue = true;
    //抓获事件对象(IE使用全局事件对象)
    event = event || fixEvent(window.event);
    //取得事件处理函数的哈希表的引用
    var handlers = this.events[event.type];
    //执行每一个处理函数
    for (var i in handlers) {
        this.$$handleEvent = handlers[i];
        if (this.$$handleEvent(event) === false) {
            returnValue = false;
        }
    }
    return returnValue;
};
//为IE的事件对象添加一些“缺失的”函数
function fixEvent(event) {
    //添加标准的W3C方法
    event.preventDefault = fixEvent.preventDefault;
    event.stopPropagation = fixEvent.stopPropagation;
    return event;
};
fixEvent.preventDefault = function() {
    this.returnValue = false;
};
fixEvent.stopPropagation = function() {
    this.cancelBubble = true;
};


功能非常强悍,解决IE的this指向问题,event总是作为第一个参数传入,跨浏览器就更不在话下。

另,我还珍藏了一个HTML5工作组的版本:
var addEvent=(function(){
    if(document.addEventListener){
        return function(el,type,fn){
            if(el.length){
                for(var i=0;i<el.length;i++){
                    addEvent(el[i],type,fn);
                }
            }else{
                el.addEventListener(type,fn,false);
            }
        };
    }else{
        return function(el,type,fn){
            if(el.length){
                for(var i=0;i<el.length;i++){
                    addEvent(el[i],type,fn);
                }
            }else{
                el.attachEvent('on'+type,function(){
                    return fn.call(el,window.event);
                });
            }
        };
    }
})();


原文:http://www.cnblogs.com/rubylouvre/archive/2009/09/02/1558998.html
分享到:
评论

相关推荐

    事件史和生存分析 第2版

    阐述了很多种生存分析的方法,并结合生物化学家教授升迁、累犯再次被捕两个例子的数据,循序渐进地介绍了离散时间方法、Cox回归模型等事件史和生存分析必不可少的研究手段,以及如何去研究包含多重事件的竞争性事件...

    径向流对两个粒子相关性的影响,在sNN = 5.02 TeV的pâPb碰撞中,在中间p T具有已确定的触发条件

    与介子触发器相关的产量表现出可忽略的多重依赖性,而质子触发的产量表现出从低多重事件到高多重事件的逐渐抑制。 在像pâPb这样的小型碰撞系统中,射流的变化预计将不那么主要,观察到的抑制作用可能与产生向外径...

    VB 对象的用户事件

    3. **多重事件处理**:一个对象可以有多个事件,并且一个事件可以有多个处理程序。VB支持通过Handles关键字将多个事件连接到同一个处理程序,或者将一个处理程序分配给多个事件。 4. **自定义事件**:除了内置的...

    VB\浅析ADO 事件模型

    #### 多重事件处理 在某些编程环境下,来自多个ADO对象的事件可以统一由一个事件处理程序处理,这提高了代码的效率和可维护性。同时,单个事件也可以被多个处理器处理,尽管这种情况较为少见。 #### 结语 综上所...

    Translate.js

    bpmn的中文包 'Activate the global connect tool': '激活全局连接工具', ... 'Sequential Multi Instance': '时序多重事件', 'DataObjectReference': '数据对象参考', 'DataStoreReference': '数据存储参考',

    EPC流程图简介(1).doc

    多重事件触发可以是同时发生或非同时发生,处理方式根据具体逻辑有所不同。依赖关系描述的是流程进行前必须满足的条件,通常通过功能来检查这些条件。 总的来说,EPC流程图是一种强大的工具,用于清晰地描绘复杂的...

    EPC流程图简介.doc

    多重事件触发要考虑事件的并发性和处理方式,使用AND、OR、XOR规则来适应不同场景。此外,依赖关系表示流程的前置条件,应避免将依赖误设为事件,可通过功能检查依赖状态。 EPC建模适用于描述复杂流程,但在设计时...

    概率论与数理统计习题1答案1

    4. 多重事件发生的概率: - **独立事件** 的概率乘法规则:若事件A和事件B相互独立,则P(A ∩ B) = P(A) * P(B)。 - **至少一次发生** 的概率可以用1减去所有事件都不发生的概率来计算。 - **恰好发生k次** 的...

    2021届高考数学一轮复习第一部分考点通关练第八章概率与统计考点测试63二项分布及其应用含解析新人教B版

    7. 多重事件概率:第7题中,甲不跑第一棒的情况下,乙不跑第二棒的概率,需要考虑所有可能的情况并计算组合概率。 8. 连续成功事件的概率:第8题中,选手回答问题晋级的情况属于连续成功事件,可以通过乘法原则和...

    Chapter 10 Building Custom Controls

    3. **多重事件处理**:某些方法可能触发多个事件,如`OnLostFocus`方法触发`Validating`、`Validated`和`LostFocus`事件。 #### 五、从现有.NET控件派生 1. **DateBox示例**:通过扩展`TextBox`类创建了一个日期...

    delphi开发答疑11-15

    2. **事件驱动编程**:12号问题可能围绕着Delphi中的事件驱动模型,如何在事件发生时调用特定的事件处理函数,如OnClick事件,以及如何处理多重事件和事件的触发顺序。 3. **数据库连接与查询**:Delphi提供了丰富...

    VB多重连接Winsock

    【VB多重连接Winsock】是一种在Visual Basic (VB)编程环境中实现网络通信技术的方法,它允许应用程序同时处理多个客户端的连接请求。在传统的单个Winsock控件中,一次只能处理一个连接,但通过创建和管理多个Winsock...

    S7300多重背景数据应用

    例如,OB1是默认的主循环,而其他OBs可以用于周期性的任务、中断事件或启动/停止操作。 2. **数据管理**:每个OB都有自己的背景数据块(DB),存储与其关联的变量和参数。这意味着,即使在多个任务中使用相同的变量名...

    systemC ref manual

    - **多重事件通知**:解释了如何处理多个事件同时触发的情况,并提供了一些建议来避免潜在的问题。 - **取消事件通知**:介绍了如何取消已经注册的事件通知,这对于灵活地控制模拟过程非常有用。 #### 5. sc_main()...

    GridView多重表头设计

    可以使用DataBound事件来动态调整表头结构,根据数据源中的层级关系创建相应的表头。 5. **控件属性配置**: 一些特定的GridView属性,如`GridLines`、`AllowPaging`、`AllowSorting`,可以根据需求进行调整,以...

    自定义事件有多重表现形式,

    自定义事件有多重表现形式, 不用为每种表现形式创建一个自定义事件,或者使用不同的事件句柄, 事件就用一个自定义事件类处理就可以了,也就使用一个事件句柄就可以了, 关于事件有多重表现形式,可以通过成员...

    碰撞中的Pion谱与事件多重性的函数

    我们使用Tsallis分布研究p + p碰撞中带电的离子横向动量(pT)光谱与碰撞能量s和事件多重性的关系。 这项研究提供了p + p碰撞中介子产生过程的见解。 该研究涵盖了在SPS能量(6.27–17.27 GeV),RHIC能量(62.4 GeV...

    使用多重检测器识别类喷射事件

    我们提出了一种方法,用于研究在向前快速使用多重检测器检测高能强子碰撞中的射流的方法。 这项研究扩大了LHC中向前速度的多重检测器的物理范围。 在大型强子对撞机能量下,射流可能会以向前的速度产生明显的横截面...

    数学建模多重序列比较模型

    HMMs能够捕获序列的统计特性,如隐藏状态(对应于不同的进化事件)和观察状态(对应于实际的氨基酸或核苷酸)。Viterbi算法用于找出最有可能生成给定观测序列的状态路径,而Forward-Backward算法则用于计算每个位置...

    揭秘FPGA多重配置硬件电路设计方案.docx

    3. **软件设计**:在软件层面,需要编写相应的控制程序来触发FPGA的多重启动事件,实现从SPI FLASH中读取并加载新的配置比特流。这通常需要配合FPGA的配置接口和特定的配置协议。 4. **操作控制**:在硬件上电前,...

Global site tag (gtag.js) - Google Analytics