<a id="test1" style="cursor:hand;" href="http://www.sina.com" >test1,click me!</div>
<script type="text/javascript">

function clickme(e) ...{
alert('normal2:'+ this.id);
e.preventDefault();
}
Ext.get('test1').on('click',clickme);
</script>|
配置项 |
说明 |
|
scope |
和第三个参数是相同的,用来指定监听函数作用域。 |
|
delay |
指定该函数推迟多长时间后才运行(ms为单位)。 |
|
buffer |
指定函数推迟的时间,在没有运行之后,后来的注册函数可以修改它。 |
|
single |
指定该函数是否只运行一次,然后就删除自身。boolen值。 |
|
normalized |
如果指定为false,就把浏览器事件event传入到监听函数中去。 |
|
stopPropagation |
True就会阻止事件冒泡向上传递。 |
|
preventDefault |
True就会阻止缺省的动作发生。 |
|
stopEvent |
True就会进行preventDefault、stopPropagation两个操作。 |
|
delegate |
Simpe类型的CSS Selector,用来在其父元素中找到合适的元素。 |
表4.6 注册函数的配置项
对于options,我们还可以指定除这些配置项之后的其它的配置,因为它会作为参数传给监听函数的第三个参数。我们来把代码4.5中的JS改成如下:
function clickme(e,t,o) {
alert('nodeName:'+ t.nodeName+"."+o.privateMsg); }
Ext.get('test1').on('click',clickme,this,


...{preventDefault:true,privateMsg:'privateMsg'});
el.on({


'click' : ...{ fn: this.onClick, scope: this, delay: 100},
'mouseover' : ...{fn: this.onMouseOver, scope: this },
'mouseout' : ...{ fn: this.onMouseOut, scope: this }
});
el.on({
'click' : this.onClick,
'mouseover' : this.onMouseOver,
'mouseout' : this.onMouseOut,
scope: this
});
Ext.addBehaviors({


'#foo a@click' : function(e, t)...{// do something }
'#foo a, #bar span.some-class@mouseover' : function()...{// do something }
}); ,
function clickme(e,t) {
alert('nodeName:'+ t.nodeName); }


Ext.addBehaviors(...{ 'a@click', clickme});
addListener : function(element, eventName, fn, scope, options){

if(typeof eventName == "object")...{ ①
var o = eventName;

for(var e in o)...{
if(propRe.test(e))...{ continue; } ⑤

if(typeof o[e] == "function")...{ ③
listen(element, e, o, o[e], o.scope);
}else...{listen(element, e, o[e]); } ④
}
return;
}
return listen(element, eventName, options, fn, scope); ②
},
var listen = function(element, ename, opt, fn, scope){


var o = (!opt || typeof opt == "boolean") ? ...{} : opt;
fn = fn || o.fn; scope = scope || o.scope;
var el = Ext.getDom(element);

if(!el)...{ throw "Error listening for \"" + ename + '\". Element "'
+ element + '" doesn\'t exist.'; }

var h = function(e)...{ ①
e = Ext.EventObject.setEvent(e); ②
var t;
if(o.delegate)...{t = e.getTarget(o.delegate,el); if(!t){return;}}③
else...{ t = e.target; }
if(o.stopEvent === true)...{ e.stopEvent();} ④
if(o.preventDefault === true)...{ e.preventDefault();}
if(o.stopPropagation === true)...{ e.stopPropagation();}
if(o.normalized === false)...{ e = e.browserEvent; } ⑤
fn.call(scope || el, e, t, o); ⑥
};
if(o.delay)...{ h = createDelayed(h, o); } ⑦
if(o.single)...{ h = createSingle(h, el, ename, fn); }
if(o.buffer)...{ h = createBuffered(h, o); }
addListener(el, ename, fn, h, scope); ⑧
return h;
};
var addListener = function(el, ename, fn, wrap, scope){
var id = Ext.id(el);


if(!elHash[id])...{ elHash[id] = {}; }
var es = elHash[id];
if(!es[ename])...{ es[ename] = [];}
var ls = es[ename];
ls.push(...{id: id, ename: ename, fn: fn, wrap: wrap, scope: scope });
E.on(el, ename, wrap);
...
}
点击展开示例
// 手工触发DOM元素监听。

fire: function(element, eventName, memo) ...{
// http://www.nabble.com/firefox-DOM-does-not-have-the-fireEvent-function-t2188792.html
// 在FF中实现IE fireEvent方法
element = $(element);
//不知道为了兼容那一个FF系列的游览器。
if (element == document && document.createEvent && !element.dispatchEvent)
element = document.documentElement;
/*
* initEvent 该方法将初始化 Document.createEvent() 方法创建的合成 Event 对象的 type
* 属性、bubbles 属性和 cancelable 属性。 只有在新创建的 Event 对象被 Document 对象或 Element
* 对象的 dispatchEvent() 方法分派之前,才能调用 Event.initEvent() 方法。
*/
var event;

if (document.createEvent) ...{
// FF中人工fire,先create event,second: initEvent,then dispatchEvent
event = document.createEvent("HTMLEvents");
// event.initEvent(eventType,canBubble,cancelable)
event.initEvent("dataavailable", true, true);
} else ...{// IE
event = document.createEventObject();
event.eventType = "ondataavailable";
}
event.eventName = eventName;
event.memo = memo || ...{ };

if (document.createEvent) ...{// FF
element.dispatchEvent(event);
} else ...{// IE
element.fireEvent(event.eventType, event);
}
return Event.extend(event);
}
点击展开示例
var removeListener = function(el, ename, fn, scope){
el = Ext.getDom(el);
var id = Ext.id(el), es = elHash[id], wrap;

if(es)...{
var ls = es[ename], l;

if(ls)...{

for(var i = 0, len = ls.length; i < len; i++)...{
l = ls[i];

if(l.fn == fn && (!scope || l.scope == scope))...{
wrap = l.wrap;
E.un(el, ename, wrap);
ls.splice(i, 1);
break;
}
}
}
}

if(ename == "mousewheel" && el.addEventListener && wrap)...{
el.removeEventListener("DOMMouseScroll", wrap, false);
}

if(ename == "mousedown" && el == document && wrap)...{ // fix stopped mousedowns on the document
Ext.EventManager.stoppedMouseDownEvent.removeListener(wrap);
}
}