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 相关文章推荐
Auntion-TableSort国人写的一个javascript表格排序的东西
Nov 12 Javascript
JQuery for与each性能比较分析
May 14 Javascript
ParseInt函数参数设置介绍
Jan 02 Javascript
Javascript中Array.prototype.map()详解
Oct 22 Javascript
14个有用的Jquery技巧分享
Jan 08 Javascript
JS实现完全语义化的网页选项卡效果代码
Sep 15 Javascript
jQuery动画效果相关方法实例分析
Dec 31 Javascript
Bootstrap与Angularjs的模态框实例代码
Aug 03 Javascript
11行JS代码制作二维码生成功能
Mar 09 Javascript
layui操作列按钮个数和文字颜色的判断实例
Sep 11 Javascript
js实现中文实时时钟
Jan 15 Javascript
vue实现图片裁剪后上传
Dec 16 Vue.js
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中调用JAVA
2006/10/09 PHP
php下通过伪造http头破解防盗链的代码
2010/07/03 PHP
Yii中表单用法实例详解
2016/01/05 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
php xhprof使用实例详解
2019/04/15 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
jquery 年会抽奖程序
2011/12/22 Javascript
基于KMP算法JavaScript的实现方法分析
2013/05/03 Javascript
jQuery不兼容input的change事件问题解决过程
2014/12/05 Javascript
Jquery Ajax xmlhttp请求成功问题
2015/02/04 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
详解基于原生JS验证表单组件xy-form
2019/08/20 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
python益智游戏计算汉诺塔问题示例
2014/03/05 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
浅谈Python中带_的变量或函数命名
2017/12/04 Python
pytorch 把MNIST数据集转换成图片和txt的方法
2018/05/20 Python
Selenium定位元素操作示例
2018/08/10 Python
python使用Matplotlib画条形图
2020/03/25 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
python全栈开发语法总结
2020/11/22 Python
计算机应用职专应届生求职信
2013/11/12 职场文书
医院护士的求职信范文
2013/12/26 职场文书
新入职员工的自我介绍演讲稿
2014/01/02 职场文书
小学安全汇报材料
2014/08/14 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
网络安全倡议书(3篇)
2019/09/18 职场文书