В случае, если кто-то сталкивается с этим, вот что я в итоге сделал (спасибо, @Lynyrd!)
// transition names (found in Modernizr)
let transEndEventNames = {
'WebkitTransition': 'webkitTransitionEnd', // Saf 6, Android Browser
'MozTransition': 'transitionend', // only for FF < 15
'transition': 'transitionend', // IE10, Opera, Chrome, FF 15+, Saf 7+
};
Я использую React, поэтому я добавил прослушиватели событий в useEffect, чтобы они автоматически добавлялись если снова будет загружен foodList и т. д. c.
// add & remove event listeners for transition end
useEffect(() => {
foodList.forEach((item, index) => {
if (!document.getElementById(index)) return;
document
.getElementById(index)
.addEventListener(
transEndEventNames.WebkitTransition,
handleTransitionEnd
);
document
.getElementById(index)
.addEventListener(
transEndEventNames.MozTransition,
handleTransitionEnd
);
document
.getElementById(index)
.addEventListener(transEndEventNames.transition, handleTransitionEnd);
});
return () => {
foodList.forEach((item, index) => {
if (!document.getElementById(index)) return;
document
.getElementById(index)
.removeEventListener(
transEndEventNames.WebkitTransition,
handleTransitionEnd
);
document
.getElementById(index)
.removeEventListener(
transEndEventNames.MozTransition,
handleTransitionEnd
);
document
.getElementById(index)
.removeEventListener(
transEndEventNames.transition,
handleTransitionEnd
);
});
};
}, [foodList]);
Я решил не пытаться добавить только один прослушиватель событий в зависимости от текущего браузера, но это также возможно. Имейте в виду, что этот слушатель срабатывает при каждом переходе. В результате записи моей таблицы были удалены, когда кто-то завис над элементом (который вызвал всплывающую подсказку). Так что не забудьте отфильтровать:
function handleTransitionEnd(event) {
// only delete element for transform transition
if (!(event.propertyName === 'transform')) return;
let newState = foodList.slice();
newState.splice(event.target.id, 1);
setFoodList(newState);
}
В моем случае это довольно просто, потому что у меня есть только один переход "transform" для элемента. Кроме того, я понятия не имею, если количество eventListeners становится проблемой производительности для больших таблиц. Функция setTimeout () теперь вообще не нужна, в deleteFood () я теперь только запускаю анимацию и удаляю элемент из моей базы данных:
function DeleteFood(index) {
// animate
document.getElementById(index).style.transform = 'translate(500px, 0)';
// delete from airtable
foodList[index].destroy();
}