Кто-нибудь там нашел простой способ определить, поддерживает ли браузер событие перехода или нет в vanillaJs, особенно таким образом, который действительно работает во всех основных браузерах?: (
Я нашел эту неотвеченную тему здесь: Тест для поддержки событий перехода в Firefox и довольно много практически работающих хаков.
В настоящий момент я добавляю сборщиков событий во все префиксы поставщиков, и это работает (хотя я считаю, что это отвратительный подход, который причиняет мне боль каждый раз, когда я смотрю на него). Но IE8 и IE9 вообще не поддерживают его, поэтому мне нужно обнаружить эти два и рассматривать их отдельно.
Я бы предпочел сделать это без взлома браузера и, безусловно, без огромных библиотек/фреймворков, таких как jQuery
Я сделал фрагмент jsfiddler, который иллюстрирует мою проблему. Появляется кнопка, которая вызывает диалог. Когда диалог удаляется щелчком по закрытию, он переходит в верхнюю и непрозрачную, а после завершения перехода предполагается, что он отображается = none. Но если переход никогда не запускается (как в IE8 и IE9), диалог никогда не удаляется, заставляя его закрывать кнопку диалога show, уничтожая UX. Если бы я мог обнаружить, когда переход не работает, я мог бы просто установить display = none при закрытии для этих браузеров.
window.listenersSet = false;
window.dialogShouldBeVisible = false;
window.showMyDialog = function () {
var myDialog = document.getElementById('dialog'),
myClose = document.getElementById('close');
if (!listenersSet) {
if (!window.addEventListener) { // IE8 has no addEventListener
myclose.attachEvent('onclick', function () {
hideMyDialog();
});
} else {
myClose.addEventListener('click', function () {
hideMyDialog()
});
['webkitTransitionEnd','oTransitionEnd', 'otransitionend', 'transitionend'].forEach(function (eventName) {
myDialog.addEventListener(eventName, function (e) {
if (e.target === myDialog && e.propertyName === 'top') { // only do trigger if it is the top transition of the modalDialog that has ended
if (!dialogShouldBeVisible) {
myDialog.style.display = 'none';
e.stopPropagation();
}
}
});
});
}
listenersSet = true;
}
myDialog.style.display = 'block';
myDialog.style.top = '15px';
myDialog.style.opacity = '1';
dialogShouldBeVisible = true;
}
window.hideMyDialog = function () {
var myDialog = document.getElementById('dialog'),
myClose = document.getElementById('close');
myDialog.style.top = '-5%';
myDialog.style.opacity = '0.1';
dialogShouldBeVisible = false;
}
Он работает в Opera, Firefox, Chrome и IE10, но не в IE8 и IE9 (afaik)
Если бы я плохо описал мою проблему, сообщите мне, и я постараюсь сделать лучшую работу!:)