У меня есть большой игровой проект, который использовал обширный jquery в своем коде.Некоторое время назад я убрал весь jquery и заменил его на чистый JS, но у меня были проблемы с заменой вызовов .animation для снарядов в игре.
Оказалось, что я должен заменить их переходами CSS, и игра должна была знать, когда переход был сделан, поэтому мне нужно было добавить обратный вызов к переходу.Все хорошо, за исключением случаев, когда я назначил новые значения местоположения для снаряда, переход был полностью пропущен и обратный вызов не был вызван.По какой-то безбожной причине он начал работать, если я поместил изменение в его позицию CSS в SetTimeout на 1 мс - и даже тогда иногда все равно пропускал переход.
Теперь это обычно работает, за исключением того, что примерно один раз из 10 будет воспроизводиться переход, но тогда обратный вызов не будет вызван.Я не знаю, почему settimeout помогает быть там, и я не знаю, почему обратный вызов иногда не работает.Кто-нибудь может помочь мне понять?
let tablehtml = '<div id="'+animid+'" style="position: absolute; left: ' + ammocoords.fromx + 'px; top: ' + ammocoords.fromy + 'px; background-image:url(\'graphics/' + ammographic.graphic + '\');background-repeat:no-repeat; background-position: ' + ammographic.xoffset + 'px ' + ammographic.yoffset + 'px; transition: left '+duration+'ms linear 0s, top '+duration+'ms linear 0s;"><img src="graphics/spacer.gif" width="32" height="32" /></div>';
document.getElementById('combateffects').innerHTML += tablehtml;
let animdiv = document.getElementById(animid);
animdiv.addEventListener("transitionend", function(event) {
FinishFirstAnimation();
}, false);
setTimeout(function() { Object.assign(animdiv.style, {left: ammocoords.tox+"px", top: ammocoords.toy+"px" }); }, 1); // THIS IS A TOTAL KLUDGE
// For some reason, the transition would not run if the 1ms pause was not there. It would skip to the end, and not
// fire the transitionend event. This should not be necessary.