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 相关文章推荐
VBScript版代码高亮
Jun 26 Javascript
js生成的验证码的实现与技术分析
Sep 17 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
Aug 24 Javascript
JavaScript实现页面定时刷新(定时器,meta)
Oct 12 Javascript
vue 中自定义指令改变data中的值
Jun 02 Javascript
js+html制作简单日历的方法
Jun 27 Javascript
Angular 向组件传递模板的两种方法
Feb 23 Javascript
Vue的watch和computed方法的使用及区别介绍
Sep 06 Javascript
JavaScript中七种流行的开源机器学习框架
Oct 11 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
Apr 15 Javascript
基于iview的router常用控制方式
May 30 Javascript
详解ES6 中的Object.assign()的用法实例代码
Jan 11 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中的内存管理问题
2011/08/31 PHP
php中autoload的用法总结
2013/11/08 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
PHP示例演示发送邮件给某个邮箱
2019/04/03 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
简介alert()与console.log()的不同
2015/08/26 Javascript
JS实现图片平面旋转的方法
2016/03/01 Javascript
.vue文件 加scoped 样式不起作用的解决方法
2018/05/28 Javascript
浅谈python字符串方法的简单使用
2016/07/18 Python
利用Python命令行传递实例化对象的方法
2016/11/02 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
Python日志打印里logging.getLogger源码分析详解
2021/01/17 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
饲料采购员岗位职责
2013/12/19 职场文书
建筑项目策划书
2014/01/13 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
给老师的一封感谢信
2015/01/20 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
Python生成九宫格图片的示例代码
2021/04/14 Python
javascript实现计算器功能详解流程
2021/11/01 Javascript
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技