The source code

    /**
     * @ignore
     * observer for dom event.
     * @author yiminghe@gmail.com
     */
    KISSY.add('event/dom/base/observer', function (S, special, Event) {

        /**
         * observer for dom event
         * @class KISSY.Event.DOMEventObserver
         * @extends KISSY.Event.Observer
         * @private
         */
        function DOMEventObserver(cfg) {
            DOMEventObserver.superclass.constructor.apply(this, arguments);
            /**
             * filter selector string or function to find right element
             * @cfg {String} selector
             */
            /**
             * extra data as second parameter of listener
             * @cfg {*} data
             */
        }

        S.extend(DOMEventObserver, Event._Observer, {

            keys: ['fn', 'selector', 'data', 'context', 'originalType', 'groups', 'last'],

            notifyInternal: function (event, ce) {
                var self = this,
                    s, t, ret,
                    type = event.type;

                // restore originalType if involving delegate/onFix handlers
                if (self.originalType) {
                    event.type = self.originalType;
                }

                // context undefined 时不能写死在 listener 中，否则不能保证 clone 时的 this
                if ((s = special[event.type]) && s.handle) {
                    t = s.handle(event, self, ce);
                    // can handle
                    if (t && t.length > 0) {
                        ret = t[0];
                    }
                } else {
                    ret = self.simpleNotify(event, ce);
                }

                event.type = type;

                return ret;
            }

        });

        return DOMEventObserver;

    }, {
        requires: ['./special', 'event/base']
    });