Wenn du schon serverseitig die Unterscheidung triffst, warum lässt du dann nicht auch die Buttons per PHP generieren?
Das würde die Sache wirklich sehr viel einfacher machen. Tatsächlich habe ich mehrfach erwogen, das zu machen. Aber das wäre ein fauler Kompromiss bzw. eine Notlösung. Mit Php generiere ich eine semantisch korrekte Seite. Sie enthält alle notwendigen Funktionen. Diese Seite wird von Suchmaschinen, Blindenbrowsern, Textbrowsern, Screenreadern und Javasript-Verweigerern auch so gebraucht. Mit Javascript ergänze ich noch einige Funktionen für mehr Komfort. Buttons, die nur in Komfort-Variante einen Zweck haben, sollten auch nur dort existieren.
Es ist i.A. keine gute Idee, eine Klasse per className zu setzen oder zu entfernen; eine andere möglicherweise vorhandene Klasse wird damit mit überschrieben.
Das ist auch Sinn der Sache. Es gibt 4 mögliche Zustände: kein class-Attribut, class="offen", class="zu" und class="hi". Beim Anklicken des Buttons bzw. Links soll folgendes passieren: Wenn es vorher class="zu" war, soll es danach class="offen" sein. In allen anderen Fällen soll es danach class="zu" sein. Außerdem möchte ich Sachen, die nur in manchen Browsern funktionieren, nach Möglichkeit nicht verwenden. Im Internet Explorer funktioniert das laut https://wiki.selfhtml.org/wiki/JavaScript/DOM/Element/classList erst ab Version 10.
Das aria-expanded-Attribut kannte ich bisher nicht. Und in selfhtml steht dazu auch wenig brauchbares. Die von dir verlinkte Seite habe ich gleich wieder zu gemacht. Wenn mich mein Pc-Lautsprecher ungefragt anbrüllt, nachdem ich eine Seite öffne, mache ich sie wieder zu und besuche sie nicht wieder. Außerdem lerne ich neue Sachen sehr viel leichter, wenn ich sie auf Deutsch erklärt bekomme. Auch das hidden-Attribut kenne ich nicht, aber laut https://developer.mozilla.org/de/docs/Web/HTML/Globale_Attribute/hidden funktioniert es erst ab IE11. Dort habe ich zwar einiges darüber gelesen, wie es funktioniert (wenn es funktioniert), aber nicht was daran besser sein soll, als display:none;. Jedenfalls habe ich nicht vor, Workarrounds für die weit verbreiteten Browser ie7 bis ie10 zu bauen.