87,910
社区成员
发帖
与我相关
我的任务
分享
<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>