你没有做错什么。Chrome 只使用带前缀和不带前缀的版本。
有几个选项:
使用外部变量。
var fired = false;
jQuery("#main").one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(e) {
if ( ! fired ) {
fired = true;
console.log("POUM!");
}
});
使用某种检测来获取transitionend的单个变量(以下使用Modernizr,取自他们的文档):
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 似乎会触发onload
CSS 中设置的任何内容。所以,如果你有(假设所有前缀)
#main {
width: 40px;
height: 40px;
transition: all 200ms;
}
Safari 将触发transitionend
加载width
和height
加载。有几种方法可以解决这个问题:
- 使用更具体的过渡属性(但如果你在 CSS 中设置它,它仍然会触发)
在 javascript 中执行以下操作(这不是最漂亮的事情,但它应该处理这种边缘情况并且它仍然可以在 Chrome 中工作)小提琴
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);