js中dispatchEvent后的处理

zimu312500 2010-11-02 09:08:15
我借用了别人的一个对象用来继承,使自己的DIV对象具有订阅事件,下发事件的功能,代码如下,现在的问题是我想在function函数里面下发,在<script for=map event="函数名">中捕获,我不大清楚js的事件是怎么进行下发的,请教各位大侠,非常感谢!!!


<script>
//原型:EventManager是一个重要的原型,它用来赋予对象自定义事件的能力
//当对象类型的原型继承EventManager时,对象具有定义、分派和捕捉事件的能力
//EventManager有四个重要的方法dispatchEvent、captureEvent、addEventListener和removeEventListener
/*
提示:您可以先修改部分代码再运行
我认为还是通过dispatchEvent发布事件代理,addEventListener捕捉和注册事件,这样比较符合设计原则,可读性也比较强
貌似W3C的DOM-Level-2其实也是采用这种模式设计DOM对象的基础类型的......*/


function EventManager()
{
this.dispatchEvent = function(eventType, eventArgs)
{
eventArgs = eventArgs || {};
var events = this["on"+eventType];
var called = 0;

if(events && typeof(events) == "function")
events = [events];

if(!eventArgs.type) eventArgs.type = eventType;
//阻止默认动作的执行
eventArgs.preventDefault = function()
{
eventArgs.defaultOp = null;
}
//阻止事件起泡
eventArgs.stopPropagation = function()
{
eventArgs.cancelBubble = true;
}
var $pointer = this;
if(events)
{
for(var i = 0; i < events.length; i++)
{

setTimeout(
(function(i){
var evt = events[i];
var len = events.length;
var capturer = events.capturer;
var capturerName = events.capturerName;
return function(){
called++;

var ret = evt.call($pointer,eventArgs);
//如果有捕获事件的方法,并且没有阻止事件气泡,在最后一个事件处理程序结束之后调用它
if(!eventArgs.cancelBubble && called == len && capturer && capturerName && capturer[capturerName])
{
setTimeout(function(){
capturer[capturerName](eventArgs)
},1)
}
//如果定义了默认动作,在最后一个事件处理程序结束之后执行它
if(called == len && eventArgs.defaultOp)
{
eventArgs.defaultOp.call($pointer, eventArgs);
}
return ret;
}
})(i), 1
);
}
}
else if(eventArgs.defaultOp)
{
eventArgs.defaultOp.call($pointer, eventArgs);
}
}
this.fireEvent = this.dispatchEvent;
this.captureEvents = function(target, eventType, capturerName, closure)
{
if(capturerName instanceof Function)
{
closure = capturerName;
capturerName = null;
}
capturerName = capturerName || "on" + eventType;
target["on"+eventType] = target["on"+eventType] || [function(){}];
var events = target["on"+eventType];
if(typeof(events) == "function")
{
target["on"+eventType] = [events];
}

target["on"+eventType].capturer = this;
target["on"+eventType].capturerName = capturerName;

if(closure)
this[capturerName] = closure;
}

this.addEventListener = function(eventType, closure)
{
if(this["on"+eventType] == null)
{
this["on"+eventType] = [];
}
var events = this["on"+eventType];
if(events && typeof(events) == "function"){
this["on"+eventType] = [events];
events = this["on"+eventType];
}
events.push(closure);
return closure;
}

this.removeEventListener = function(eventType, closure)
{
var events = this["on"+eventType];
if(events && typeof(events) == "function")
events = [events];

for(var i = 0; i < events.length; i++)
{
if(events[i] == closure)
events.splice(i, 1);
}
return closure;
}
}
</script>
<script src="http://ditu.google.com/maps?file=api&v=2&key=abcdefg" type="text/javascript"></script>
<script type="text/javascript">
var newGontrol = new GSmallMapControl();
var map = null; //创建并初始化地图
function load()
{
if (GBrowserIsCompatible())
{
var mapdiv = document.getElementById("mapdiv");

EventManager.call(mapdiv);
map = new GMap2(mapdiv);
map.addControl(newGontrol);
map.setCenter(new GLatLng(39.92, 116.385), 15);

/*mapdiv.onchange = function(evt){

evt.stopPropagation(); //阻止事件被捕获
alert("event capturing stopped!");
} */
mapdiv.addEventListener("change",function(evt) //高级的事件注册方式
{
alert("oldValue:"+evt.oldValue);
alert("newValue:"+evt.newValue);
})

/*mapdiv.captureEvents(mapdiv,"change",null, function(evt){
alert("a.a has changed from " + evt.oldValue + " to " + evt.newValue);
});;*/

mapdiv.dispatchEvent("change", {oldValue:1, newValue:2});


}
}

</script>
</head>
<body onload="load()" onunload="GUnload()">
<div id="mapdiv" style="width: 500px; height: 300px"></div>
</body>
</html>
<script language="javascript" for=mapdiv event="onchange(evt)">
alert("oldValue:"+evt.oldValue);
alert("newValue:"+evt.newValue);
</script>


代码有点长,我想达到的目的就是想让最后的event捕获到我函数中下发的事件,求求求
...全文
829 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
gouxiongyaya 2010-11-03
  • 打赏
  • 举报
回复
帮你顶一下吧,不太懂。。。
zimu312500 2010-11-02
  • 打赏
  • 举报
回复
uyupupupupupup

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