Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Нужна проверка поддержки события "DOMMouseScroll" (https://javascript.ru/forum/events/6056-nuzhna-proverka-podderzhki-sobytiya-dommousescroll.html)

B~Vladi 02.01.2012 17:07

Цитата:

Сообщение от devote
Строка 12 вместо onmousewheel нужно писать mousewheel

Нет, у меня всё правильно.
Цитата:

Сообщение от devote
попробуй написать брехню вместо onmousewheel и оно у тебя также сработает. Тоесть ты просто вызовешь собственное событие, которое не обязательно должно существовать в браузере

Ты в этом точно уверен? Прочитай ещё раз мою подпись.

devote 02.01.2012 17:15

B~Vladi,
Ну вот смотри, Опера поддерживает как mousewheel так и DOMMouseScroll.

привожу пример:

function getWheelEvent(){
    var eventType='DOMMouseScroll';
    var listener=function(){
        eventType='myevent';
    }
    var ele=document.createElement('div');
    document.body.appendChild(ele);
    if(ele.addEventListener)ele.addEventListener('myevent',listener,false);
    else if(ele.attachEvent)ele.attachEvent('onmyevent',listener);
    if(document.createEvent&&ele.dispatchEvent){
        var evt=document.createEvent('HTMLEvents');
        evt.initEvent('myevent',true,true);
        ele.dispatchEvent(evt);
    }else ele.fireEvent('onmyevent',event);
    if(ele.removeEventListener)ele.removeEventListener('myevent',listener,false);
    else if(ele.detachEvent)ele.detachEvent('onmyevent',listener);
    document.body.removeChild(ele);
    return eventType;
}
alert(getWheelEvent());
тут ты получишь myevent потому что функция addEvenetListener по стандартам w3c позволяет создавать собственные события и инициировать их. просто пример по аналогии jQuery

$('div').bind('myevent', function(){
    alert("triggered myevent");
});
$('div').trigger('myevent');


тоесть в твоем коде по стандарту initEvent не должен начинаться с префикса on у тебя же оно есть, а событие висит на обычном событие без префикса.

B~Vladi 02.01.2012 18:05

Цитата:

Сообщение от devote
Опера поддерживает как mousewheel так и DOMMouseScroll.

Потому что опера - единственный браузер, подражающий IE. В любом случае к ошибке это не приводит.
Цитата:

Сообщение от devote
пример по аналогии jQuery

В jQuery это обертка, кури исходники. Так же как пространства имен в именах событий.

devote 02.01.2012 18:18

Цитата:

Сообщение от B~Vladi
В jQuery это обертка, кури исходники. Там же как пространства имен в именах событий.

Не ужто так сложно прочесть стандарты. Я не сказал что это как сделано в jQuery я сказал что по аналогии, тоесть я хочу проверить есть ли в браузере событие допустим "TratataEvent". идем твоим способом:

function test( event ) {
    var status = false,
        elem = document.createElement('div');

    document.body.appendChild( elem );

    elem.addEventListener( event, function() {
        status = true;
    }, false);

    var evt=document.createEvent('HTMLEvents');
    evt.initEvent( event ,true, true );

    elem.dispatchEvent( evt );

    document.body.removeChild( elem );

    return status;
}

alert( test( 'TratataEvent' ) );
alert( test( 'click' ) );
alert( test( 'DOMMouseScroll' ) );
alert( test( 'onmousewheel' ) );
alert( test( 'mousewheel' ) );


Все эти тесты всегда выведут значение true

Цитата:

Сообщение от B~Vladi
В jQuery это обертка, кури исходники.

Прокурены давно, и я не ставлю в пример jQuery, говорю что стандартные работают по тому же принципу.

А для ИЕ достаточно сделать такую проверку:
function test( event ) {
    var status = false,
        elem = document.createElement('div');

    document.body.appendChild( elem );

    try {
        elem.fireEvent( event, document.createEventObject() );
        status = true;
    } catch ( _ ) {
    }

    document.body.removeChild( elem );

    return status;
}

alert( test( 'onmousewheel' ) );

alert( test( 'onblahtest' ) );

Nekromancer 02.01.2012 19:15

B~Vladi,
У вас таки ошибка.
if(ele.addEventListener)ele.addEventListener('mousewheel',listener,false);
        var evt=document.createEvent('HTMLEvents');
        evt.initEvent('onmousewheel',true,true);
        ele.dispatchEvent(evt);

Найдите разницу в 2 символа в создаваемом и запускаемом объекте. Это лишь ИЕ падает на fireEvent, когда пытаешься ему вызвать не существующее событие в браузере.
И так, как правильно проверить, в браузере поддерживается mousewheel или DOMMouseScroll
if(document.body.addEventListener){
if('onmousewheel' in document.body || document.body.onmousewheel === null){
// mousewheel event
}else if(window.MouseScrollEvent){
//DOMMouseScroll by Gecko
}else if(window.WheelEvent){
//DOMMouseScroll DOM 3 Events - Webkit support
}else {
//default behavior
//passing 2 events - DOMMouseScroll && mousewheel
}
}else if(window.attachEvent){
//old IE - mousewheel

}else {
//default behavior ...
}

Nekromancer 02.01.2012 19:20

Как заметили мне в приват, лучше конечно проверять с начала на существование DOMMouseScroll события :)

devote 02.01.2012 19:34

if ( window.MouseScrollEvent || window.WheelEvent ) {
    // Gecko | Webkit
    event = "DOMMouseScroll";
} else if ( window.addEventListener ) {
    // Opera | IE 9
    event = "mousewheel";
} else {
    // IE before v9
    event = "onmousewheel";
}

Nekromancer 02.01.2012 19:42

Цитата:

Сообщение от devote (Сообщение 147714)
if ( window.MouseScrollEvent || window.WheelEvent ) {
    // Gecko | Webkit
    event = "DOMMouseScroll";
} else if ( window.addEventListener ) {
    // Opera | IE 9
    event = "mousewheel";
} else {
    // IE before v9
    event = "onmousewheel";
}

Не, криво, серьёзно.

B~Vladi 02.01.2012 22:04

Да ок ок, вы посмотрите какого года этот пост. Кстати, я удалил 2 последние.

Nekromancer 02.01.2012 22:14

B~Vladi,
гг, действительно, кто блин такое апает :)


Часовой пояс GMT +3, время: 00:19.