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 相关文章推荐
你可能不再需要JQUERY
Mar 09 Javascript
js模仿hover的具体实现代码
Dec 30 Javascript
原生js页面滚动延迟加载图片
Dec 20 Javascript
实例详解AngularJS实现无限级联动菜单
Jan 15 Javascript
全选复选框JavaScript编写小结(附代码)
Aug 16 Javascript
vue购物车插件编写代码
Nov 27 Javascript
详解vue中localStorage的使用方法
Nov 22 Javascript
玩转Koa之核心原理分析
Dec 29 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
Feb 21 Javascript
Vue数字输入框组件示例代码详解
Jan 15 Javascript
Vue2.0 ES6语法降级ES5的操作
Oct 30 Javascript
linux服务器快速卸载安装node环境(简单上手)
Feb 22 Javascript
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&amp;&amp;mysql)一
2006/10/09 PHP
探讨:php中在foreach中使用foreach ($arr as &amp;$value) 这种类型的解释
2013/06/24 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
javascript JSON操作入门实例
2010/04/16 Javascript
jquery随机展示头像代码
2011/12/21 Javascript
window.location.href的用法(动态输出跳转)
2014/08/09 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
vue+vuecli+webpack中使用mockjs模拟后端数据的示例
2017/10/24 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
vue vant Area组件使用详解
2019/12/09 Javascript
Python实现的选择排序算法示例
2017/11/29 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
解决c++调用python中文乱码问题
2020/07/29 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
python实现不同数据库间数据同步功能
2021/02/25 Python
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
有关爱国演讲稿
2014/05/07 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
关于运动会广播稿50字
2014/10/18 职场文书
大学军训决心书
2015/02/05 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
2021/06/05 Python
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python
十大经典日本动漫排行榜 海贼王第三,犬夜叉仅第八
2022/03/18 日漫