2013-02-07 18 views
5

İlk olarak, bu görevi tamamlamak için yalnızca yerel JavaScript kullanmak istiyorum.Anahtarda Javascript ile vurguluyu nasıl taklit edebilirim?

ı özel açılan yapmak duyuyorum diyelim ve HTML kodu şöyle tür görünüyor. CSS dosyasında

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

Bunun yakın bir şey var:

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

Evet, gerçekten hiçbir dropdownish davranış yoktur, ama aslında tartışmanın bu değil. Sorun şu ki bu açılır menü için klavye kontrolünü etkinleştirmek için iyi bir yol düşünemedim. İstenen sonuç şu şekildedir: Aşağı tuşuna bastığımda ilk seçenek vurgulanır; Tekrar basıyorum, ikinci seçenek vurgulanıyor ve böyle devam ediyor.

Bu noktada gördüğüm tek seçenek (sadece JS'yi incelemeye başladı), ul'un tüm çocuklarını getirmektir, bir diziye yapıştırın ve JS yöntemleriyle arka plan rengini uygun bir şekilde atayın. Aşağı tuşa her basıldığında. Fare countrol için CSS açıklanan vurgulu davranışı: Öte yandan

, hala var. Hovers'ları taklit etmenin akıllı bir yolu var mı?

+1

Klavye navigasyon üzerinde bir örnek 'çok sık kullanır: odak '. –

+0

sadece jQuery çözümleri aklıma geliyor :( –

cevap

7
+0

+1 Bunu kodunuzla birleştirmenin özgürlüğünü aldım Loki. Bu cevabı kabul etmekte özgürsünüz. Bkz. Http://jsfiddle.net/samliew/Hd7X9/4/ –

+0

Zaman ayırdığınız için teşekkür ederiz. –

+0

Çözüm için çok teşekkürler, aynı sorunla çok fazla zaman harcıyordum. –

1
+0

Cevabınız için teşekkür ederim, ama, bahsettiğim gibi, ben çalışmaya çalışıyorum doğal JS, bu yüzden aslında bu şeyi sıfırdan kodlamak istiyorum.JQuery'nin bir çok olasılık ve özelleştirme seçeneği sunduğunu biliyorum ve bunların güzel ve kullanışlı olduklarını itiraf ediyorum ama sonunda ona ulaşacağım :) –

+0

Bir bağlantı sağlayabilir veya bunu [jsfiddle] (http://jsfiddle.net) üzerinde yeniden oluşturabilir, işbirliği yapabiliriz. –

+0

http://jsfiddle.net/Hd7X9/ - işte gidiyorsunuz. Seni facebook'a yazdım, sanırım sana biraz daha arka plan vermem gerekecek. –

0

Gerçeklik Açılan listede herhangi js gerek yoktu ama Bunu simüle etmek için JavaScript Olay kullanabilirsiniz. Sen bağlama, tıklayın kullanabilirsiniz vurgulu, odak, Sen JQuery yılında Seti Olay

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

için bu kullanabilir miyim JS onclick

gibi olayı kullanabilirsiniz. ..

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

Olay Listesi

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

+0

odağı düz liste öğelerinde kullanamazsınız ... – Christoph

+0

@Christoph Evet, odak etkinliğini destekliyor olsaydık, odak etkinliğini http://www.quirksmode.org/dom/events/index.html –

+1

kullanabiliriz sadece 'window', links ve formfields'ın varsayılan olarak odaklanabileceği gerçeğini değiştirmeyin. Aksine bir öğe üzerinde 'tabindex 'bildirmeniz gerekiyor ve daha sonra, odak tutarsız bir şekilde destekleniyor. – Christoph

0

ben css den vurgulu özniteliği kaldırarak öneririm görebilirsiniz. Ve basılmasını ve fare üstlerine

Bu Kanununda aşağıdaki gibi görünebilir uygulanır sadece bir Vurgulanan sınıf eklemek

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

İşte JSFiddle