Показать сообщение отдельно
  #4 (permalink)  
Старый 10.11.2009, 09:16
Интересующийся
Отправить личное сообщение для Denisko-Redisko Посмотреть профиль Найти все сообщения от Denisko-Redisko
 
Регистрация: 08.11.2009
Сообщений: 16

can3p, постановка задачи (кроссбраузерные функции установки обрабочиков) исключает использование jquery.

B~Vladi,
Цитата:
Что мешает повесить и DOMMouseScroll и onmousewheel?!
Как раз не хочется извращаться. Нужно минимальным вмешательством в существующий код добавить поддержку onmousewheel.
Временно я опеделяю FF через Event.LOAD, но это очень криво, надо поменять на что-то. Или решить проблему иным способом.
/*
    Установка обработчиков событий.

    windows.addEH(node, type, handler) -- повесить обработчик
    windows.delEH(node, type, handler) -- снять обработчик

    В MSIE обработчик получает аргумент event дополненный следующими методами и свойствами:

        event.preventDefault
        event.stopPropagation

        event.pageX
        event.pageY
        event.relatedTarget
        event.which

    Во всех браузерах:

        метод stop объекта Event выполняет методы preventDefault и stopPropagation
        свойство isWheelDown возвращает направление колеса мыши (true -- колесо на себя, false -- от себя)

*/

(function(){

    //
    // Установка обработчиков для MSIE основана на коде Dean Edwards.
    //

    var win = window,
        doc = document,
        huid = 0,                   // счетчик, используемый для создания уникальных ID
        uniPropName = "$RNV601MCTCU",
        W3C = !! win.addEventListener, // document.implementation.hasFeature("Events", "2.0")
// -------------------------------------------------------------------------------------
// ВОТ ЗДЕСЬ
// надо заменить Event.LOAD на внятную проверку поддержки события "DOMMouseScroll"
        mousewheel = { mousewheel : win.Event && Event.LOAD ? "DOMMouseScroll" : null },

    handle = function () {
        var returnValue = true,
            event = getFixedIEEvent(window.event || (this.ownerDocument || this).parentWindow.event),
            handlers = this[uniPropName][event.type];

        for (var i in handlers)
           if (handlers[i].call(this, event) === false)
               returnValue = false;

        return returnValue;
    },

    getFixedIEEvent = function (event) {

        // Добавление стандартных методов событий W3C

        var d = doc.documentElement,
            b = doc.body,
            button = event.button,
            target = event.target = event.srcElement || doc;

        // pageX и pageY корректные для quirks и строгих режимов
        event.pageX = event.clientX + (d.scrollLeft || b.scrollLeft || 0) - (d.clientLeft || 0);
        event.pageY = event.clientY + (d.scrollTop  || b.scrollTop  || 0) - (d.clientTop  || 0);

        event.relatedTarget = event.fromElement == target ? event.toElement : event.fromElement;

        // which -- Returns the numeric keyCode of the key pressed, or the character code (charCode) for an alphanumeric key pressed
        // -------------------------------------------------------------------------
        //                          | MSIE      | Konqueror | Opera, FF, Safari Win
        // -------------------------------------------------------------------------
        //  левая   | event.which   | undefined |    1      |    1
        //  кнопка  | event.button  | 1         |    1      |    0
        //  средняя | event.which   | undefined |    2      |    2
        //  кнопка  | event.button  | 4         |    4      |    1
        //  правая  | event.which   | undefined |    3      |    3
        //  кнопка  | event.button  | 2         |    2      |    2
        //
        // Поскольку в W3C-совместимых движках мы обходимся без оберток, (и соответственно фиксим событие только в ие),
        // то для определения нажатой кнопки мыши приходится использовать устаревший which (почему -- см. таблицу)
        //
        event.which = event.charCode || event.keyCode || (button < 2 ? 1 : button == 4 ? 2 : 3);
        event.preventDefault = preventDefault;
        event.stopPropagation = stopPropagation;
        //event.detail = event.wheelDelta / -40;
        event.stop = stop;
        event.isWheelDown = event.wheelDelta < 0;

        return event;
    },

    preventDefault = function() {
        this.returnValue = false;
    },

    stopPropagation = function() {
        this.cancelBubble = true;
    },

    stop = function () {
        this.preventDefault();
        this.stopPropagation();
    };

    if(win.Event) {
        Event.prototype.stop = stop;
        // В FF MouseScrollEvent не наследует у Event, поэтому добавляем "isWheelDown" соответствующему объекту
        (win.MouseScrollEvent || Event).prototype.__defineGetter__("isWheelDown", function (){
            // Особенности события mousewheel в браузерах: [url]http://generalized.ru/?p=133[/url]
            return this.detail > 0 || this.wheelDelta < 0
        })
    };

    win.addEH = W3C ?

        function(node, type, handler) {
            node.addEventListener(mousewheel[type] || type, handler, false);
        } :

        function(node, type, handler) {
            type = mousewheel[type] || type;
            var ontype = "on" + type,
                events = node[uniPropName] || (node[uniPropName] = {}),
                handlers = events[type];

            handlers || (
                handlers = events[type] = {},
                node[ontype] &&
                    (handlers[0] = node[ontype])
            );

            handler[uniPropName] || (
                handler[uniPropName] = huid++
            );

            handlers[huid] = handler;
            node[ontype] = handle;
        };

    win.delEH = W3C ?

        function(node, type, handler) {
            node.removeEventListener(mousewheel[type] || type, handler, false);
        } :

        function(node, type, handler) {
            type = mousewheel[type] || type;
            if (node[uniPropName] && node[uniPropName][type])
               delete node[uniPropName][type][handler[uniPropName]];
        };
})()

Последний раз редактировалось Denisko-Redisko, 10.11.2009 в 09:22.
Ответить с цитированием