Matthias Apsel: Zusammenfassung für längere Artikel

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

--
Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.

  1. Wenn ich das richtig verstanden habe, wird für jede Domain ein eigener localStorage angelegt, was ja auch sinnvoll ist. Nicht getestet habe ich, ob z.B. example.com und www.example.com verschiedene Domains sind. ↩︎

  2. DRY ↩︎

  1. 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.

    1. Hallo dedlfix,

      Ein Namensraum zeichnet sich zum Beispiel durch einen eindeutigen Präfix aus.

      Hab ich ja: „details-“ ;-)

      Bis demnächst
      Matthias

      --
      Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
      1. Hej Matthias,

        für IE, Edge und Opera Mini gibt es ein Polyfill.

        Aber das kennst du wahrscheinlich schon?

        Marc

        1. 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

          --
          Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
          1. 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...

            1. Hallo,

              weil ich die Maus suche...

              PSST: direkt neben deiner Tastatur... :p

              Gruß
              Kalk

            2. 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

              --
              Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
              1. 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

                1. 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

                  --
                  Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
                  1. 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.

                    Bis demnächst
                    Matthias

                    --
                    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
                    1. Hej Matthias,

                      Vorschlag (nicht probiert): gib doch mal die vorgesehene Rolle explizit an!

                      <summary role="button">

                      Was passiert dann?

                      Marc

                      1. 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

                        --
                        Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
                        1. 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

                          --
                          Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
                          1. 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

                            1. 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

                              • Safari
                              • Firefox
                              • Chrome (beim zweiten Versuch - häh?)

                              Marc

                          2. 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

                            1. 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

                              --
                              Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
              2. Hej Matthias,

                habe mal in Deinen Code-Beispielen gestöbert - der hier ist mein Liebling: :-D

                Marc