有没有人找到一种简单的方法来检测浏览器是否支持 vanillaJs 中的 transitionend 事件,尤其是在所有主要浏览器中都可以使用的方式?:(
我在这里找到了这个未回答的线程:Test for transitionend event support in Firefox,以及很多几乎可以工作的黑客。
现在,我正在向所有供应商前缀批量添加事件侦听器,并且效果不错(尽管我认为这是一种可怕的方法,每次看到它都会伤害我的眼睛)。但是IE8和IE9根本不支持,所以我需要检测这两个,分别对待。
我宁愿在没有浏览器嗅探的情况下执行此操作,并且绝对没有像 jQuery 这样的大型库/框架
我制作了一个 jsfiddler 片段来说明我的问题。有一个生成对话框的按钮。当通过单击关闭删除对话框时,它会以顶部和不透明度进行转换,并且在结束转换后它应该显示=无。但是如果从不触发transitionend(如在IE8和IE9中),则永远不会删除对话框,使其覆盖显示对话框按钮,破坏用户体验。如果我可以检测到 transitionend 何时不工作,我可以在关闭这些浏览器时设置 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)
如果我在解释我的问题时做得不好,请告诉我,我会努力做得更好!:)