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背投广告代码的完善
Apr 08 Javascript
js控制div及网页相关属性的代码
Dec 19 Javascript
基于jquery创建的一个图片、视频缓冲的效果样式插件
Aug 28 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
Oct 23 Javascript
js中通过父级进行查找定位元素
Jun 15 Javascript
JS中的forEach、$.each、map方法推荐
Apr 05 Javascript
JavaScript字符串对象(string)基本用法示例
Jan 18 Javascript
深入理解Vue2.x的虚拟DOM diff原理
Sep 27 Javascript
ligerUI---ListBox(列表框可移动的实例)
Nov 28 Javascript
Vue infinite update loop的问题解决
Apr 23 Javascript
微信js-sdk 录音功能的示例代码
Nov 01 Javascript
微信小程序实现简单文字跑马灯
May 26 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
一个简单的域名注册情况查询程序
2006/10/09 PHP
php curl模拟post请求小实例
2013/11/13 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
php异常处理方法实例汇总
2015/06/24 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
利用PHP命令行模式采集股票趋势信息
2016/08/09 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
2018/10/25 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
为jQuery增加join方法的实现代码
2010/11/28 Javascript
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
小程序转发探索示例
2019/02/19 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
Python编码时应该注意的几个情况
2013/03/04 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
python解决字符串倒序输出的问题
2018/06/25 Python
Python中py文件转换成exe可执行文件的方法
2019/06/14 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
python 通过 pybind11 使用Eigen加速代码的步骤
2020/12/07 Python
法律专业应届本科毕业生求职信
2013/10/25 职场文书
财经学院自荐信范文
2014/02/02 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
求职推荐信范文
2015/03/27 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
银行大堂经理培训心得体会
2016/01/09 职场文书
你离财务总监还有多远?速览CFO的岗位职责
2019/11/18 职场文书
MySQL中dd::columns表结构转table过程及应用详解
2022/09/23 MySQL