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 相关文章推荐
使Ext的Template可以解析二层的json数据的方法
Dec 22 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
Sep 15 Javascript
Jvascript学习实践案例(开发常用)
Jun 25 Javascript
js实现拖拽 闭包函数详细介绍
Nov 25 Javascript
js用闭包遍历树状数组的方法
Mar 19 Javascript
jQuery中clearQueue()方法用法实例
Dec 29 Javascript
js实现搜索框关键字智能匹配代码
Mar 26 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
Nov 30 Javascript
利用vue写todolist单页应用
Dec 15 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
May 23 Javascript
js实现移动端轮播图
Dec 21 Javascript
详解如何使用微信小程序云函数发送短信验证码
Mar 13 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 巧用数组降低程序的时间复杂度
2010/01/01 PHP
两个php日期控制类实例
2014/12/09 PHP
关于JS字符串函数String.replace()
2013/04/07 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
node.js WEB开发中图片验证码的实现方法
2014/06/03 Javascript
jquery 3D 标签云示例代码
2014/06/12 Javascript
JS+CSS实现仿msn风格选项卡效果代码
2015/10/22 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
jquery实现图片上传前本地预览
2017/04/28 jQuery
Angular4学习教程之HTML属性绑定的方法
2018/01/04 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
python查询mysql中文乱码问题
2014/11/09 Python
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
Python3多线程基础知识点
2019/02/19 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
如何在python中写hive脚本
2019/11/08 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
Python sorted排序方法如何实现
2020/03/31 Python
Pytorch生成随机数Tensor的方法汇总
2020/09/09 Python
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
会计主管岗位职责
2014/01/03 职场文书
《手指教学》反思
2014/02/14 职场文书
报告会主持词
2014/04/02 职场文书
求职信标题怎么写
2014/05/26 职场文书
消防安全宣传口号
2014/06/10 职场文书
财会专业大学生求职信
2014/09/26 职场文书
营销与策划实训报告
2014/11/05 职场文书
婚礼答谢词
2015/01/04 职场文书
联村联户简报
2015/07/21 职场文书
安全伴我行主题班会
2015/08/13 职场文书
Pandas自定义选项option设置
2021/07/25 Python
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB