Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как проверить, поддерживается ли событие? (https://javascript.ru/forum/misc/24446-kak-proverit-podderzhivaetsya-li-sobytie.html)

FINoM 30.12.2011 04:47

Как проверить, поддерживается ли событие?
 
Например, animationend поддерживается не всеми браузерами (может и ни одним). Поэтому приходится применять такие события, как webkitanimationend и пр. Если одновременно добавлять и обычное событие и событие с вендорным префиксом, боюсь, в один прекрасный момент, они будут срабатывать оба.

devote 30.12.2011 04:57

if ( document.body.onanimationend === null ) {
    alert( "support" );
} else {
   alert( "unsupport" );
}

if ( document.body.onclick === null ) {
    alert( "support" );
} else {
   alert( "unsupport" );
}

FINoM 30.12.2011 05:21

И? document.createElement('div').onwebkitanimationend выдает null.

devote 30.12.2011 05:25

Цитата:

Сообщение от FINoM
И? document.createElement('div').onwebkitanimationend выдает null.

И правильно делает что выдает, если по умалчанию имеет значение null значит такое свойство браузер держит, если undefined значит не держит.

все просто:

var event = document.createElement('div').onanimationend === null ? 'animationend' : 'webkitanimationend';
addEventListener( event, function(){}, false);

FINoM 30.12.2011 05:28

Цитата:

Сообщение от devote
И правильно делает что выдает, если по умалчанию имеет значение null значит такое свойство браузер держит, если undefined значит не держит.

Тьфу блин, не null a undefuned.
Цитата:

Сообщение от devote
все просто:

Предлагаешь для одного лишь animationend вешать обработчики на насколько событий с вендорными префиксами, не проверяя поддерживаются ли эти события?

devote 30.12.2011 05:35

зачем несколько событий, ешкин макорошкин... всеж по русски объясняю..

ты задал вопрос как узнать поддерживает браузер оригинальное событие или нет... тепер пишешь простую функцию инициализации библиотеки:

eventNames = (function(){
    var conf ={},
        div = document.createElement('div');
    conf.animationend = div.onanimationend === null ? 'animationend' : 'webkitanimationend';
    conf.какойтотамевент = div.onкакойтотамевент === null ? 'какойтотамевент' : 'webkitкакойтотамевент';
    conf.какойтотамевент2 = div.onкакойтотамевент2 === null ? 'какойтотамевент2' : 'webkitкакойтотамевент2';
    div = null;
    return conf;
}());


а теперь спокойно юзаешь:
elem.addEventListener( eventNames.какойтотамевент, function(){
}, false);

elem.addEventListener( eventNames.animationend, function(){
}, false);
и тд

devote 30.12.2011 05:37

trikadin,
ну не знаю, у меня в опере норм выдает

FINoM 30.12.2011 05:37

Еще раз объясняю, onwebkitanimationend выдаёт undefined, хотя через addEventListener поддерживается.

devote 30.12.2011 05:37

Цитата:

Сообщение от trikadin
devote, а ваш пример у меня в обоих случаях "unsupport" выдаёт))

просто мне это не нужно было никогда, поэтому на вскидку щас примеры показываю

devote 30.12.2011 05:39

Цитата:

Сообщение от FINoM
Еще раз объясняю, onwebkitanimationend выдаёт undefined, хотя через addEventListener поддерживается.

ну может он как-то подругому прописан, в файрбаге то посмотрите

devote 30.12.2011 05:46

можно еще так проверить:
eventNames = (function(){
    var conf ={ animationend: 'webkitanimationend' },
        div = document.createElement('div');

    div.addEvenetListener( 'animationend', function(){
        conf.animationend = 'animationend';
    }, false );

    var o = document.createEvent( 'Events' );
    o.initEvent( 'animationend', false, false );
    div.dispatchEvent( o );

    div = null;
    return conf;
}());

devote 30.12.2011 05:48

ну там потом после диспатча еще и удалить событие и т.д. но принцип должен быть понятен

trikadin 30.12.2011 05:50

Цитата:

Сообщение от devote
ну там потом после диспатча еще и удалить событие и т.д. но принцип должен быть понятен

Как всегда, всё костылём через одно место...

devote 30.12.2011 05:51

Цитата:

Сообщение от trikadin
Как всегда, всё костылём через одно место...

ну а что поделаешь, если иначе никак.. разрабы браузеров о нас никогда не думаю... пишут как им удобно.

Nekromancer 30.12.2011 05:53

devote,
Это не докажет существование события. Так можно вызвать любое событие.

FINoM 30.12.2011 05:54

Цитата:

Сообщение от Nekromancer
Это не докажет существование события. Так можно вызвать любое событие.

Ага, только что проверил, так и есть.

