javascript - 如何修复/解决 CSS3 Transitions 的 transitionend 事件的浏览器实现中的不一致?

标签 javascript events css opera css-transitions

我设置了一个 jsfiddle here以显示我注意到的一些不一致之处。

  • Opera 抛出“奖励”过渡事件供您躲避...
  • Firefox 应该是这样吧,还是很郁闷...
  • Chrome 不出所料伟大,甚至为我做出假设,如 event.target.style["margin-left"] 给出正确的值,而不是要求我使用event.target.style[event.propertyName.toCamelCase()]

我想知道最简洁的统一方法。谢谢。

最佳答案

不幸的是,考虑到浏览器实现 transitionend 事件的不同状态,最好的方法似乎是检查 event.propertyName REALLY 是您正在寻找的属性(property)。这可以通过根据已知的 objectstring 检查它来完成,其中包含应该转换的属性的映射。我目前使用的解决方案:

function transitionEndHandler(event) {
    if(
        (
            (event.propertyName in event.target.style) && 
            // BLESS CHROME'S HEART THIS IS ALL I NEED TO CHECK FOR THEM

            (event.target.style.cssText.indexOf(event.propertyName) !== -1) 
            // FIREFOX WILL PASS THIS CONDITION, AS IT DOESN'T THROW EVENTS FOR PROPERTIES YOU DIDN'T SPECIFICALLY BIND

        ) || 
        (
            (event.propertyName.replace(/-([a-z])/gi, function(s, group1) {
            // OPERA SURE DOESN'T WANT TO MAKE THIS EASY, IT WONT FIND A 'margin-left' in STYLE
            // SO I HAVE TO LOOK FOR 'marginLeft' INSTEAD THIS MAKES event.propertyName and event.target.style
            // ESSENTIALLY USELESS INSIDE THE TRANSITIONEND EVENT HANDLER
                    return group1.toUpperCase();
                }) in event.target.style) && 
            (event.target.style.cssText.indexOf(event.propertyName) !== -1)
            // AGAIN WE HAVE TO CHECK TO MAKE SURE WE ACTUALLY 'SET' THIS STYLE PROPERTY ON THE ELEMENT
            // AS OPERA THROWS AN TRANSITIONEND EVENT FOR opacity WHEN YOU SET marginLeft
        )
    ) {
        // THIS EVENT.PROPERTYNAME, IS ACTUALLY A PROPERTY I TRANSITIONED,
        // NOT JUST ANY PROPERTY THE BROWSER DECIDED IT WANTED TO TRANSITION FOR ME
    }
}

关于javascript - 如何修复/解决 CSS3 Transitions 的 transitionend 事件的浏览器实现中的不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8423221/

相关文章:

html - MDL中大屏和小屏的不同mdl-layout__drawer

javascript - Vert.x JavaScript unregisterHandler() 和 close() 未在 Java SockJS 处理程序中触发 BridgeEventType 事件

javascript - AWS IoT private.pem.key 不存在

javascript - angular 的 promise 是否具有误导性,因为它们并不总是被异步调用

java - 在java中制作我自己的事件的正确方法是什么

javascript - CSS 和 jQuery 的宽度不同

jquery - 如何在上传文件前隐藏名称输入字段

javascript - 使用nodejs方法socket.write将所有数据发送到哪里?

android - 想对我的应用程序进行卸载 :android

javascript - 在 jquery 中禁用绑定(bind)的点击事件