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 相关文章推荐
如何让页面加载完成后执行js
Jun 26 Javascript
全面理解面向对象的 JavaScript(来自ibm)
Nov 10 Javascript
jQuery中常用的遍历函数用法实例总结
Sep 01 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
Sep 05 Javascript
JavaScript提高性能知识点汇总
Jan 15 Javascript
基于javascript数组实现图片轮播
May 02 Javascript
JavaScript实现前端分页控件
Apr 19 Javascript
ES6学习笔记之正则表达式和字符串正则方法分析
Apr 25 Javascript
Angular排序实例详解
Jun 28 Javascript
Angular2中监听数据更新的方法
Aug 31 Javascript
Vue中使用sass实现换肤功能
Sep 07 Javascript
纯JS实现五子棋游戏
May 28 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
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
JavaScript实现单例模式实例分享
2017/12/22 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
2017/09/05 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
助理政工师申报材料
2014/06/03 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
2016学习医德医风心得体会
2016/01/25 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python