JavaScript中自定义事件用法分析


Posted in Javascript onDecember 23, 2014

本文实例讲述了JavaScript中自定义事件用法。分享给大家供大家参考。具体分析如下:

在web前端开发中,很多人可能不会用到js的自定义事件,但如果是做一个相对来说比较大的项目,尤其是多人协同开发的时候,自定义事件就显得很重要了。那么,什么是js中的自定义事件呢?我们先来看一个例子:
前端开发员A封装了一个函数:

function move(){

    alert(a);  //以此来代表N行代码

}

过段时间,前端开发员B要在A的基础上丰富这个函数,于是,他会这样写:
function move(){

    alert(a);  //以此来代表N行代码

    alert(b);  //以此来代表N行代码

}

是不是发现了问题,B要注意和A的变量、函数等等的命名和冲突问题,又过段时间,前端开发员C也要丰富这个函数,于是:
function move(){

    alert(a);  //以此来代表N行代码

    alert(b);  //以此来代表N行代码

    alert(c);  //以此来代表N行代码

}

这时候会很令人抓狂了,C写起代码来我敢肯定不会很轻松。解决这个问题的方法就是通过自定义事件,我们知道一个元素身上可以添加相同的事件而不会各自影响,如:
window.addEventListener('click',function(){

    alert(1);

} ,false);

window.addEventListener('click',function(){

    alert(2);

} ,false);

点击页面的时候,1和2都会弹出,那么我们就可以用这种方法来定义我们的函数:
window.addEventListener('move',function(){

    alert(3);

} ,false);

window.addEventListener('move',function(){

    alert(4);

} ,false);

这样,我们执行move();的时候就会弹出3和4,这里的move就是自定义事件,它其实就是一个函数

下面看看如何给事件处理程序传递参数:

//将有参数的函数封装为无参数的函数 

function createFunction(obj, strFunc) {

    var args = [];       //定义args 用于存储传递给事件处理程序的参数 

    if (!obj) obj = window; //如果是全局函数则obj=window; 

    //得到传递给事件处理程序的参数 

    for (var i = 2; i < arguments.length; i++) args.push(arguments[i]);

    //用无参数函数封装事件处理程序的调用 

    return function() {

        obj[strFunc].apply(obj, args); //将参数传递给指定的事件处理程序 

    }

}

function class1() {

}

class1.prototype = {

    show: function() {

        this.onShow();

    },

    onShow: function() { }

}

function objOnShow(userName) {

    alert("hello," + userName);

}

function test() {

    var obj = new class1();

    var userName = "test";

    obj.onShow = createFunction(null, "objOnShow", userName);

    obj.show();

}

"因为事件机制仅传递一个函数的名称,不带有任何参数的信息,所以无法传递参数进去",这是后话了,“要解决这个问题,可以从相反的思路去考虑,不考虑怎么把参数传进去,而是考虑如何构建一个无需参数的事件处理程序,该程序是根据有参数的事件处理程序创建的,是一个外层的封装。”,这里的“该程序”就是createFunction函数,它巧妙地利用apply函数将带参数的函数封装为无参数函数。最后我们看看如何实现自定义事件的多绑定:

// 使自定义事件支持多绑定

//将有参数的函数封装为无参数的函数 

function createFunction(obj, strFunc) {

    var args = [];       //定义args 用于存储传递给事件处理程序的参数 

    if (!obj) obj = window; //如果是全局函数则obj=window; 

    //得到传递给事件处理程序的参数 

    for (var i = 2; i < arguments.length; i++) args.push(arguments[i]);

    //用无参数函数封装事件处理程序的调用 

    return function() {

        obj[strFunc].apply(obj, args); //将参数传递给指定的事件处理程序 

    }

}

function class1() {

}

class1.prototype = {

    show: function() {

        if (this.onShow) {

            for (var i = 0; i < this.onShow.length; i++) {

                this.onShow[i]();

            }

        }

    },

    attachOnShow: function(_eHandler) {

        if (!this.onShow) { this.onShow = []; }

        this.onShow.push(_eHandler);

    }

}

function objOnShow(userName) {

    alert("hello," + userName);

}

function objOnShow2(testName) {

    alert("show:" + testName);

}

function test() {

    var obj = new class1();

    var userName = "your name";

    obj.attachOnShow(createFunction(null, "objOnShow", userName));

    obj.attachOnShow(createFunction(null, "objOnShow2", "test message"));

    obj.show();

}

