Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Как проверить поддержку события "DOMMouseScroll"? (Denis Usenko)
Author Message
Denis Usenko
Участник форума



Joined: 06 Feb 2006
Posts: 54
Карма: 13
   поощрить/наказать


PostPosted: Sun Nov 08, 2009 1:25 am (написано за 11 минут 44 секунды)
   Post subject: Как проверить поддержку события "DOMMouseScroll"?
Reply with quote

Понадобилось добавить поддержку колеса мыши в старый код обеспечивающий установку EventHandlers. Никак не могу найти способ выяснить поддерживает ли браузер событие "DOMMouseScroll". Проверять ЮА на предметт соответствия FF кажется плохой идеей.
На всякий случай привожу код, может проблему можно решить как-то иначе.
Code (JavaScript): скопировать код в буфер обмена
/*
    Установка обработчиков событий.

    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,
// -------------------------------------------------------------------------------------
// ВОТ ЗДЕСЬ
// надо заменить 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
        // ------------------------------------------------------------------
        //                          | Internet  | Konqueror | Opera, Firefox
        //                          | Explorer  |           | 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 (){
            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]];
        };
})()
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML