2013-02-07 10 views
5

Prima di tutto, vorrei utilizzare solo JavaScript nativo per completare questa attività.Come si simula il passaggio del mouse con Javascript su keydown?

Diciamo che devo creare un menu a discesa personalizzato e il codice HTML è simile a questo.

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

Nel file CSS ho qualcosa vicino a questo:

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

Sì, non c'è davvero nessun comportamento dropdownish, ma non è questo il punto di discussione in realtà. Il problema è che non riuscivo a pensare a un modo decente per abilitare il controllo da tastiera per questo menu a discesa. Il risultato desiderato è il seguente: premo il tasto giù, e la prima opzione è evidenziata; Lo premo di nuovo, e la seconda opzione è evidenziata e così via.

L'unica opzione che vedo a questo punto (appena iniziato a studiare JS) è di recuperare tutti i figli di ul, incollarli in un array e assegnare i tag a un colore di sfondo tramite i metodi JS in modo corretto ogni volta che si preme il tasto giù.

D'altra parte, ho ancora il comportamento di hover descritto nel CSS per il countrol del mouse. C'è un modo intelligente di simulare alghe?

+1

navigazione tastiera rende pesante uso di ': focus '. –

+0

@AlessandroVendruscolo è vero, ma non riesco a concentrarmi su qualcosa di diverso da o su elementi di controllo regolari, posso? :) –

+0

mi vengono in mente solo le soluzioni jQuery :( –

risposta

7
+0

+1 Mi sono preso la libertà di unire questo al tuo codice, Loki. Sentiti libero di accettare questa risposta. Vedi http://jsfiddle.net/samliew/Hd7X9/4/ –

+0

Grazie per il vostro tempo ragazzi. –

+0

Grazie mille per la soluzione, ho sofferto con lo stesso problema per parecchio tempo. –

1
+0

Grazie per la risposta, ma, come ho menzionato, sto cercando di studiare nativo JS, quindi in realtà voglio codificare tutta questa cosa da zero. So che JQuery offre molte possibilità e opzioni di personalizzazione, e ammetto che sono fantastici e utili, ma ci arriverò alla fine :) –

+0

Se potresti fornire un link o crearlo su [jsfiddle] (http://jsfiddle.net), potremmo lavorarci in modo collaborativo. –

+0

http://jsfiddle.net/Hd7X9/ - ecco qua. Ti ho scritto su facebook, credo che avrò bisogno di darti un po 'di background in più. –

0

realtà non hai bisogno di qualsiasi js per discesa, ma è possibile utilizzare JavaScript eventi per la simulazione. È possibile utilizzare evento come hover, attenzione, onclick

In JS è possibile utilizzare questo per Set evento

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

in jQuery è possibile utilizzare legano, click,. ..

Elenco degli eventi

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

+0

non è possibile utilizzare lo stato attivo sugli elementi dell'elenco semplice ... – Christoph

+0

@Christoph Sì, è possibile utilizzare l'evento di messa a fuoco http://www.quirksmode.org/dom/events/index.html –

+1

beh, il fatto che l'elemento di attivazione sia supportato non non cambia il fatto che solo 'window', links e formfields possono essere focalizzati di default. Devi dichiarare 'tabindex' su un elemento altrimenti, e anche allora, il focus è supportato in modo incoerente. – Christoph

0

vorrei suggerire di rimuovere l'attributo hover da CSS. E solo aggiungere una classe è passato il mouse che viene applicato sulla pressione dei tasti e al passaggio del mouse

Questo potrebbe assomigliare a questo nel codice

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"; 
}); 

Ecco un esempio su JSFiddle

Problemi correlati