为什么 .next('li:visible') 或 .prev('li:visible') 不能跳过不可见的元素

Why can't .next('li:visible') or .prev('li:visible') not skip invisible elements?

本文关键字:visible li 元素 next 为什么 prev 不能      更新时间:2023-09-26

我正在制作一个选择控件,该控件在"li"中显示选项列表,并允许用户在li中上下滚动。由于 li 可以被过滤,有时它们会通过".hide"呈现为不可见,给我以下标记:

<input type="text" id="comboBox" />
<ul id="comboBoxData">
    <li style="display:none">1</li>
    <li>12</li>
    <li>123</li>
    <li>1234</li>
    <li style="display:none">12345</li>
    <li style="display:none">123456</li>
    <li>1234567</li>
    <li>12345678</li>
</ul>

我有以下 JQuery 代码来处理箭头键控件:

$('#comboBox').bind('keypress', function(e) {
    if (e.keyCode >= 38 && e.keyCode <= 41) {
        if ($("#comboBoxData li.selected").length > 0) {
            var current = $("#comboBoxData li.selected");
            if (e.keyCode == 38) {
                $("#comboBoxData li.selected").prev('li:visible').addClass('selected');
            } else if (e.keyCode == 40) {
                $("#comboBoxData li.selected").next('li:visible').addClass('selected');
            }
            current.removeClass('selected');
        } else {
            $("#comboBoxData li:visible:first").addClass('selected');
        }
        $("#comboBox").val($("#comboBoxData li.selected").html());
    }
});

使用以下 CSS 来清楚地标记我选择了哪个元素:

.selected
{
    background-color:Navy;
    color:White;
}
我的问题是,在我给出的检查中,当用户按下"向下"按钮时,正在选择"12">

的 LI,并且上下按钮在"12"向下到"1234"中正常工作,但是他们在那里停止并且找不到"1234567",因为设置为"显示"的两个 li 的间隙:没有'。有没有办法解决这个问题?也许是 .next(( 和 .previous(( 的替代品?

您需要

改用nextAll()prevAll()

next()prev() 只有在与选择器匹配时才会匹配上一个/下一个元素。 nextAll()prevAll() 在所有下一个/上一个元素中搜索匹配项。

要选择第一个上一个/下一个元素,请尝试;

nextAll('your-selector').first()

nextAll('your-selector:first')

您使用的方法仅适用于下一项,如果该项与选择器不匹配,则无法返回任何项。您需要使用 nextAllprevAll 来收集所有可能的元素,以便使用选择器进行过滤。

看看这个jsfiddle:

http://jsfiddle.net/6WxAZ/2/