Zusammenfassung für längere Artikel
Matthias Apsel
- html
- javascript
Hallo alle,
ich habe @marctrix’ Idee aufgegriffen und durch lokale Speicherung erweitert.
Dazu habe ich als erstes den details-Elementen noch 2 Attribute verpasst, denn sicher wird es mehrere Artikel in der Domain geben[1] und dass es verschiedene Zusammenfassungen geben kann, hat Marc bereits in seinem Beispiel gezeigt.
<article aria-describedby="article-description" id="12345">
<details id="article-description" open data-for="12345" data-type="description">
<details data-for="12345" data-type="easy-speech">
Das details
-Element sollte ein for
-Attribut haben dürfen. Was meinen die Experten?
Mein Skript sieht so aus:
function safe_changes(el) {
var item = "details-" + el.getAttribute("data-for") + "-" + el.getAttribute("data-type");
localStorage.setItem(item, el.hasAttribute("open") ? "false" : "true");
}
var details = document.querySelectorAll("details[data-for][data-type]");
for (var i = 0; i < details.length; i++) {
var item = "details-" + details[i].getAttribute("data-for") + "-" + details[i].getAttribute("data-type");
if (localStorage.getItem(item) == null) {
localStorage.setItem(item, details[i].hasAttribute("open") ? "true" : "false");
}
else {
localStorage.getItem(item) == "true" ? details[i].setAttribute("open","true") : details[i].removeAttribute("open");
}
details[i].addEventListener("click", function(){safe_changes(this)});
}
Was lässt sich hier verbessern? Zum Beispiel würde ich gern vermeiden, mich in Bezug auf item
zu wiederholen.[2]
Sind Prüfungen der Browserunstützung für querySelectorAll
und localStorage
notwendig? Imo nein, praktisch alle Browser verstehen das. Der IE, der das details
-Element nicht kennt, verhält sich ebenfalls unauffällig.
Bis demnächst
Matthias
Tach!
Ja, Subdomains verwenden unterschiedliche Bereiche.
localStorage.setItem(item, el.hasAttribute("open") ? "false" : "true");
Je nach Umfang der Daten, die im localStorage landen, lohnt es sich über die Simulation von Namensräumen nachzudenken. Man kann ja für Keys und Values nur Strings nehmen. Deshalb muss man bei der Benennung der Keys ansetzen. Ein Namensraum zeichnet sich zum Beispiel durch einen eindeutigen Präfix aus. Alternativ ist der gesamte Key der Namensraum und die Daten hängen in einer serialisierten JSON-Struktur. Hat beides seine Vor- und Nachteile. Etablierter scheint mir die Präfix-Methode zu sein.
dedlfix.
Hallo dedlfix,
Ein Namensraum zeichnet sich zum Beispiel durch einen eindeutigen Präfix aus.
Hab ich ja: „details-“ ;-)
Bis demnächst
Matthias
Hej Matthias,
für IE, Edge und Opera Mini gibt es ein Polyfill.
Aber das kennst du wahrscheinlich schon?
Marc
Hallo marctrix,
für IE, Edge und Opera Mini gibt es ein Polyfill.
Aber das kennst du wahrscheinlich schon?
Ja.
Die Frage ist tatsächlich, ob man das einsetzen sollte. Es geht schließlich lediglich Komfort verloren.
Btw. Wie du mir, so ich dir. Wenn du das in deinem Buch verwenden möchtest, darfst du das selbstverständlich tun. Ohne Namensnennung. ;-)
Bis demnächst
Matthias
Hej Matthias,
Btw. Wie du mir, so ich dir. Wenn du das in deinem Buch verwenden möchtest, darfst du das selbstverständlich tun. Ohne Namensnennung. ;-)
Ich würde nicht gerne den ganzen Code abdrucken, aber darauf verweisen - hast du was online (Codepen oder im Wiki hier)?
Da das Buch gedruckt wird, wäre eine kurze URL praktisch...
Marc
PS: War eben auf Deiner Brückentage-Seite. Den mouseover-Effekt bei Bildern finde ich sehr hübsch, mir wird aber - selbst bei den kleinen, ganz schwummerig davon. Insbesondere, wenn ich aus Versehen darüber fahre, weil ich die Maus suche...
Hallo,
weil ich die Maus suche...
PSST: direkt neben deiner Tastatur... :p
Gruß
Kalk
Hallo marctrix,
hast du was online (Codepen oder im Wiki hier)?
Sowohl [als auch](https://wiki.selfhtml.org/wiki/JavaScript/Anwendung und Praxis/Zusammenfassung_f%C3%BCr_l%C3%A4ngere_Artikel). Wobei das im Wiki noch sehr unvollständig ist. Aber es kommen noch ausführliche Erläuterungen dazu.
PS: War eben auf Deiner Brückentage-Seite. Den mouseover-Effekt bei Bildern finde ich sehr hübsch, mir wird aber - selbst bei den kleinen, ganz schwummerig davon. Insbesondere, wenn ich aus Versehen darüber fahre, weil ich die Maus suche...
Hm. Danke für die Rückmeldung. Vielleicht sollte ich eine kleine Verzögerung einbauen.
Bis demnächst
Matthias
Hej Matthias,
Hallo marctrix,
hast du was online (Codepen oder im Wiki hier)?
Sowohl [als auch](https://wiki.selfhtml.org/wiki/JavaScript/Anwendung und Praxis/Zusammenfassung_f%C3%BCr_l%C3%A4ngere_Artikel).
Potzblitz!
PS: War eben auf Deiner Brückentage-Seite. Den mouseover-Effekt bei Bildern finde ich sehr hübsch, mir wird aber ganz schwummerig davon.
Hm. Danke für die Rückmeldung. Vielleicht sollte ich eine kleine Verzögerung einbauen.
Könnte es noch schlimmer machen - in meinem Fall ist die Überraschung wohl ein Teil des Problems. Vielleicht bin ich ja eine Ausnahme. Mit einer Einzelmeldung kann man ja nicht viel anfangen. Generell habe ich damit übrigens wenig Probleme - sowohl die iPhone-Effekte, als auch 3d-Filme vertrage ich ohne Probleme. - Ich habe auch sehr große Monitore und sitze dicht davor...
Marc
Hallo marctrix,
[als auch](https://wiki.selfhtml.org/wiki/JavaScript/Anwendung und Praxis/Zusammenfassung_f%C3%BCr_l%C3%A4ngere_Artikel).
[Fertig](https://wiki.selfhtml.org/wiki/JavaScript/Anwendung und Praxis/Zusammenfassung_f%C3%BCr_l%C3%A4ngere_Artikel).
Fertig? – Nicht fertig.
Detailselemente sind tastaturbedienbar. Sie lassen sich (im Firefox) über die Enter- oder die Leertaste aus- bzw. einklappen. Im JS wird bisher nur auf die Mausbedienung reagiert. Ein change-Handler feuert nicht. Was kann man tun?
Bis demnächst
Matthias
Hallo Matthias Apsel,
Detailselemente sind tastaturbedienbar. Sie lassen sich (im Firefox) über die Enter- oder die Leertaste aus- bzw. einklappen. Im JS wird bisher nur auf die Mausbedienung reagiert. Ein change-Handler feuert nicht. Was kann man tun?
Tastaturüberwachung scheint tricky zu sein.
event.key
wird nicht von allen Browsern unterstütztcharCode
, keyCode
, which
sind nicht standard und können unterschiedliche Werte liefernenter
und space
scheinen sie sich einig zu sein (Kapitel 3.3)Bis demnächst
Matthias
Hej Matthias,
Vorschlag (nicht probiert): gib doch mal die vorgesehene Rolle explizit an!
<summary role="button">
Was passiert dann?
Marc
Hallo marctrix,
Vorschlag (nicht probiert): gib doch mal die vorgesehene Rolle explizit an!
<summary role="button">
Ich hab den details-Elementen die button-Rolle gegeben. Und siehe da, das click-Event reagiert auf Änderungen mit der Tastatur.
Bis demnächst
Matthias
Hallo Matthias Apsel,
Vorschlag (nicht probiert): gib doch mal die vorgesehene Rolle explizit an!
<summary role="button">
Ich hab den details-Elementen die button-Rolle gegeben. Und siehe da, das click-Event reagiert auf Änderungen mit der Tastatur.
Ich bin verwirrt. Jetzt werden Änderungen per Tastatur auch gespeichert, ohne dass ich die Rolle angegeben hätte. Ich werde jetzt das Beispiel auch ins Wiki hochladen. Es wäre schön, wenn das Verhalten (insbesondere der Erfolg des Speicherns im LocalStorage) in einigen Browsern getestet werden könnte.
Bis demnächst
Matthias
Hej Matthias,
Vorschlag (nicht probiert): gib doch mal die vorgesehene Rolle explizit an!
<summary role="button">
Ich hab den details-Elementen die button-Rolle gegeben. Und siehe da, das click-Event reagiert auf Änderungen mit der Tastatur.
Ich bin verwirrt. Jetzt werden Änderungen per Tastatur auch gespeichert, ohne dass ich die Rolle angegeben hätte.
Das ist gut, denn die Rolle von details
sollte nicht button
sein, sondern group
.
Ich werde jetzt das Beispiel auch ins Wiki hochladen. Es wäre schön, wenn das Verhalten (insbesondere der Erfolg des Speicherns im LocalStorage) in einigen Browsern getestet werden könnte.
Wie muss ich da vorgehen? Aufklappen, Browser schließen und die Seite erneut aufrufen? - Mache ich mal.
Marc
Hej Matthias,
Ich werde jetzt das Beispiel auch ins Wiki hochladen. Es wäre schön, wenn das Verhalten (insbesondere der Erfolg des Speicherns im LocalStorage) in einigen Browsern getestet werden könnte.
Wie muss ich da vorgehen? Aufklappen, Browser schließen und die Seite erneut aufrufen? - Mache ich mal.
funktioniert bei mir in folgenden Browsern:
MacOS
Marc
Hallo Matthias,
ich würde das css noch um so etwas wie
summary { cursor:pointer; }
summary:hover { outline:1px dotted black; }
erweitern, damit der Mausbenutzer sieht, das da was ist.
Gruß
Jürgen
Hallo JürgenB,
ich würde das css noch um so etwas wie
summary { cursor:pointer; } summary:hover { outline:1px dotted black; }
gute Idee. Done ✔️
Bis demnächst
Matthias