YAHOO.util.Event.addListener
YAHOO.util.Event看的我还是比较晕的,一是我这方面确实好弱,一是YUI太NB了,还是分享一下我的学习经验,谈下我遇到的问题,首先是YAHOO.util.Event.addListener。
if ( this._isValidCollection(el)) {
var ok = true;
for (var i=0,len=el.length; i<len; ++i) {
ok = this.on(el[i],
sType,
fn,
obj,
overrideContext) && ok;
}
return ok;
} else if (YAHOO.lang.isString(el)) {
var oEl = this.getEl(el);
if (oEl) {
el = oEl;
} else {
this.onAvailable(el, function() {
YAHOO.util.Event.on(el, sType, fn, obj, overrideContext);
});
return true;
}
}
this._isValidCollection(el)是判断el是否是一个数组,详细可以看下_isValidCollection这个方法,如果是数组的话,就拆分开来,调用YAHOO.util.Event.addListener。if (YAHOO.lang.isString(el))是判断是否是字符串,也就是说el是否为id,如果是的话就转换成HTMLElement,然后调用YAHOO.util.Event.addListener。其实这两个判断的目的都是为了将el转化为HTMLElement,然后再执行YAHOO.util.Event.addListener。
if ("unload" == sType && obj !== this) {
unloadListeners[unloadListeners.length] =
[el, sType, fn, obj, overrideContext];
return true;
}
这个是判断事件的类型,如果是window.unload的话,就把事件加入到unloadListeners里。
if (this.useLegacyEvent(el, sType)) {
var legacyIndex = this.getLegacyIndex(el, sType);
if ( legacyIndex == -1 ||
el != legacyEvents[legacyIndex][0] ) {
legacyIndex = legacyEvents.length;
legacyMap[el.id + sType] = legacyIndex;
legacyEvents[legacyIndex] =
[el, sType, el["on" + sType]];
legacyHandlers[legacyIndex] = [];
el["on" + sType] =
function(e) {
YAHOO.util.Event.fireLegacyEvent(
YAHOO.util.Event.getEvent(e), legacyIndex);
};
}
legacyHandlers[legacyIndex].push(li);
} else {
try {
this._simpleAdd(el, sType, wrappedFn, bCapture);
} catch(ex) {
this.lastError = ex;
this.removeListener(el, sType, fn);
return false;
}
}
if (this.useLegacyEvent(el, sType)) ,主要是判断浏览器的版本是否为版本号小于418的Safari,这个版本的Safari中,如果注册的事件是click和dbclick,就需要使用遗留事件系统。getLegacyIndex(el, sType)用el的id加上sType作为key在legacyMap中取出遗留事件的索引。fireLegacyEvent(el, sType)触发事件处理过程,估计所谓的遗留事件系统是指一个类型的事件只能注册一个处理器,所以YUI先保存默认的处理器,然后为元素注册一个新的处理器,这个处理器先执行legacyHandlers中的处理器,然后在调用被保存起来的默认行为。这样会导致preventDefault在遗留事件系统中不起作用。如果是其它浏览器的话就直接使用this._simpleAdd(el, sType, wrappedFn, bCapture)来添加事件。
_simpleAdd: function () {
if (window.addEventListener) {
return function(el, sType, fn, capture) {
el.addEventListener(sType, fn, (capture));
};
} else if (window.attachEvent) {
return function(el, sType, fn, capture) {
el.attachEvent("on" + sType, fn);
};
} else {
return function(){};
}
}()
这个大家应该比较熟悉了哈,就是给节点添加事件,判断是否是遵循W3C标准的浏览器,然后使用相应的方法。 YAHOO.util.Event.addFocusListener与YAHOO.util.Event.addBlurListener都是直接调用YAHOO.util.Event.addListener方法,是它的特殊方法。
参考资料:
这篇文章发布于 2009年04月8日,星期三,22:11,归类于 编码。 您可以跟踪这篇文章的评论通过 RSS 2.0 feed。 您可以留下评论,或者从您的站点trackback。