Daniel Thoma: aufklappbares CSS Menü

Beitrag lesen

Hallo Sabrina,

Ja die gibt es, da ich das öffters gefragt werde, werde ich den Artikel wohl irgendwann mal ergänzen. Ich kopier Dir hier mal die letzte Antwort:

Bewerkstelligen lässt sich das Ganze durch eine Änderung an treeMenu_handleClick.
Die Funktion muss, wenn sie einen Menüeintrag öffnet, alle anderen Menüeinträge des selben Teilmenüs schließen, indem sie auf event.currenTarget.parentNode.childNodes zugreift.

Ich habe dieses verhalten in Abhängigkeit von einer CSS-Klasse implementiert. Gibt man bei einer Liste (ul/ol) die Klasse treeMenu_openSingleNode an, kann in diesem Teilmenü nur noch ein Eintrag geöffnet werden.
Die Funktion treeMenu_init habe ich mit einem dritten Parameter versehen.
Wenn man diesen auf true setzt, setzt die Funktion die Klasse automatisch für das ganze Menü.

Die angepassten Funktionen: (Änderungen markiert)

function treeMenu_init(menu, data, openSingleNode) {
  var array = new Array(0);
  if(data != null && data != "") {
    array = data.match(/\d+/g);
  }
  var items = menu.getElementsByTagName("li");
  for(var i = 0; i < items.length; i++) {
    items[i].onclick = treeMenu_handleClick;
    if(!treeMenu_contains(treeMenu_getClasses(items[i]), "treeMenu_opened")
        && items[i].getElementsByTagName("ul").length
          + items[i].getElementsByTagName("ol").length > 0) {
      var classes = treeMenu_getClasses(items[i]);
      if(array.length > 0 && array[0] == i) {
        classes.push("treeMenu_opened")
      }
      else {
        classes.push("treeMenu_closed")
      }
      items[i].className = classes.join(" ");
    }
    if(array.length > 0 && array[0] == i) {
      array.shift();
    }
// ANFANG
    if(openSingleNode) {
      var classes = treeMenu_getClasses(items[i].parentNode);
      if(!treeMenu_contains(classes, "treeMenu_openSingleNode")) {
        classes.push("treeMenu_openSingleNode");
        items[i].parentNode.className = classes.join(" ");
      }
    }
// ENDE
  }
}

function treeMenu_handleClick(event) {
  if(event == null) { //Workaround für die fehlenden DOM Eigenschaften im IE
    event = window.event;
    event.currentTarget = event.srcElement;
    while(event.currentTarget.nodeName.toLowerCase() != "li") {
      event.currentTarget = event.currentTarget.parentNode;
    }
    event.cancelBubble = true;
  }
  else {
    event.stopPropagation();
  }
  var array = treeMenu_getClasses(event.currentTarget);

// ANFANG

if(treeMenu_contains(treeMenu_getClasses(event.currentTarget.parentNode), "treeMenu_openSingleNode") && treeMenu_contains(array, "treeMenu_closed")) {
    for(var i = 0; i < event.currentTarget.parentNode.childNodes.length; i++) {
      var element = event.currentTarget.parentNode.childNodes[i];
      if(element.nodeName.toLowerCase() == "li" && element != event.currentTarget){
        var array2 = treeMenu_getClasses(element);
        for(var j = 0; j < array2.length; j++) {
          if(array2[j] == "treeMenu_opened") {
            array2[j] = "treeMenu_closed";
          }
        }
        element.className = array2.join(" ");
      }
    }
  }
// ENDE
  for(var i = 0; i < array.length; i++) {
    if(array[i] == "treeMenu_closed") {
      array[i] = "treeMenu_opened";
    }
    else if(array[i] == "treeMenu_opened") {
      array[i] = "treeMenu_closed"
    }
  }
  event.currentTarget.className = array.join(" ");
}

Grüße

Daniel