2012-01-07 139 views
3

我有一個HTML列表,它看起來像這樣:next()的選擇不正確的元素

<ul class="search_list"> 
    <li class="header">Header1</li> 
    <li class="item">Text1<li> 
    <li class="item current">Text2<li> 
    <li class="header">Header2</li>` 
    <li class="item">Text3<li> 
</ul> 

我創建了一個jQuery腳本它通過使用箭頭鍵的元素的列表滾動。這項在text1text2之間正常工作,但我希望即使選擇text2(標有班級當前),然後按下箭頭鍵以選擇text3,但這不起作用。但我不明白這一點,因爲我使用了下面的jQuery腳本,並且我明確要求類項目...我該如何解決這個問題?我假設class="header"是問題...

http://jsfiddle.net/sfDJs/7/

我想通了,它的工作原理是這樣的。但是,這是很好的編碼? :)

$('.search_list li.current').next().next('.search_list_item').addClass('current');

+0

你說你有它的部分工作,所以你可以更新jsfiddle工作?您需要選擇jQuery作爲框架(請參見左側),您的代碼應該可能位於某種類型的keyup或keydown處理程序中。 – nnnnnn 2012-01-07 10:58:34

+0

只是:我不確定,但我認爲這不是依靠關鍵代碼保存,因爲它們與某些鍵盤不同。最終還有一些其他功能可以用於此目的。 – evotopid 2012-01-07 10:59:09

+0

@nnnnnn:這是更好嗎? http://jsfiddle.net/sfDJs/7/ – Torben 2012-01-07 11:12:22

回答

5

next得到緊跟的兄弟姐妹,如果提供選擇,檢索,只有當它匹配的下一個同級。在你的情況下,其中一個項目下一個兄弟是.header,$(".search_list_item .current").next('.item')給你.item如果下一個元素正好是.itemnextAll,prevAll是執行相同的事情與差異 - 獲得他們所有的next/prev兄弟匹配到選擇器。
應該是:

$(document).keydown(function(e){ 
    if (e.which == 40) { 
     $('.search_list li.item:not(:last)').filter(".current").removeClass("current").nextAll(".item:first").addClass("current"); 
    } else if (e.which == 38) { 
     $('.search_list li.item:not(:first)').filter(".current").removeClass('current').prevAll('.item:first').addClass("current") 
     } 
}); 

:not(:first):not(:last) - 因爲這是之前在菜單外去保護。
演示:http://jsfiddle.net/sfDJs/9/