btnQuestions war nur ein Hilfsbutton für mich zum Testen. Anscheinend ist es dir nicht gelungen, diesen Testcode auf dein Verhältnisse zu übertragen.
Ich war inzwischen nicht untätig, habe eine Testumgebung aufgebaut und einige Änderungen vorgenommen. Damit läuft der erste Teil der Animation jetzt ganz gut. Hier der geänderte Code:
function addListeners(countofquestions) {
function collectAnswers(callback, newCallback) {
for (let j = 0; j < answerBtns.length; j++) {
document.getElementById(j + 1).addEventListener('click', () => {
const answerNumber = document.getElementById(j + 1).getAttribute('id');
for (let j = 0; j < answerBtns.length; j++) {
document.getElementById(j + 1).style.cssText = 'opacity: .2; transition: opacity 1s linear';
}
document.getElementById(j + 1).style.cssText = 'opacity: 1; background-color: rgb(84, 146, 184)';
countPlayTime.style.cssText = 'opacity: .2; transition: opacity 1s linear';
givenAnswers.push(answerNumber);
callback(givenAnswers);
newCallback(i);
const realTrueNumber = new FormData();
realTrueNumber.append('id', i);
fetch('giveTrueNumbers.php', {
method: 'post',
body: realTrueNumber
}).then(truenumber => {
return truenumber.json();
}).then(truenumber => {
givenTrueNumbers.push(truenumber)
if (truenumber == answerNumber) {
correctAnswers.push('1');
}
});
i++;
pointerEventsOff();
const answerTxt = answerBtns[j].innerHTML;
stopTimer();
stopCTimer();
if (i <= countofquestions) {
// if (i <= 2) {
playpart.style.cssText = 'transform: rotateY(90deg); opacity: .2; transition: transform 1.5s 2s linear, opacity 1.5s 2s linear';
// playpart.addEventListener('transitionstart', function (event) {
// console.log('transitionstart', event);
// });
// playpart.addEventListener('transitionrun', function (event) {
// console.log('transitionrun', event);
// });
// Hier habe ich das addEventListener fuer "transitionend" geloescht
}
});
} // Ende der Schleife für das addEventListener fuer "click" auf eine Antwort
// und hier habe ich das addEventListener fuer "transitionend" wieder eingefuegt:
playpart.addEventListener('transitionend', function (event) {
if (event.target.id == 'playpart') {
console.log('transitionend', event);
const opacity = getComputedStyle(playpart).opacity;
console.log(opacity);
switch (opacity) {
case '0.2':
// Erste Phase beendet, jetzt neue Frage und Antworten lesen
countPlayTime.style.cssText = 'opacity: 1; transition: opacity 1s linear';
playpart.style.cssText = 'transform: rotateY(0); opacity: 1; transition: transform 1.5s linear, opacity 1s .5s linear';
makeQuestion();
resetTimer();
pointerEventsOn();
for (let j = 0; j < answerBtns.length; j++) {
document.getElementById(j + 1).style.cssText = 'opacity: 1; background-color: coral';
}
break;
case '1':
// Zweite Phase beendet, jetzt die nachfolgende Animation starten
break;
}
}
});
} // collectAnswers(callback, newCallback)
function afterGame() {
if (i == countofquestions) {
// if (i == 2) {
next.style.display = 'none';
noMoreQuestions.style.display = 'block';
stopTimer();
stopCTimer();
finalOverlay.style.cssText = 'display: grid';
finalOverlay.style.top = '-' + window.outerHeight + 'px';
setTimeout(function () {
finalOverlay.style.cssText = 'display: grid; top: 0; transition: top 3s ease-in';
},
1000);
}
} // afterGame()
}
Alles anzeigen
Ich habe auch heraus gefunden, warum Du ständig Events für die Buttons bekommen hast: Du hast für die Buttons ja auch die Opacity animiert. Für diese feuert auch das "transitionend". Und jetzt kommt das Eventbubbling ins Spiel: Fängt man das Event bei den Buttons nicht ab, bzw. ist dort dafür kein Eventlistener registriert, so steigt es wie eine Blase im Baum auf, erreicht dabei das div#playpart und feuert dort unseren Eventlistener. Lösung indem wir abfragen ob es sich auch um das #playpart handelt:
if (event.target.id == 'playpart') {
Ich mache mir bald ein wenig Vorwürfe, dass ich die Sache mit dem "transitionend" ins Spiel gebracht habe, denn es hat ja erst Mal alles durcheinander gebracht. Aber ich erinnere mich, dass dein Ziel bei dieser Sache ja vor allem das Lernen ist und da kann es nicht schaden, sich weiter mit den Listenern vertraut zu machen.