attachEvent和addEventListener

attachEvent和addEventListener在前端开发过程中经常性的使用,他们都可以用来绑定脚本事件,取代在html中写obj.onclick=method

相同点:

  它们都是DOM对象的方法,可以实现一种事件绑定多个事件处理函数。

obj = document.getElementById("testdiv");
obj.onclick=function(){alert(‘1‘);};
obj.onclick=function(){alert(‘2‘);};
obj.onclick=function(){alert(‘3‘);};
// 当使用上边三句话进行事件绑定的时候,很明显当点击ID为testdiv对象时,只能执行//最后一句脚本。因为onclick作为一个事件处理对象,只能赋一个值,后面的赋值自动覆//盖前面的

使用attachEvent和addEventListener时则可以实现多个事件处理函数的调用

obj = document.getElementById("testdiv");
obj.attachEvent(‘onclick‘,function(){{alert(‘1‘);});
obj.attachEvent(‘onclick‘,function(){{alert(‘2‘);});
obj.attachEvent(‘onclick‘,function(){{alert(‘3‘);});//点击时,三个方法都会执行
obj = document.getElementById("testdiv");
obj.addEventListener(‘click‘,function(){{alert(‘1‘);},false);
obj.addEventListener(‘click‘,function(){{alert(2‘);},false);
obj.addEventListener(‘click‘,function(){{alert(‘3‘);},false);//点击时,三个方法都会执行

不同点:

  1.attachEvent是IE9之前特有的方法,它不遵循W3C标准,而其他的主流浏览器如FF等遵循W3C标准的浏览器都使用addEventListener,所以实际开发中需分开处理。

  2.多次绑定后执行的顺序是不一样的,attachEvent在ie9之前的版本是后绑定先执行,ie9以及以后的版本是先绑定先执行,且两者都支持,addEventListener是先绑定先执行

obj = document.getElementById("testdiv");
obj.attachEvent(‘onclick‘,function(){{alert(‘1‘);});
obj.attachEvent(‘onclick‘,function(){{alert(‘2‘);});
obj.attachEvent(‘onclick‘,function(){{alert(‘3‘);});
//执行顺序是alert(3),alert(2),alert(1);
obj = document.getElementById("testdiv");
obj.addEventListener(‘click‘,function(){{alert(‘1‘);},false);
obj.addEventListener(‘click‘,function(){{alert(‘2‘);},false);
obj.addEventListener(‘click‘,function(){{alert(‘3‘);},false);
//点击obj对象时,执行顺序为alert(‘1‘),alert(‘2‘),alert(‘3‘);

  3.绑定时间时,attachEvent必须带on,如onclick,onmouseover等,而addEventListener不能带on,如click,mouseover。这个区别在以上代码中可见。

  4.attachEvent仅需要传递两个参数,而addEventListener需要传递三个参数,这里牵扯到“事件流”的概念。侦听器在侦听时有三个阶段:捕获阶段、目标阶段和冒泡阶段。顺序为:捕获阶段(根节点到子节点检查是否调用了监听函数)→目 标阶段(目标本身)→冒泡阶段(目标本身到根节点)。此处的参数确定侦听器是运行于捕获阶段、目标阶段还是冒泡阶段。 如果将 useCapture 设置为 true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。 如果useCapture 为 false,则侦听器只在目标或冒泡阶段处理事件。 要在所有三个阶段都侦听事件,请调用两次 addEventListener,一次将 useCapture 设置为 true,第二次再将useCapture 设置为 false。

为了解决浏览器的兼容性可以封装成addEvent方法:

function addEvent(elm, evType, fn, useCapture)
{
    if (elm.addEventListener)
    {
        // W3C标准
        elm.addEventListener(evType, fn, useCapture);
        return true;
    }
    else if (elm.attachEvent)
    {
        //IE
        var r = elm.attachEvent(‘on‘ + evType, fn);//IE5+
        return r;
    }
    else
    {
        elm[‘on‘ + evType] = fn;//DOM事件
    }
}

        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;
        };

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);
                        });
                    }
                };
            }
        })();

以上内容是在学习了该博文后经过修改转载的https://www.cnblogs.com/dacuotecuo/p/3510823.html

版权说明:本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面中给出原文连接。

原文地址:https://www.cnblogs.com/goforwards/p/8455729.html

时间: 2024-07-30 19:41:51

attachEvent和addEventListener的相关文章

attachEvent与addEventlistener兼容性

关于原生事件绑定中attachEvent与addEventlistener中兼容性以及attachEvent函数中this指代window有关问题 By odacash   at 2014-07-01   29 阅读   0 回复   0.0 希赛币 请点击下面回答中的"采纳为答案"按钮,选择贡献(希赛币)比率后,点击"确认结算"按钮.       合计0人 0%   关于原生事件绑定中attachEvent与addEventlistener中兼容性以及attach

attachEvent与addEventListener的区别 真实例子

近日遇到attachEvent与addEventListener两个事件,哟,果断研究一下~~ 先普及一下基本知识: attachEvent与addEventListener的作用:为某一事件附加其它的处理事件. 网上普遍都是说attachEvent用于非Mozilla系列,addEventListener用于Mozilla系列. (Mozilla系列在浏览器而言,即指火狐浏览器,本人认为也可以指支持w3c标准的系列浏览器) 理论上是这么说,还是得自己动手试一试! 结合查阅资料写了以下代码进行测

attachEvent 和 addEventListener 的用法

http://www.oschina.net/question/54100_25614 addEventListener中的第三个参数是useCapture, 一个bool类型.当为false时为冒泡获取(由里向外),true为capture方式(由外向里). 点击这里 attachEvent 和 addEventListener 的用法

JS事件监听 JS:attachEvent和addEventListener 使用方法

attachEvent与addEventListener区别 适应的浏览器版本不同,同时在使用的过程中要注意attachEvent方法          按钮onclickaddEventListener方法    按钮click 两者使用的原理:可对执行的优先级不一样的事件进行操作:attachEvent方法,为某一事件附加其它的处理事件.(不支持Mozilla系列) addEventListener方法 用于 Mozilla系列 举例: Js代码 document.getElementByI

js原生attachEvent与addEventListener的用法

现在jquery比较流行,所以我们用得比较多的是jquery,很少用原生的js. 不过还是要了解一下滴. 代码如下: <a id="btnClick" href="javascript:void(0);">点击我</a> 如果我们要给该按钮的点击按钮绑定三个函数,对js了解比较少的人容易写成这样: <script type="text/javascript"> var ele=document.getEleme

attachEvent和addEventListener区别

  一般来说,可以直接封装成这种形式: var addEvent = function(element,type,handler){ if(element.addEventListener){ //DOM2级 element.addEventListener(type,handler,false); //false为冒泡,true为捕获 }else if(element.attachEvent){ //IE element.attachEvent("on"+type,function(

js 添加事件 attachEvent 和 addEventListener 的用法

一般我们在JS中添加事件,是这样子的 obj.onclick=method 这种绑定事件的方式,兼容主流浏览器,但如果一个元素上添加多次同一事件呢? obj.onclick=method1; obj.onclick=method2; obj.onclick=method3; 如果这样写,那么只有最后绑定的事件,这里是method3会被执行,这个时候我们就不能用onclick这样的写法了,主角改登场了,在IE中我们可以使用attachEvent方法 //object.attachEvent(eve

Javascript关于attachEvent和addEventListener区别与兼容写法

Mozilla中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target: 文档节点.document.window 或 XMLHttpRequest. type: 字符串,事件名称,不含“on”,比如“click”.“mouseover”.“keydown”等. listener :实现了 EventListener 接口或者是 JavaScript 中的函数. useCapture

attachEvent与addEventListener

看高拍仪案例的时候看到的这两个,这两个方法的作用一样都是为一个事件添加事件句柄. 语法:element.attachEvent("on" + event, function);IE7,IE8可以兼容 element.addEventListener(event, function, useCapture):除了IE7,IE8基本上都可以兼容