我们看到,attachOnShow方法实现的基本思想是对数组的push操作,其实我们还可以在事件执行完成之后,移除事件处理函数,下面单独实现:
//将有参数的函数封装为无参数的函数 

function createFunction(obj, strFunc) {

    var args = [];       //定义args 用于存储传递给事件处理程序的参数 

    if (!obj) obj = window; //如果是全局函数则obj=window; 

    //得到传递给事件处理程序的参数 

    for (var i = 2; i < arguments.length; i++) args.push(arguments[i]);

    //用无参数函数封装事件处理程序的调用 

    return function() {

        obj[strFunc].apply(obj, args); //将参数传递给指定的事件处理程序 

    }

}

function class1() {

}

class1.prototype = {

    show: function() {

        if (this.onShow) {

            for (var i = 0; i < this.onShow.length; i++) {

                this.onShow[i]();

            }

        }

    },

    attachOnShow: function(_eHandler) { // 附加事件

        if (!this.onShow) { this.onShow = []; }

        this.onShow.push(_eHandler);

    },

    detachOnShow: function(_eHandler) { // 移除事件

        if (!this.onShow) { this.onShow = []; }

        this.onShow.pop(_eHandler);

    }

}
function objOnShow(userName) {

    alert("hello," + userName);

}

function objOnShow2(testName) {

    alert("show:" + testName);

}

function test() {

    var obj = new class1();

    var userName = "your name";

    obj.attachOnShow(createFunction(null, "objOnShow", userName));

    obj.attachOnShow(createFunction(null, "objOnShow2", "test message"));

    obj.show();

    obj.detachOnShow(createFunction(null, "objOnShow", userName));

    obj.show(); // 移除一个,显示剩余的一个

    obj.detachOnShow(createFunction(null, "objOnShow2", "test message"));

    obj.show(); // 两个都移除,一个也不显示

}

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
js+CSS 图片等比缩小并垂直居中实现代码
Dec 01 Javascript
关于IE中getElementsByClassName不能用的问题解决方法
Aug 26 Javascript
javaScript 动态访问JSon元素示例代码
Aug 30 Javascript
IE下通过a实现location.href 获取referer的值
Sep 04 Javascript
js变量、作用域及内存详解
Sep 23 Javascript
详解JavaScript中的客户端消息框架设计原理
Jun 24 Javascript
javascript的正则匹配方法学习
Feb 24 Javascript
将List对象列表转换成JSON格式的类实现方法
Jul 04 Javascript
jQuery事件对象总结
Oct 17 Javascript
微信小程序Redux绑定实例详解
Jun 07 Javascript
JS数组操作之增删改查的简单实现
Aug 21 Javascript
JS如何在不同平台实现多语言方式
Jul 16 Javascript
jQuery中even选择器的定义和用法
Dec 23 #Javascript
javascript实现依次输入input自动定焦
Dec 23 #Javascript
使用原生JS实现弹出层特效
Dec 22 #Javascript
jQuery基础知识小结
Dec 22 #Javascript
jQuery异步获取json数据方法汇总
Dec 22 #Javascript
jQuery的观察者模式详解
Dec 22 #Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
Dec 22 #Javascript
You might like
一个简单的网页密码登陆php代码
2012/07/17 PHP
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
PHP常用的三种设计模式
2017/02/17 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
2017/07/10 PHP
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
jQuery之end()和pushStack()使用介绍
2012/02/07 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
JS下拉框内容左右移动效果的具体实现
2013/07/10 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
Angular.js组件之input mask对input输入进行格式化详解
2017/07/10 Javascript
vue数字类型过滤器的示例代码
2017/09/07 Javascript
p5.js 毕达哥拉斯树的实现代码
2018/03/23 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
Python中List.count()方法的使用教程
2015/05/20 Python
独特的python循环语句
2016/11/20 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
详解python之协程gevent模块
2018/06/14 Python
3分钟学会一个Python小技巧
2018/11/23 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
Python生成器generator原理及用法解析
2020/07/20 Python
python实现学生管理系统开发
2020/07/24 Python
python 绘制场景热力图的示例
2020/09/23 Python
python3判断IP地址的方法
2021/03/04 Python
小学生学雷锋演讲稿
2014/04/25 职场文书
金秋助学感谢信
2015/01/21 职场文书
二十年同学聚会致辞
2015/07/28 职场文书
工作自我评价范文
2019/03/21 职场文书
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server