我才12 ?

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

雁过留声

这位姐姐,你好,你的浏览器版本太低了,为了避免您中毒,请您升级您的浏览器!