Lonsan
博客园
首页
社区
新文章
新随笔
订阅
管理
posts - 4, comments - 17, trackbacks - 0
JS类中event的简单实现(续)
<!--
description:JS类中event的简单实现2
code by Lonsan on 2005
email:Lonsan21@163.com
请各位多批评指导,谢谢
-->
<
html
>
<
head
>
<
title
>
JS Event2
</
title
>
<
style
>
</
style
>
</
head
>
<
body
>
</
body
>
</
html
>
<
script
language
="javascript"
>
<!--
//
实现,实现类似C#风格调用
//
已经支持+=和-=操作符,但是还存在很多问题,正寻求解决方法
//
注:参考了birdshome提示,在此表示感谢。
function
RaiseEvent(sender,event)
{
var
funs
=
""
;
for
(
var
k
in
EventHandler.Events)
{
if
(k
==
"
length
"
)
continue
;
if
((event
&
EventHandler.Events[k].ID)
>
0
)
{
funs
+=
k
+
"
(sender);\n
"
;
}
}
eval(
"
var f = function(sender){\n
"
+
funs
+
"
\n}
"
);
f(sender);
}
function
EventHandler(o)
{
this
.EventID;
var
fname;
if
(
typeof
o
==
"
function
"
)
{
fname
=
o.toString().match(
/
function
([
^
\
0
\(]
*
)\(
/
)[
1
];
if
(EventHandler.Events[fname]
==
null
)
{
this
.EventID
=
(
1
<<
EventHandler.Events.length);
EventHandler.Events[fname]
=
{ID:
this
.EventID}
;
EventHandler.Events.length
++
;
}
else
{
this
.EventID
=
EventHandler.Events[fname].ID;
}
}
}
EventHandler.Events
=
{length:
0
}
;
EventHandler.Null
=
0
;
EventHandler.prototype.toString
=
function
()
{
return
this
.EventID;
}
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
示例
function
Persion()
{}
Persion.prototype.onBeginSpeak
=
EventHandler.Null;
Persion.prototype.name
=
"
Lonsan
"
;
Persion.prototype.Speak
=
function
(sWords)
{
RaiseEvent(
this
,
this
.onBeginSpeak);
alert(
"
正在讲话。。。\n以下是讲话内容:\n
"
+
sWords);
}
var
p
=
new
Persion()
//
test1
p.onBeginSpeak
+=
new
EventHandler(BeginSpeak1);
p.onBeginSpeak
+=
new
EventHandler(BeginSpeak2);
alert(
"
测试1开始!!
"
);
p.Speak(
"
大家好,我是
"
+
p.name
+
"
。
"
);
//
test2
p.onBeginSpeak
-=
new
EventHandler(BeginSpeak2);
p.onBeginSpeak
+=
new
EventHandler(BeginSpeak3);
alert(
"
测试2开始!!
"
);
p.Speak(
"
第二次\n已经取消BeginSpeak2事件。\n我是
"
+
p.name
+
"
。
"
);
function
BeginSpeak1(sender)
{
alert(
"
处理BeginSpeak事件!--1\n
"
);
}
function
BeginSpeak2(sender)
{
alert(
"
处理BeginSpeak事件!--2
"
);
}
function
BeginSpeak3(sender)
{
sender.name
=
"
(Lonsan)蓝山
"
;
alert(
"
处理BeginSpeak事件!--3
"
);
}
//
-->
</
script
>
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted on 2005-04-08 13:11
蓝山
阅读(944)
评论(5)
编辑
收藏
FeedBack:
134103
#1楼
2005-04-08 14:08
|
birdshome
好玩,有点样子了:)
回复
引用
查看
#2楼
2005-04-08 14:23
|
Lonsan
多谢鼓励,js看似简单的语言,实际功能强大。
回复
引用
#3楼
2005-04-08 14:26
|
Laser.NET
确实有创意啊!!赞!
不过我倒是有个限制:由于Javascript中的numeric value是用8字节的IEEE浮点数格式存放的,所以,我觉得一个EventHandler最多就能放8*8=64个function了。
回复
引用
查看
#4楼
2005-04-08 14:34
|
Lonsan
确实是存放数量有限,这个问题暂时没解决,如果有其他想法请提供
互相交流嘛,造个氛围,看着大家都踊跃,我也贡献点:)
回复
引用
#5楼
2005-04-08 14:40
|
birdshome
其实一个EventHandler的scope中要是有32个事件函数,已经复杂的不行了:}
回复
引用
查看
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
中石化为员工团购奔驰 优惠额度2万元起
·
Lumia 800行货版上市时间曝光
·
乔布斯走后的日子:苹果盛世暗藏危机
·
苹果开年度股东大会:投资者对如何分红持异议
·
Google Maps在中国大城市实现3D建筑视图
»
更多新闻...
最新知识库文章
:
·
编程的艺术:漂亮的代码和漂亮的软件
·
GIT分支管理是一门艺术
·
编程:是一门艺术
·
编程是一门艺术吗?
·
对Java初学者的忠告
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
昵称:
蓝山
园龄:
7年7个月
粉丝:
0
关注:
0
<
2012年2月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1
2
3
4
5
6
7
8
9
10
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
随笔档案
2005年4月 (3)
2004年7月 (1)
最新评论