javascript 自定义事件初探


Posted in Javascript onAugust 21, 2009

还有,“通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率。”。相信C#程序员对事件的好处是深有体会的。好了,Code is cheap.看代码:
function class1() { // 最简单的事件设计模式
}
class1.prototype = {
show: function () {
this .onShow();
},
onShow: function () { }
}
function test() {
var obj = new class1();
obj.onShow = function () {
alert( " test " );
}
obj.show();
}
下面看看如何给事件处理程序传递参数:
// 将有参数的函数封装为无参数的函数
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的with 语句的使用方法
May 09 Javascript
JSON辅助格式化处理方法
Mar 26 Javascript
jQuery选择器querySelector的使用指南
Jan 23 Javascript
js实现带有介绍的Select列表菜单实例
Aug 18 Javascript
dedecms页面如何获取会员状态的实例代码
Mar 15 Javascript
深入理解JS addLoadEvent函数
May 20 Javascript
node.js爬虫爬取拉勾网职位信息
Mar 14 Javascript
js实现音频控制进度条功能
Apr 01 Javascript
js 实现复选框只能选择一项的示例代码
Jan 23 Javascript
浅析vue中常见循环遍历指令的使用 v-for
Apr 18 Javascript
利用Blob进行文件上传的完整步骤
Aug 02 Javascript
js简单粗暴的发布订阅示例代码
Jan 23 Javascript
IE 下的只读 innerHTML
Aug 21 #Javascript
JS 控制CSS样式表
Aug 20 #Javascript
JS获取父节点方法
Aug 20 #Javascript
javascript 数组排序函数
Aug 20 #Javascript
用Javascript数组处理多个字符串的连接问题
Aug 20 #Javascript
JQUERY 浏览器判断实现函数
Aug 20 #Javascript
google地图的路线实现代码
Aug 20 #Javascript
You might like
php缓存技术介绍
2006/11/25 PHP
php中的MVC模式运用技巧
2007/05/03 PHP
CI框架源码阅读,系统常量文件constants.php的配置
2013/02/28 PHP
xmlHTTP实例
2006/10/24 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
jQuery控制TR显示隐藏的三种常用方法
2014/08/21 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
基于Bootstrap实现图片轮播效果
2016/05/22 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
javascript创建含数字字母的随机字符串方法总结
2016/08/01 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
2016/10/14 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
关于layui表单中按钮自动提交的解决方法
2019/09/09 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
2020/04/26 Javascript
Python学习之asyncore模块用法实例教程
2014/09/29 Python
python实现简单温度转换的方法
2015/03/13 Python
详解Python2.x中对Unicode编码的使用
2015/04/03 Python
Python os模块学习笔记
2015/06/21 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
python实现键盘输入的实操方法
2019/07/16 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
运动会广播稿30字
2014/01/21 职场文书
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
行政执法队伍作风整顿个人剖析材料
2014/10/11 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
2016年感恩节寄语
2015/12/07 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
2019森林防火宣传标语大全!
2019/07/03 职场文书
Redis RDB技术底层原理详解
2021/09/04 Redis
MySQL创建表操作命令分享
2022/03/25 MySQL