Мне нужно специальное событие transitionend
-like, которое срабатывает один раз после завершения всех переходов или запускается немедленно, если в CSS не существует переходов.
Это то, что я нашел до сих пор:
(function($){
$.event.special.transitionsComplete = {
setup: function(data, namespaces, eventHandle){
var queue = [],
style = window.getComputedStyle(this, null),
computedProps = style.getPropertyValue('transition-property').split(', '),
computedDurations = style.getPropertyValue('transition-duration').split(', '),
$node = $(this);
// only count properties with duration higher than 0s
for(var i = 0; i < computedDurations.length; i++)
if(computedDurations[i] !== '0s')
queue.push(computedProps[i]);
// there are transitions
if(queue.length > 0){
$node.on('webkitTransitionEnd.x transitionend.x', function(e){
queue.splice(queue.indexOf(e.originalEvent.propertyName));
if(queue.length < 1)
$node.trigger('transitionsComplete');
});
// no transitions, fire (almost) immediately
}else{
setTimeout(function(){
$node.trigger('transitionsComplete');
}, 5);
}
},
teardown: function(namespaces){
$(this).off('.x');
}
};
})(jQuery);
Я сделал живой пример здесь.
Единственная проблема заключается в том, что он работает только в том случае, если сам элемент имеет свойства перехода, игнорируя переходы из дочерних элементов. Если я переключаю transitionsComplete
на transitionend
, то родительский и дочерний обработчики событий запускаются после завершения дочернего перехода. Есть ли какой-то способ или, возможно, лучший подход для определения того, происходит ли переход с ним или его детьми? Я бы хотел, чтобы я не проходил через детей вручную и, если возможно, проверял их свойства переходов. (В любом случае это не будет надежным, потому что даже если некоторые дети имеют переходы, это не значит, что они будут активны в этой точке)