Я думаю, что большинство из вас знает, что вы не можете инициировать переход сразу после добавления элемента в DOM без запроса вычисленных стилей. Хорошо, я понял, и эта проблема как-то связана.Состояние гонки с переходами CSS и событием перехода - Не удается найти решение
Мне просто нужно полагаться на событие перехода JS для удаления элемента из DOM после завершения перехода (эффект постепенного уменьшения). Проблема в том, что добавление класса CSS и его удаление (без таймеров) не инициируют переход, поэтому событие никогда не запускается, позволяя элементу оставаться на DOM навсегда.
Я даже попытался использовать setTimeout (f, 0) и requestAnimationFrame (f), чтобы удалить класс после сложения и начать переход, но не повезло. Я даже комбинировал вызовы getComputedStyle для запуска перерисовки до и после добавления/удаления класса. Еще не повезло.
Например: http://jsfiddle.net/demian85/oprn9jzk/1/
var button = document.querySelector('button');
button.addEventListener('transitionend', function(e) { // this never gets called
console.log(e);
button.parentNode.removeChild(button);
});
button.classList.add('hover');
button.clientWidth;
button.classList.remove('hover');
только некрасиво решение, которое я нашел, чтобы использовать SetTimeout с, по меньшей мере, 50 мс задержки. Но мы используем тестовую среду, которая должна ждать 50 мс, прежде чем взаимодействовать с DOM, и это не является жизнеспособным решением.
Кто-нибудь знает, как я могу справиться с этой ситуацией? Почему нет какого-либо события перехода?
pd: проверено в Хром 39
Спасибо.
Допустимым примером может служить компонент с методами fadeIn() и fadeOut(). Если эти методы называются последовательно, прослушиватель событий никогда не будет вызван. – demian85
Нужно ли это действительно отображать переход или просто удалить элемент при удалении класса? –
Конечно, я хочу, чтобы переход произошел. Но я до сих пор не понимаю, что произойдет, если пользователь каким-то образом сможет вызвать эти вызовы менее чем за 50 мс ... Выполняется ли событие или нет? – demian85