javascript 事件处理示例分享


Posted in Javascript onDecember 31, 2014

废话少说,直接奉上示例代码:

<script type="text/javascript">

    function EventUtil() {

        var _self = this;

        ///添加事件

        var addEvent = (function () {

            if (document.addEventListener) {

                return function (el, type, fn) {

                    el.addEventListener(type, fn, false);

                }

            } else {

                return function (el, type, fn) {

                    el.attachEvent("on" + type, function () {

                        return fn.call(el, window.event);

                    });

                }

            }

        })();

        ///添加属性改变事件

        var addPropertyChangeEvent = function (obj, fn) {

            if (window.ActiveXObject) {

                obj.onpropertychange = fn;

            } else {

                obj.addEventListener("input", fn, false);

            }

        }

        //移除事件

        var removeEvent = function (obj, type, fn) {

            if (obj.removeEventListener) {

                obj.removeEventListener(type, fn, false);

            } else if (obj.detachEvent) {

                obj.detachEvent("on" + type, obj["on" + type + fn]);

                obj["on" + type + fn] = null;

            }

        }

        //加载事件

        var loadEvent = function (fn) {

            var oldonload = window.onload;

            if (typeof oldonload != "function") {

                window.onload = fn;

            } else {

                window.onload = function () {

                    oldonload();

                    fn();

                }

            }

        }

        //阻止事件

        var stopEvent = function (e) {

            e = e || window.event;

            if (e.preventDefault) {

                e.preventDefault();

                e.stopPropagation();

            } else {

                e.returnValue = false;

                e.cancelBubble = true;

            }

        }

        //如果仅仅是阻止事件冒泡

        var stopPropagation = function (e) {

            e = e || window.event;

            if (!+"\v1") {

                e.cancelBubble = true;

            } else {

                e.stopPropagation();

            }

        }

        //取得事件源对象

        var getEvent1 = function (e) {

            e = e || window.event;

            var obj = e.srcElement ? e.srcElement : e.target;

            return obj;

        }

        //取得事件源对象

        var getEvent2 = function (e) {

            if (window.event) return window.event;

            var c = getEvent2.caller;

            while (c.caller) {

                c = c.caller;

            }

            return c.arguments[0];

        }

        //或者这个功能更强大

        var getEvent3 = function (e) {

            var e = e || window.event;

            if (!e) {

                var c = this.getEvent3.caller;

                while (c) {

                    e = c.arguments[0];

                    if (e && (Event == e.constructor || MouseEvent == e.constructor)) {

                        break;

                    }

                    c = c.caller;

                }

            }

            var target = e.srcElement ? e.srcElement : e.target,

                    currentN = target.nodeName.toLowerCase(),

                    parentN = target.parentNode.nodeName.toLowerCase(),

                    grandN = target.parentNode.parentNode.nodeName.toLowerCase();

            return [e, target, currentN, parentN, grandN];

        }
        _self.addEvent = addEvent;

        _self.addPropertyChangeEvent = addPropertyChangeEvent;

        _self.removeEvent = removeEvent;

        _self.loadEvent = loadEvent;

        _self.stopEvent = stopEvent;

        _self.stopPropagation = stopPropagation;

        _self.getEvent1 = getEvent1;

        _self.getEvent2 = getEvent2;

        _self.getEvent3 = getEvent3;

    }

    var eventUtil = new EventUtil();

    eventUtil.loadEvent(function () {

        eventUtil.addEvent(document, "click", function (e) {

            alert(eventUtil.getEvent3(e));

        });

        eventUtil.addPropertyChangeEvent(document,function(e){

            alert(eventUtil.getEvent3(e));

        });

    });

</script>

javascript事件处理分为三个阶段:捕获 - 处理 - 起泡。

以点击按钮为例:
捕获阶段:由外层到内层,首先调用给Window注册的click捕获阶段监听方法,然后document、body、一层层的父节点,一直到按钮本身。

处理阶段:调用按钮本身的click监听方法。

起泡阶段:从按钮开始,从内层到外层,依次调用各级父节点的起泡阶段监听方法,直到Window。

但是,对于IE8及更低版本IE,不支持捕获阶段,因此捕获阶段的事件监听目前尚不通用。

通常的事件处理方法形式为:

function eventHandler(e) {  

    e = e || window.event;  

    var target = e.target || e.srcElement;  

    ... ...  

      

} 

e为事件对象,当事件触发时,作为参数传进来,但对于IE8及更低版本IE不适用,只能通过全局的event变量访问,好在不会出现同时处理两个事件的情况。

Javascript 相关文章推荐
关于JavaScript中var声明变量作用域的推断
Dec 16 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
Oct 15 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
Jun 12 Javascript
jQuery回调函数的定义及用法实例
Dec 23 Javascript
PHP守护进程实例
Mar 06 Javascript
seajs模块压缩问题与解决方法实例分析
Oct 10 Javascript
浅谈Vue.nextTick 的实现方法
Oct 25 Javascript
Webpack框架核心概念(知识点整理)
Dec 22 Javascript
浅谈Vue Element中Select下拉框选取值的问题
Mar 01 Javascript
微信小程序实现动态列表项的顺序加载动画
Jul 25 Javascript
Vue和React有哪些区别
Sep 12 Javascript
vue代码分块和懒加载非必要资源文件
Apr 11 Vue.js
JavaScript中的变量作用域介绍
Dec 31 #Javascript
JavaScript中的变量定义与储存介绍
Dec 31 #Javascript
JavaScript中的操作符==与===介绍
Dec 31 #Javascript
jQuery中[attribute]选择器用法实例
Dec 31 #Javascript
JavaScript中的比较操作符&gt;、=、
Dec 31 #Javascript
javascript 操作符(~、&amp;、|、^、)使用案例
Dec 31 #Javascript
JavaScript中的逻辑判断符&amp;&amp;、||与!介绍
Dec 31 #Javascript
You might like
php从数据库中读取特定的行(实例)
2017/06/02 PHP
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
jsp网页搜索结果中实现选中一行使其高亮
2014/02/17 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
JavaScript实现消消乐的源代码
2021/01/12 Javascript
[04:21]狐狸妈带你到现场 DOTA2 TI中国区预选赛线下赛路线指引
2014/05/22 DOTA
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
写了个监控nginx进程的Python脚本
2012/05/10 Python
python实现维吉尼亚算法
2019/03/20 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
报关简历自我评价怎么写
2013/09/19 职场文书
女大学生个人求职信
2013/12/09 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
2014年光棍节活动策划方案(创意集锦)
2014/09/29 职场文书
实习生矿工检讨书
2014/10/13 职场文书
教师评职称工作总结2015
2015/04/20 职场文书
汉字听写大会观后感
2015/06/12 职场文书
升学宴来宾致辞
2015/07/27 职场文书
教师节主题班会教案
2015/08/17 职场文书
python 下载文件的几种方式分享
2021/04/07 Python
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
2022/04/09 MySQL