Webkit transitionEnd группировка событий

1

У меня есть элемент 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 - это переменные, которые я буду знать только во время выполнения.

Теги:
javascript-events
webkit

5 ответов

4

просто удалите событие:

var transEnd = function(event) {
   event.target.removeEventListener("webkitTransitionEnd",transEnd);
};

он будет срабатывать для первого свойства, а не для других.

4

Проверьте событие 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 в соответствии с вашими потребностями.

3

Если вы предпочитаете его в JQuery, попробуйте это. Обратите внимание, что существует параметр события для хранения объекта события и использования в соответствующей функции.

$("#divId").bind('oTransitionEnd transitionEnd webkitTransitionEnd', event, function() { 
    alert(event.propertyName) 
});
  • 0
    Событие должно быть передано в функцию, нет? Как ... $("#divId").bind('transitionEnd', function(event) { alert(event.propertyName) });
1

с моей точки зрения ожидаемое поведение кода было бы

  • запускает оповещение только после завершения последнего перехода
  • поддерживает переходы по любому свойству
  • поддержка 1, 2, много переходов без проблем

В последнее время я работал над чем-то похожим для менеджера переходов на страницы, управляемым таймингами 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

0

Если вы используете webkit, я предполагаю, что вы мобилизуете веб-приложение для межплатформенного доступа.

Если вы рассматривали абстрагирование доступа к кросс-платформе на уровне презентации веб-приложения?

Webkit не обеспечивает естественный внешний вид мобильных устройств, но здесь может помочь новая технология.

  • 0
    Нет, я в первую очередь ориентируюсь на Google Chrome. Прямо сейчас, я просто хочу, чтобы это работало там.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню