posts - 4,  comments - 17,  trackbacks - 0
<!-- 
    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(
thisthis.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:
2005-04-08 14:08 | birdshome      
好玩,有点样子了:)
 回复 引用 查看   
2005-04-08 14:23 | Lonsan
多谢鼓励,js看似简单的语言,实际功能强大。
 回复 引用   
2005-04-08 14:26 | Laser.NET      
确实有创意啊!!赞!
不过我倒是有个限制:由于Javascript中的numeric value是用8字节的IEEE浮点数格式存放的,所以,我觉得一个EventHandler最多就能放8*8=64个function了。

 回复 引用 查看   
2005-04-08 14:34 | Lonsan
确实是存放数量有限,这个问题暂时没解决,如果有其他想法请提供
互相交流嘛,造个氛围,看着大家都踊跃,我也贡献点:)

 回复 引用   
2005-04-08 14:40 | birdshome      
其实一个EventHandler的scope中要是有32个事件函数,已经复杂的不行了:}
 回复 引用 查看   
昵称:蓝山
园龄:7年7个月
粉丝:0
关注:0

<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

搜索

 
 

常用链接

随笔档案

最新评论