Javascript.RU

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

Нужна проверка поддержки события "DOMMouseScroll"
Никак не могу найти способ выяснить поддерживает ли браузер событие "DOMMouseScroll". Проверять ЮА на предметт соответствия FF кажется плохой идеей.
Ответить с цитированием
  #2 (permalink)  
Старый 09.11.2009, 21:50
Аватар для can3p
Аспирант
Отправить личное сообщение для can3p Посмотреть профиль Найти все сообщения от can3p
 
Регистрация: 02.11.2009
Сообщений: 40

Можно попробовать использовать сторонний плагин - http://github.com/brandonaaron/jquer...el/tree/master
Ответить с цитированием
  #3 (permalink)  
Старый 09.11.2009, 21:51
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от Denisko-Redisko
Никак не могу найти способ выяснить поддерживает ли браузер событие "DOMMouseScroll"
Что мешает повесить и DOMMouseScroll и onmousewheel?!
Ответить с цитированием
  #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.
Ответить с цитированием
  #5 (permalink)  
Старый 10.11.2009, 21:23
Аватар для can3p
Аспирант
Отправить личное сообщение для can3p Посмотреть профиль Найти все сообщения от can3p
 
Регистрация: 02.11.2009
Сообщений: 40

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

Они там вешают сразу оба обработчика, как и все везде.
Ответить с цитированием
  #7 (permalink)  
Старый 11.11.2009, 09:37
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от Denisko-Redisko
Как раз не хочется извращаться.
А где в навешивании функции на два события извращение?
Ответить с цитированием
  #8 (permalink)  
Старый 11.11.2009, 10:17
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от Kolyaj
А где в навешивании функции на два события извращение?
Да, кажется некрасиво - один обработчик связывать с двумя событиями... Но найти другое решение я не смог...
Ответить с цитированием
  #9 (permalink)  
Старый 11.11.2009, 10:23
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

B~Vladi,
что в этом плохого?
Ответить с цитированием
  #10 (permalink)  
Старый 11.11.2009, 11:00
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от Kolyaj
что в этом плохого?
Нет плохого, я же сказал - некрасиво. Сам так делаю ибо другого пути нет, поэтому и предложил поступить именно так.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Drug&Drop + всплывание события = проблемы =(( _NoName_ Events/DOM/Window 4 05.03.2009 17:47
Явный вызов процедуры обработки события. supchik Общие вопросы Javascript 18 27.01.2009 13:16
Нужна помощь в завершении скрипта - если конечно не трудно. Rush Общие вопросы Javascript 11 18.10.2008 15:06
Проверка полей формы Rush Общие вопросы Javascript 2 16.10.2008 23:44
НУжна помощ ! Jumong Общие вопросы Javascript 4 01.10.2008 23:17