У меня есть элемент HTML, к которому я привязал событие webkitTransitionEnd.
function transEnd(event) {
alert( "Finished transition!" );
}
var node = document.getElementById('node');
node.addEventListener( 'webkitTransitionEnd', transEnd, false );
Затем я перехожу к изменению своих свойств слева и сверху CSS, например:
node.style.left = '400px';
node.style.top = '400px';
Это приводит к тому, что DIV плавно переходит в новое положение. Но, когда он заканчивается, появляются 2 окна предупреждений, в то время как я ожидал только одного в конце анимации. Когда я изменил свойство CSS left, я получил одно окно предупреждения, поэтому это означает, что два изменения стиля записываются как два отдельных события. Я хочу указать их как одно событие, как это сделать?
Я не могу использовать класс CSS для одновременного применения обоих стилей, потому что левые и верхние свойства CSS - это переменные, которые я буду знать только во время выполнения.
просто удалите событие:
var transEnd = function(event) {
event.target.removeEventListener("webkitTransitionEnd",transEnd);
};
он будет срабатывать для первого свойства, а не для других.
Проверьте событие propertyName
:
function transEnd(event) {
if (event.propertyName === "left") {
alert( "Finished transition!" );
}
}
var node = document.getElementById('node');
node.addEventListener( 'webkitTransitionEnd', transEnd, false );
Таким образом, он будет срабатывать только при завершении свойства "left". Это, вероятно, будет работать лучше всего, если оба свойства заданы одинаковой продолжительностью и задержкой. Кроме того, это будет работать, если вы измените только "левый" или оба, но не, если вы измените только "верх".
В качестве альтернативы вы можете использовать некоторые трюки таймера:
var transEnd = function anon(event) {
if (!anon.delay) {
anon.delay = true;
clearTimeout(anon.timer);
anon.timer = setTimeout(function () {
anon.delay = false;
}, 100);
alert( "Finished transition!" );
}
};
var node = document.getElementById('node');
node.addEventListener( 'webkitTransitionEnd', transEnd, false );
Это должно гарантировать, что ваш код будет работать не более 1 раз каждые 100 мс. Вы можете изменить задержку setTimeout в соответствии с вашими потребностями.
Если вы предпочитаете его в JQuery, попробуйте это. Обратите внимание, что существует параметр события для хранения объекта события и использования в соответствующей функции.
$("#divId").bind('oTransitionEnd transitionEnd webkitTransitionEnd', event, function() {
alert(event.propertyName)
});
с моей точки зрения ожидаемое поведение кода было бы
В последнее время я работал над чем-то похожим для менеджера переходов на страницы, управляемым таймингами CSS.
Это идея
// Returs the computed value of a CSS property on a DOM element
// el: DOM element
// styleName: CSS property name
function getStyleValue(el, styleName) {
// Not cross browser!
return window.getComputedStyle(el, null).getPropertyValue(styleName);
}
// The DOM element
var el = document.getElementById('el');
// Applies the transition
el.className = 'transition';
// Retrieves the number of transitions applied to the element
var transitionProperties = getStyleValue(el, '-webkit-transition-property');
var transitionCount = transitionProperties.split(',').length;
// Listener for the transitionEnd event
function eventListener(e) {
if (--transitionCount === 0) {
alert('Transition ended!');
el.removeEventListener('webkitTransitionEnd', eventListener);
}
}
el.addEventListener('webkitTransitionEnd', eventListener, false);
Здесь вы можете проверить эту реализацию или (проще) версия jQuery, оба работают только с Webkit
Если вы используете webkit, я предполагаю, что вы мобилизуете веб-приложение для межплатформенного доступа.
Если вы рассматривали абстрагирование доступа к кросс-платформе на уровне презентации веб-приложения?
Webkit не обеспечивает естественный внешний вид мобильных устройств, но здесь может помочь новая технология.
$("#divId").bind('transitionEnd', function(event) { alert(event.propertyName) });