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 Math ceil()、floor()、round()三个函数的区别
Mar 09 Javascript
javascript 基础篇2 数据类型,语句,函数
Mar 14 Javascript
将json当数据库一样操作的javascript lib
Oct 28 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
May 11 Javascript
jquery实现增加删除行的方法
Feb 03 Javascript
JavaScript判断是否为数组的3种方法及效率比较
Apr 01 Javascript
JS简单实现String转Date的方法
Mar 02 Javascript
JS原型与原型链的深入理解
Feb 15 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
Apr 02 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
Apr 15 Javascript
JavaScript实现公告栏上下滚动效果
Mar 13 Javascript
Vue Render函数原理及代码实例解析
Jul 30 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中的静态变量及static静态变量使用详解
2015/11/05 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
解析js如何获取css样式
2016/12/11 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
2019/10/28 jQuery
原生js+ajax分页组件
2020/01/30 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
python多进程中的内存复制(实例讲解)
2018/01/05 Python
python中字符串内置函数的用法总结
2018/09/13 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
Linux机考试题
2015/07/17 面试题
考博专家推荐信模板
2013/12/02 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
八年级数学教学反思
2016/02/17 职场文书
解析python中的jsonpath 提取器
2022/01/18 Python
在vue中import()语法不能传入变量的问题及解决
2022/04/01 Vue.js
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript