2010,正心,修身,养性。
焚我残躯,毁我意志,复我记忆。
子曰:“知之者不如好之者,好之者不如乐之者。”
子曰:“吾尝终日不食,终夜不寝,以思,无益,不如学也。”

快乐的生活,快乐的分享。

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,归类于 YUI。 您可以跟踪这篇文章的评论通过 RSS 2.0 feed。 您可以留下评论,或者从您的站点trackback

雁过留声

Rss
渴望孩子的纯真、诚实、可爱、无忧无虑。。。。。。

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