Felix Riesterer: In welcher Reihenfolge werden DOMContentLoaded abgearbeitet?

Beitrag lesen

problematische Seite

Liebe Linuchs,

in Deinem Code lese ich Unsinn.

// alle Audios auf halbe Lautstaerke
for ( let i=0; i<document.querySelectorAll( "audio" ).length; i++ ) document.querySelectorAll( "audio" )[i].volume = 0.2;

Warum bildest Du zwei unterschiedliche Ergebnismengen, anstatt mit nur einer zu arbeiten? Unterschiedlich soll heißen, dass die Arrays nicht ein und das selbe Objekt sind, auch wenn ihre Inhalte (vielleicht!) identisch sind. Also schreibe das in Zukunft so:

document.querySelectorAll("audio").forEach(function (audio) {
  audio.volume = 0.2;
});

Mit Pfeilfunktionen schreibt sich das noch besser:

document.querySelectorAll("audio").forEach(audio => audio.volume = 0.2);

Vom Server geholt, wird jetzt (bei mir) die Tonart (C ist Standard) nicht gesetzt, das Ergebnis sieht so aus:

Keine Ahnung, was da genau nicht tut. Aber das verwendete DOM ist in meinen Augen nicht sinnvoll gewählt. Du willst Akkordsymbole anzeigen, die je nach Tonart dynamischen Inhalt bekommen. Dazu verwendest Du ein solches Markup:

<div class=text style="font-size:180%;line-height:160%">
 <!-- (To)nika (Do)minante (Su)bdominante (Su7)-->
 <p class="akkorde"><l>1</l>
  Wa-(To)rum bist du gekommen, wenn (Do)du schon wieder gehst? <br>
  Du hast mein Herz genommen und (To)wirfst es wieder weg!<br>
  |: Ich (Su)bin kein Bajazzo, bin (To)auch ein Mensch wie du <br>
  und (Do)leise schlägt mein Herz dir (To)zu. :|</p>

Der Validator ist jedenfalls überhaupt nicht zufrieden. Das solltest Du unbedingt in Ordnung bringen, bevor Du weiter nach Fehlfunktionen suchst!

Meiner Ansicht nach sollte das Markup eher so sein:

<ul class="lyrics">
  <li>
    <div>
      Wa-<span class="to"></span>rum bist du gekommen, wenn
      <span class="do"></span>du schon wieder gehst?
    </div>
    <div>
      Du hast mein Herz genommen und
      <span class="to"></span>wirfst es wieder weg!
    </div>
    ...
  </li>
</ul>

Die Klasse lyrics beschreibt, dass es sich um einen Liedtext handelt. Die Liste beschreibt die Strophen und ihre Reihenfolge. In CSS kann man also .lyrics li als Selektor für eine Strophe verwenden.

Die jeweilige Liedzeile soll als Block-Element dargestellt werden, weil Du an ihrem Ende einen Zeilenumbruch notierst. Das kannst Du auch mit einem passenden Kindelement von li erreichen. Meine Wahl mit einem div ist vielleicht nicht die beste, aber es ist ein block-level element, das man hier verwenden könnte.

Die eigentlichen Akkordsymbole werden in den leeren span-Elementen geregelt. Ihr Inhalt soll ja mit JavaScript beschrieben werden, deshalb habe ich sie inhaltsleer notiert. Über ihre Klasse kann man dann den Inhalt hineinschreiben. Der passende Selektor wäre .lyrics .to für Tonika-Akkorde - der Rest eben analog.

Mit sinnvollerem Markup sollte auch das Hineinschreiben der Akkorde besser gelingen. Wenn es dann noch immer scheitert, obwohl das Markup vom Validator gesegnet wird und die JavaScript-Konsole keine Fehler wirft, dann kann man fragen, ob vielleicht DOMContentLoaded daran Schuld haben könnte, zu dem @Robert B. korrekt anmerkt, dass man das an das document-Objekt binden muss.

Liebe Grüße

Felix Riesterer