2013-02-07 15 views
5

Po pierwsze, chciałbym użyć tylko natywnego JavaScript, aby wykonać to zadanie.Jak symulować aktywację za pomocą skryptów JavaScript przy keydown?

Załóżmy, że mam utworzyć niestandardowe menu rozwijane, a kod HTML wygląda mniej więcej tak.

<div class="dropdown"> 
    <span class="dropdown-label" style="display:block">Select a thing</span> 
    <ul class="dropdownItemContainer"> 
    <li>Item 1</li> 
    <li>Item 2</li> 
    <li>Item 3</li> 
    <li>Item 4</li> 
    <li>Item 5</li> 
    <li>Item 6</li> 
    </ul> 
</div> 

W pliku CSS Mam coś podobnego do tego:

ul.dropdownItemContainer li:hover { 
    background-color: #FF0000; 
} 

Tak, tam naprawdę nie dropdownish zachowanie, ale to nie o to chodzi dyskusji rzeczywiście. Problem polega na tym, że nie mogłem wymyślić przyzwoitego sposobu włączenia kontroli klawiatury dla tego menu. Pożądany wynik jest następujący: naciskam klawisz w dół, a pierwsza opcja jest podświetlona; Ponownie go wciskam, a druga opcja jest podświetlona i tak dalej.

Jedyną opcją, którą widzę w tym momencie (właśnie zaczęłam studiować JS) jest pobranie wszystkich dzieci ul, wstawienie do tablicy i przypisanie znaczników koloru tła za pomocą metod JS w odpowiedni sposób po naciśnięciu klawisza w dół.

Z drugiej strony nadal mam zachowanie: hover opisane w CSS dla countrol myszy. Czy istnieje inteligentny sposób symulowania zawieszania?

+1

Keyboard nawigacji sprawia, że ​​ciężkie użycia 'koncentrująca '. –

+0

@AlessandroVendruscolo prawda, ale nie mogę skupić się na niczym innym niż na lub zwykłych elementach kontrolnych, czy mogę? :) –

+0

tylko rozwiązania jQuery przychodzą mi na myśl :( –

Odpowiedz

7
+0

+1 Wziąłem wolność, aby połączyć to z twoim kodem, Loki. Możesz przyjąć tę odpowiedź. Zobacz http://jsfiddle.net/samliew/Hd7X9/4/ –

+0

Dziękuję za poświęcony czas. –

+0

Wielkie dzięki za rozwiązanie, walczyłem z tym samym problemem przez dość długi czas. –

1
+0

Dziękuję za odpowiedź, ale, jak już wspomniałem, próbuję studiować natywny JS, więc naprawdę chcę zakodować to wszystko od zera.Wiem, że JQuery oferuje wiele możliwości i opcji dostosowywania, i przyznaję, że są fajne i użyteczne, ale do tego dojdę :) –

+0

Jeśli możesz podać link lub ponownie go utworzyć w [jsfiddle] (http://jsfiddle.net), możemy nad nim pracować wspólnie. –

+0

http://jsfiddle.net/Hd7X9/ - proszę bardzo. Napisałem cię na facebooku, zgaduję, że muszę podać ci więcej informacji. –

0

Reality nie trzeba żadnych js dla listy rozwijanej, ale można użyć JavaScript wydarzenie do symulowania go. Można użyć zdarzenia jak najechaniu, naciskiem, onclick

w JS można użyć tej Do zdarzenia zestawu

document.getElementById('id').addEventListener('focus',function(e){ 
    //place code that want ran at event happened 
    } 

w jQuery można użyć wiążą, kliknięcie,. ..

$('#id')bind('focus',function(e){ 
    //place code that want ran at event happened 
    } 

Lista wydarzeń

http://www.quirksmode.org/dom/events/index.html

+0

nie można używać fokusu na elementach z czystą listą ... – Christoph

+0

@Christoph Tak, możemy użyć zdarzenia skupienia http://www.quirksmode.org/dom/events/index.html –

+1

, fakt, że element focus jest obsługiwany nie zmienia faktu, że domyślnie można tylko skupić się tylko na "okienku", linkach i polach formularzy. Musisz zadeklarować 'tabindex' na elemencie w inny sposób, a nawet wtedy, fokus jest niekonsekwentnie obsługiwany. – Christoph

0

Proponuję usunięcie atrybutu najechania z css. I dodać tylko unosił klasę, która jest naniesiona na znakom i po najechaniu myszą

Mogłoby to wyglądać tak w Kodeksie

var dropDown = document.getElementsByClassName("dropdownItemContainer")[0] 

document.addEventListener("keydown",function (e) { 
    if(e.keyCode == 38 || e.keyCode == 40) { 
     var key = e.keyCode 
     var hovered = dropDown.getElementsByClassName("hovered") 
     if(hovered.length != 0) { 
      cur = hovered[0] 
      cur.className = "" 
      cur = cur[(key==38?"previous":"next")+"ElementSibling"] || dropDown.children[key==38?dropDown.children.length-1:0] 
     } else { 
      cur = dropDown.children[key==38?dropDown.children.length-1:0] 
     } 
     cur.className="hovered" 
    } 
}); 


dropDown.addEventListener("mouseover",function (e) { 
    for(var i = 0,j; j = dropDown.getElementsByClassName("hovered")[i];i++) 
     j.className = ""; 
    e.srcElement.className = "hovered"; 
}); 

Herezje przykład na JSFiddle

Powiązane problemy