Gunnar Bittersmann: zugängliches Dropdown-Menü funzt net

Beitrag lesen

problematische Seite

@@Felix Riesterer

$("#hamburger-navigation ul").parent().prepend(
	$("<button>open</button>")
	.attr("aria-label", "open")
	.attr("title", "open")
	.click(function (e) {
		var open, $ul;

		$(e.target).parent().toggleClass("open");

		open = $(e.target).parent().hasClass("open");

		$(e.target)
		.html(open ? "close" : "open")
		.attr("aria-label", open ? "close" : "open")
		.attr("title", open ? "close" : "open");
	})
);

Wird es in Vanilla-JS ebenso kurz und iteriert es wirklich über alle gefundenen Elemente in der gleichen Art?

Ja, das wird es. Und ja, das tut es:

document.querySelectorAll("#hamburger-navigation ul").forEach(function (ulElement) {
	const buttonElement = document.createElement("button");
	buttonElement.innerText = "open";
	buttonElement.setAttribute("aria-label", "open");
	buttonElement.setAttribute("title", "open");

	buttonElement.addEventListener("click", function (event) {
		event.target.parentNode.classList.toggle("open");

		const open = event.target.parentNode.classList.contains("open");

		event.target.innerText = open ? "close" : "open";
		event.target.setAttribute("aria-label", open ? "close" : "open");
		event.target.setAttribute("title", open ? "close" : "open");	
	});

	ulElement.parentNode.insertBefore(buttonElement, ulElement);
});

Dass meine Zeilen länger sind als bei dir, kommt vor allem daher, dass ich sprechende Variablennamen verwendet habe: event statt e, buttonElement, ulElement.

Statt event.target lässt sich auch this verwenden. Ich hab das nur 1:1 so aus der Vorlage umgesetzt. Im jQuery auch schon $(this) statt $(e.target).

Übrigens: Das aria-label-Attribut macht keinen Sinn, wenn da dasselbe steht wie im Elementinhalt. Das title-Attribut macht keinen Sinn, auch wenn da etwas anderes drinstünde.

Und „iteriert es wirklich über alle gefundenen Elemente in der gleichen Art?“ legt nahe, dass du sowas im Sinn hast:

<nav id="hamburger-navigation">
	<div>
		<ul></ul>
	</div>
	<div>
		<ul></ul>
	</div>
</nav>

Das geht. Bei den div-Elementen wird die Klasse open gesetzt bzw. entfernt.

Hast du aber

<nav id="hamburger-navigation">
		<ul></ul>
		<ul></ul>
</nav>

dann fliegt dir das Zeug um die Ohren.

LLAP 🖖

--
“When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
1 64

zugängliches Dropdown-Menü funzt net

Matthias Scharwies
  • css
  • selfhtml-wiki
  1. 0
    Felix Riesterer
    1. 0
      Matthias Apsel
      1. 0
        Matthias Scharwies
        1. 0
          Matthias Apsel
          1. 0
            Matthias Apsel
            1. 0
              Felix Riesterer
              1. 0
                Matthias Apsel
                1. 0
                  Felix Riesterer
                  1. 0
                    Gunnar Bittersmann
                  2. 0
                    Matthias Apsel
                2. 0
                  Gunnar Bittersmann
        2. 0
          marctrix
          1. 0
            Matthias Scharwies
            1. 0
              marctrix
      2. 0
        Felix Riesterer
        1. 0
          Matthias Apsel
          1. 0
            Felix Riesterer
            1. 0
              Matthias Apsel
              • css
              • usability
              1. 0
                Camping_RIDER
        2. 1

          meine Lösung des Problems

          Camping_RIDER
          1. 0
            Gunnar Bittersmann
            1. 0
              Camping_RIDER
              1. 0
                Gunnar Bittersmann
                1. 1
                  Camping_RIDER
          2. 0
            MudGuard
            1. 0
              Camping_RIDER
  2. 1
    Gunnar Bittersmann
  3. 0
    Felix Riesterer
    1. 1
      Gunnar Bittersmann
      • javascript
      • selfhtml-wiki
      1. 0
        Felix Riesterer
        1. 1
          Gunnar Bittersmann
          • javascript
          1. 1
            Matthias Scharwies
            1. 0
              Gunnar Bittersmann
              1. 4
                1unitedpower
          2. 0
            Felix Riesterer
            1. 0
              Gunnar Bittersmann
              1. 2
                Gunnar Bittersmann
                1. 0
                  Gunnar Bittersmann
                2. 1
                  MudGuard
            2. 0
              Gunnar Bittersmann
              • usability
              • ux
              1. 1

                Doppelmoral? Konzeptproblem?

                Camping_RIDER
                1. 0
                  Gunnar Bittersmann
                  1. 0
                    Gunnar Bittersmann
                    1. 2
                      Mitleser
                      1. 0
                        Gunnar Bittersmann
                        1. 2
                          Mitleser
                          1. 0
                            Gunnar Bittersmann
                            1. 0
                              Mitleser
        2. 1
          Camping_RIDER
          1. 0
            Felix Riesterer
            1. 0
              Camping_RIDER
  4. 0
    Felix Riesterer
    1. 0
      Camping_RIDER
  5. 0

    und mein Versuch einer Lösung

    JürgenB
    1. 0
      Gunnar Bittersmann
      1. 0
        JürgenB
        1. 0
          Gunnar Bittersmann
          1. 0
            JürgenB
      2. 0
        Felix Riesterer
    2. 0
      Camping_RIDER
      1. 0
        JürgenB
  6. 0

    zugängliches Dropdown-Menü -vorläufiges Fazit

    Matthias Scharwies
    1. 0
      Gunnar Bittersmann