devote 30.12.2011 05:56

Цитата:

Сообщение от Nekromancer
devote,
Это не докажет существование события. Так можно вызвать любое событие.

ну да, шото я не подумал :-?

devote 30.12.2011 05:58

ну значит не диспатчить, а организовать микроанимацию... короче заставить браузер выполнить событие...

FINoM 30.12.2011 05:59

Угу, изначально так подумал, но это идиотизм.

devote 30.12.2011 06:02

Цитата:

Сообщение от FINoM
Угу, изначально так подумал, но это идиотизм.

Ну дык ты в мире программинга крутишся, привыкать пора к идиотизму :D

trikadin 30.12.2011 06:04

FINoM, короче, вам проще узнавать версию и проверять, поддерживается ли в этой версии нужная вам ф-ция))

Nekromancer 30.12.2011 06:06

ну например в веб ките можно проверить так:
window.WebKitAnimationEvent

в опере видимо так
document.body.onanimationend

в фф ещё не придумал как

devote 30.12.2011 06:07

Цитата:

Сообщение от Nekromancer
ну например в веб ките можно проверить так:
window.WebKitAnimationEvent

во! говорил же как-то все же называеться

FINoM 30.12.2011 06:07

Цитата:

Сообщение от trikadin
FINoM, короче, вам проще узнавать версию и проверять, поддерживается ли в этой версии нужная вам ф-ция))

Юзерагенты дёргать... Как-то это не стабильно.

FINoM 30.12.2011 06:08

Цитата:

Сообщение от Nekromancer
ну например в веб ките можно проверить так:
window.WebKitAnimationEvent

Эм, это ведь класс, а не объект события.

Nekromancer 30.12.2011 06:09

devote,
такая фишка проканает только в вебкит к сожалению, так же как с HashChangeEvent

trikadin 30.12.2011 06:09

FINoM, ну, вообще, это была ирония, показывающая, что все остальные способы так же нестабильны/неточны/ресурсо-, энерго-, кодоёмки.

Nekromancer 30.12.2011 06:10

FINoM,
это инстанс для события - http://developer.apple.com/library/s...tionEvent.html

И даже если называть его как вы - классом, то это класс который создаёт экземпляры объекта события. Если его нет то и события не будет.

Nekromancer 30.12.2011 06:11

UPD:
Firefox:
window.AnimationEvent

FINoM 30.12.2011 06:11

Цитата:

Сообщение от trikadin
FINoM, ну, вообще, это была ирония, показывающая, что все остальные способы так же нестабильны/неточны/ресурсо-, энерго-, кодоёмки.

Этот WebkitAnimationEvent меня еще больше ввел в ступор.

Nekromancer 30.12.2011 06:14

В общем виде выглядит как то так:
if(window.AnimationEvent || 'onanimationend' in document.body || document.body.onanimationend === null){
//oh yeah..
}else if(window.VendorAnimationEvent){
// oh.. not so bad
}else {
//fuck, no..
}


document.body меня на что то другое :)

FINoM 30.12.2011 06:17

Nekromancer, ок, спасибо попробую.
Какие еще мобильные браузеры могут быть? IE, Opera, Mozilla?

trikadin 30.12.2011 06:19

Nekromancer, ну тогда уж так:

if(window.AnimationEvent || 'onanimationend' in document.body || document.body.onanimationend === null){
//oh yeah..
}else if(window.VendorAnimationEvent){
// oh.. not so bad
}else if (true) {
//fuck, no..
} else {
//oh, shi...
}

FINoM 30.12.2011 06:19

trikadin, какой-то юмор у тебя непонятный

Nekromancer 30.12.2011 06:20

FINoM,
IE мёртвый на мобилах ещё. Dolphin и всё такое вроде как тоже WebKit.
Наверно есть ещё всякие PSP/Blackberry браузеры :)

FINoM 30.12.2011 06:20

Цитата:

Сообщение от Nekromancer
PSP/Blackberry

Надеюсь, что они тоже на вебките.

devote 30.12.2011 06:20

} else {
// panic ...
}

Livaanderiamarum 30.12.2011 13:06

if(window.AnimationEvent || 'onanimationend' in document.body || document.body.onanimationend === null){
//oh yeah..
}else if(window.VendorAnimationEvent){
// oh.. not so bad
}else if (true) {
//fuck, no..
} else {
var t = 'FFFFFFFFFFFUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU'
document.write(t)
alert(t)
}

trikadin 30.12.2011 15:57

Цитата:

Сообщение от FINoM
trikadin, какой-то юмор у тебя непонятный

Ничего удивительного, шесть утра, ночь без сна... Хотя вон devote оценил.

FINoM 30.12.2011 16:33

trikadin, шутка сугубо программистическая, пацаны не поймут.


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