javascript - 在 CSS 转换中启用 vendor 前缀会使回调触发两次

标签 javascript jquery callback css-transitions transitionend

我正在实现一个出色的解决方案(发现 here ),以便在使用 CSS 转换时使用回调函数a la jQuery

问题是,如果我使用 vendor 前缀,Chrome 至少会绑定(bind)两个事件:一个用于 webkitTransitionEnd,第二个用于 transitionend,当然,还会触发回调两次。这是我的代码:

jQuery("#main").one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(e) {
  console.log("POUM!");
});

我做错了什么吗?

最佳答案

你没有做错任何事。 Chrome 仅使用带前缀和不带前缀的版本。

有几个选项:

  1. 使用外部变量。

    var fired = false;
    jQuery("#main").one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(e) {
        if ( ! fired ) {
            fired = true;
            console.log("POUM!");
        }
    });
    
  2. 使用某种检测来获取transitionend的单个变量(下面使用Modernizr,并取自其 documentation ):

    var transitionend = (function(transition) {
         var transEndEventNames = {
             'WebkitTransition' : 'webkitTransitionEnd',// Saf 6, Android Browser
             'MozTransition'    : 'transitionend',      // only for FF < 15
             'transition'       : 'transitionend'       // IE10, Opera, Chrome, FF 15+, Saf 7+
        };
    
        return transEndEventNames[transition];
    })(Modernizr.prefixed('transition'));
    
    // then
    jQuery("#main").one(transitionend, function(e) {
        console.log("POUM!");
    });
    

注意:

Safari 6 似乎会触发 CSS 中设置的任何内容的 onload。所以,如果你有(假设所有前缀)

#main {
    width: 40px;
    height: 40px;
    transition: all 200ms;
}

Safari 将在加载时触发带有 widthheighttransitionend。有几种方法可以解决这个问题:

  • 使用更具体的转换属性(但如果您在 CSS 中设置它,它仍然会触发)
  • 在 javascript 中执行以下操作(这不是最漂亮的事情,但它应该照顾到这种边缘情况,并且在 Chrome 中仍然有效)fiddle

    var transitionProperty = 'background-color',
        startColor = jQuery("#main").on(transitionend, function(e) {
            var el = $(this);
            if ( transitionProperty === e.originalEvent.propertyName && el.css(transitionProperty) !== startColor ) {
                console.log("POUM!");
                // This is to make it only happen once.
                $(this).off(transitionend);
            }
        }).css(transitionProperty);
    

关于javascript - 在 CSS 转换中启用 vendor 前缀会使回调触发两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18106612/

相关文章:

javascript - Jquery的hoverIntent/hover函数支持触摸设备

javascript - Volusion 和 Nivo Slider - 无法使用 Nivo Slider 主题

javascript - jPicker改变颜色透明+获取对象

javascript - HTTP 请求回调未执行 - 为什么?

c++ - 如何将非静态成员函数作为回调传递?

javascript - 如何使用 React Router 设置仅激活一个链接以实现多个 url 状态?

javascript - 没有 JS 的 CSS 默认选择

Javascript 正在执行并显示

javascript - 调用鼠标悬停回调时的js语法错误

javascript - 如何在生产环境中处理 NVM?