2016-04-30 13 views
0

Meine Aufgabe: Hallo! Ich mache einen Auftrag in der Schule, wo ich Code in Javascript schreiben soll, um Sichtbarkeit für die Untermenüs zu aktivieren, die jeweils zu ihrem eigenen Topmenü in einer Navigationsleiste für eine Webseite gehören. Die Sichtbarkeit sollte standardmäßig ausgeblendet sein und sollte angezeigt werden, wenn auf ein Topmenü geklickt wird. Ich weiß, wie man die Sichtbarkeit für ein zu einem Topmenü gehörendes ONE-Untermenü umschaltet, aber meinen Code nicht für mehrere Elemente arbeiten lässt. Mein HTML-Code:Sichtbarkeit für mehrere Divs mit einer Funktion umschalten: Navigationsleiste

 <a class="left_top1" onclick = "toggle()">Opinion</a><br> 
      <div class="left_submenu_1" style="display: none;"> 
      <a class="left_sub1">Leaders</a><br> 
      <a class="left_sub1">Debates</a><br> 
      </div> 
<br> 
      <a class="left_top2" onclick = "toggle()">Economy</a><br> 
      <div class="left_submenu_2" style="display: none;"> 
      <a class="left_sub2">News</a><br> 
      <a class="left_sub2">Your Economy</a><br> 
      </div> 

Mein Problem: Die topmenus Ich spreche von sind "Opinion" und "Economy". Die Sichtbarkeit des div mit der Klasse "left_submenu_1" sollte umgeschaltet werden, wenn Sie auf das Topmenu "left_top1" klicken. Also sollte das visibilily des div mit der Klasse "left_submenu_2" umgeschaltet werden, wenn man auf das Topmenu "left_top2" klickt. Das versage ich. Mein Javascript-Code ist so weit:

function toggle() { 
    var e = document.querySelectorAll("div.left_submenu_1, div.left_submenu_2"); 
    for (var i=0; i < e.length; i++) { // I know this will enable/disable the visibility for ALL elements selected from the querySelectorAll, which should NOT happen 
    if(e[i].style.display == "none") { 
     e[i].style.display = "block"; 
    } else if(e[i].style.display == "block") { 
     e[i].style.display = "none"; 
    } 
    } 
} 

Wer weiß, wie ich dieses Problem lösen kann? Ich weiß, dass es in der for-Schleife Fehler gibt (wie ich daneben geschrieben habe), aber das ist das Beste, was ich für jetzt schaffen kann.

Bitte beachten Sie: Es ist NICHT erlaubt, jQuery zu verwenden oder die topmenus id: s anzugeben, da eine allgemeine Funktion verwendet werden soll, um die Sichtbarkeit zu ändern. Außerdem sollte der Code, der die Toggle-Funktion aktiviert, in Javascript ausgeführt werden.

Antwort

0

Ich würde es nähern, indem ich den Klassennamen des div, um gezeigt zu werden (oder versteckt) in die Funktion, um mit zu beginnen.

HTML

<a class="left_top1" onclick = "toggle('.left_submenu_1')">Opinion</a> 

Dann in der Funktion können Sie das Element greifen und schalten Sie es Anzeigezustand ist.

JavaScript

function toggle(qs) { 
    var e = document.querySelector(qs); 
    e.style.display = e.style.display === 'block' ? 'none' : 'block'; 
} 

Der e.style.display === 'block' ? 'none' : 'block' Teil sagt, ist, wenn die Elemente keiner zu blockieren, die Rück Zustand gleich anzuzeigen, andernfalls Block zurückzukehren.

Der Rückgabewert wird aufgrund der e.style.display = im Voraus als neuer Anzeigezustand des Elements festgelegt.

+0

Vielen Dank für Ihre Hilfe! Ich denke, Ihre Idee ist logisch und vernünftig und ich fühle mich wie ich es verstehe, zusammen mit Ihrer Erklärung. Leider funktioniert es nicht. Jetzt passiert nichts, wenn auf das Topmenü geklickt wird. Arbeitet querySelector wie eine Nodelist (wie document.getElementsByClassName und document.querySelectorAll), die Sie durchlaufen müssen, bevor Sie etwas "tun"? – Isus

+0

Nein, es gibt nur das erste Element mit diesem Selektor zurück, querySelectorAll gibt alle Elemente mit dem Selektor zurück. Hier ist ein funktionierender [jsfiddle] (https://jsfiddle.net/LskxwLur/), um es hoffentlich klarer zu machen. – spaceman

+0

Ok ich verstehe! Ich denke, der Fehler war in meinem Namen, warum nichts passiert ist, als ich auf das Topmenü geklickt habe. Danke für die weitere Erklärung! JFiddle machte es sehr deutlich. Alles funktioniert jetzt perfekt, vielen Dank! – Isus

0

Tring, um sie möglichst weniger Modifizierung funktioniert:
- verwenden onClick="toggle(this)" in die Anker-Tags
- wie ein bisschen anders Toggle-Funktion verwenden:

function toggle (el) { 
    var e = document.querySelectorAll('.' + el.className.replace('top', 'submenu_'))[0]; 
    e.style.display = e.style.display.match(/none/) ? '' : 'none'; 
} 

hoffe, es hilft, aber ich Ich muss Ihnen vorschlagen, einen kleinen Schritt vorwärts zu machen und nach event delegation zu suchen. Tschüss

Verwandte Themen