JS - Warum funktioniert der Button nicht Richtig?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Das ständige Überschreiben sämtlicher Kindknoten ist ein unnötiger Aufwand, zumal dadurch auch immer die Event Handler neu gebunden werden müssen.

Die font-Tags können allesamt aus dem Dokument entfernt werden, denn sie gehören nicht zum Standard. Du kannst sie durch span-Tags ersetzen.

Des Weiteren würde sich ein button-Element semantisch doch viel besser eignen als ein Paragraph. Das visuelle Erscheinungsbild kann man mit CSS überschreiben.

<div>Mines: <span id="minesCounter">0</span></div>
<div>
  <button class="button" id="buyMineButton" onclick="buyMine()" type="button">Buy mine Cost: <span id="minesPrice">1</span></button>
</div>

Die Elemente, die du immer wieder benötigst, würde ich global zwischenspeichern. So müssen sie nicht ständig neu im DOM gesucht werden. Ebenso brauchst du kein innerHTML-Property nutzen, wenn du stets nur Textknoten ändern möchtest.

const buyMineButton = document.getElementById("buyMineButton");
const minesPriceElement = document.getElementById("minesPrice");
let canBuy = true;

function refreshScreen() {
  minesCounter.textContent = mines;

  if (money < minesPrice) {
    buyMineButton.setAttribute("class", "button");
    canBuy = false;
  }
  else {
    buyMineButton.setAttribute("class", "buttonGreen");
    canBuy = true;
  }
  minesPriceElement.textContent = minesPrice;
}

Eine boolsche Variable kann als Kontrolleur dienen, ob der Nutzer derzeit Minen kaufen kann oder nicht. Folglich muss noch eine Zustandsabfrage in buyMine integriert werden.

Zu guter Letzt tut sich für mich die Frage auf, wozu du einen Timer (setInterval) startest. Für die Zustandsänderungen ist doch der Button zuständig. So lange der nicht betätigt wird, ändert sich auch nichts. Das heißt, die refreshScreen-Funktion könnte genauso gut am Ende von buyMine aufgerufen werden. So muss das DOM nur dann geändert werden, wenn es auch eine tatsächliche Änderung gibt.