posts - 4,  comments - 17,  trackbacks - 0
<!-- 
    description:JS类中event的简单实现
    code by Lonsan on 2005
    email:Lonsan21@163.com

    请各位多批评指导,谢谢
-->
<html>
<head>
<title> JS Event </title>
<style>
</style>
</head>

<body>
</body>
</html>

<script language="javascript">
<!--
//实现,实现类似C#风格调用
function RaiseEvent(sender,event)
{
    event.replace(
/^undefined|null|\s+/,"");
    eval(
"var f = function(sender){\n"+event+"\n}");
    f(sender);
}

function EventHandler(o)
{
    
this.delegate = "\n";

    
//function
    if(typeof o=="function")
    
{
        
this.delegate += o.toString().match(/function([^\0\(]*)\(/)[1+ "(sender);\n";
    }

    
//function name
    else if(typeof o=="string" && /^[a-z\$]*[0-9a-z]+$/i.test(o))
    
{
        
this.delegate += o + "(sender);\n";
    }

    
//function code
    else if(typeof o=="string")
    
{
        
this.delegate += o + ";\n";
    }

    
//else
    else
    
{
        
//do nothing
    }


    
return this.delegate;
}

EventHandler.prototype.toString 
= function()
{
    
return this.delegate;
}



//示例
function Persion(){}
Persion.prototype.onBeginSpeak;
//也可有默认事件,优先进行处理
Persion.prototype.onEndSpeak = new EventHandler(DefaultEvent);
Persion.prototype.name
="Lonsan";
Persion.prototype.Speak 
= function(sWords)
{
    RaiseEvent(
thisthis.onBeginSpeak);

    alert(
"正在讲话。。。\n以下是讲话内容:\n"+sWords);

    RaiseEvent(
thisthis.onEndSpeak);
}


var p = new Persion()

//事件挂接,可以挂接多个
p.onBeginSpeak += new EventHandler(BeginSpeak1);
p.onBeginSpeak 
+= new EventHandler(BeginSpeak2);
p.onEndSpeak 
+= new EventHandler("EndSpeak");
p.onEndSpeak 
+= new EventHandler("alert('讲话结束了,大家散场吧。');");

p.Speak(
"大家好");

function BeginSpeak1(sender)
{
    alert(
"处理BeginSpeak事件!--1\n讲话者:"+sender.name);
}

function BeginSpeak2(sender)
{
    alert(
"处理BeginSpeak事件!--2");
}

function EndSpeak(sender)
{
    alert(
"处理EndSpeak事件!");
}

function DefaultEvent(sender)
{
    alert(
"EndSpeak的默认事件处理。");
}

//-->
</script>
posted on 2005-04-07 17:45 蓝山 阅读(1666) 评论(9) 编辑 收藏

FeedBack:
2005-04-07 19:14 | ttyp      
不错~,不过文章标题有点误倒
 回复 引用 查看   
2005-04-07 21:52 | Laser.NET      
那如何实现-=的操作呢?
 回复 引用 查看   
2005-04-07 22:22 | birdshome
mission impossible.
 回复 引用   
2005-04-07 23:59 | ttyp      
这种结构的好象不行
 回复 引用 查看   
2005-04-08 01:07 | birdshome      
其实我也想过模拟+=和-=,除非用int来保存。
做一个表,int有32位,一bit位对应一个事件,就可以用+=和-=操作了,不过想起来都恐怖,我也就根本没有去试验:P

在我的TreeView控件中,也实现了一种事件模型,类似dom提供的attachEvent,明天要是有空就post出来。

 回复 引用 查看   
2005-04-08 08:43 | Lonsan
:)
这只是偶然想到要这么来做的,昨天有点时间就实现了,只是一点个人想法。平时也很喜欢研究js,取个乐,呵呵

-=好象不好实现,或者说暂时没想到:(

 回复 引用   
2005-04-08 08:48 | Lonsan
fro birdshome:你的想法好象是可行的,可以考虑一下。
 回复 引用   
2005-04-08 10:43 | Lonsan
已修改可以支持-=和+=操作,代码下午可以发上来,请大家多提意见,感谢各位朋友指点。
 回复 引用   
2005-12-03 12:17 | haigear[未注册用户]
不错的想法
 回复 引用   
昵称:蓝山
园龄:7年7个月
粉丝:0
关注:0

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

搜索

 
 

常用链接

随笔档案

最新评论