【问题标题】:Arrow keys navigation doesn't work on li elements箭头键导航不适用于 li 元素
【发布时间】:2017-12-01 22:12:48
【问题描述】:

我在我的搜索表单上使用 Google 建议的查询。我想要完成的是让用户使用 javascript/jquery 通过键盘与结果列表进行交互,

我希望用户

  • 在建议的列表中使用箭头键向上/向下导航(不起作用)
  • 用 ESC 取消列表(当前工作)

JSFiddle:

https://jsfiddle.net/y8r41qd7/1/

if ($("#suggest-results").length) {

    var li = $('li');
    var liSelected;
    $(window).keydown(function(e) {
        if (e.which === 40) {
            console.log("Succeed on down arrow");
            if (liSelected) {
                liSelected.removeClass('selected');
                next = liSelected.next();
                if (next.length > 0) {
                    liSelected = next.addClass('selected');
                } else {
                    liSelected = li.eq(0).addClass('selected');
                }
            } else {
                liSelected = li.eq(0).addClass('selected');
            }
        } else if (e.which === 38) {
            if (liSelected) {
                liSelected.removeClass('selected');
                next = liSelected.prev();
                if (next.length > 0) {
                    liSelected = next.addClass('selected');
                } else {
                    liSelected = li.last().addClass('selected');
                }
            } else {
                liSelected = li.last().addClass('selected');
            }
        } else if (e.which === 27) {
            $("#syrInputForm").val('');
            $("#suggest-results").html(' ');
            return false;
        }
    });
    $(".header input[name=tag]").keyup(function() {

        var searched = $(this).val();
        var gghref = 'https://suggestqueries.google.com/complete/search?hl=en&ds=yt&client=youtube&hjson=t&cp=1&q=' + searched;
        var result;
        $.ajax({
            url: gghref,
            type: "POST",
            dataType: 'jsonp',
            success: function(data) {
                for (var i = 1; i < data[1].length; i++) {
                    if (data[1][i][0].length && data[1][i]) {
                        result += '<li class="gsuggested"><a href="#">' + data[1][i][0] + '</a></li>';
                    }
                }
                $("#suggest-results").html("<ul>" + result.replace("undefined", "") + "</ul>");
                $('.gsuggested > a').click(function() {
                    var valoare = $(this).text();
                    $(".header input[name=tag]").val(valoare).focus();
                    $("#suggest-results").html('&nbsp;');
                    return false;
                });
            }
        });
    });
}
#suggest-results .selected {
  background: #CCD5DB;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="header">
    <div class="searchWidget">
        <form action="" method="get" id="searchform" autocomplete="off" novalidate="true">
            <div class="search-holder">
                <span class="search-button">
        <button type="submit">
           <i class="fa fa-search"></i>
        </button>
     </span>
                <div class="form-control-wrap">
                    <input id="syrInputForm" type="text" class="form-control input-lg empty" name="tag" value="" placeholder="Search">
                </div>
            </div>
        </form>
        <div id="suggest-results"></div>
    </div>
</div>

是不是我做错了什么?

【问题讨论】:

  • 看起来你从未分配过liSelected
  • @jmargolisvt jsfiddle.net/Vtn5Y 几乎相同的逻辑,但适用于这个
  • @Kaddath 感谢 Kaddath,我试过了,但现在问题是,它选择了第一个 li,然后它立即消失。我可以看到它正在被选中,但几毫秒后,它又消失了,恢复正常状态。
  • @Pelin 查看我发布的解决方案
  • @Deckerz 现在我明白它为什么消失了,非常感谢!

标签: javascript jquery html css


【解决方案1】:

见下文。您必须在窗口函数中分配li,并在输入框按键功能上添加检查,以确保它不是被按下的向上/向下/esc 键。

if ($("#suggest-results").length) {

    var li = $('li');
    var liSelected;
    $(window).keydown(function(e) {
        li = $('li');
        if (e.which === 40) {
            console.log("Succeed on down arrow");
            if (liSelected) {
                liSelected.removeClass('selected');
                next = liSelected.next();
                if (next.length > 0) {
                    liSelected = next.addClass('selected');
                } else {
                    liSelected = li.eq(0).addClass('selected');
                }
            } else {
                liSelected = li.eq(0).addClass('selected');
            }
        } else if (e.which === 38) {
            if (liSelected) {
                liSelected.removeClass('selected');
                next = liSelected.prev();
                if (next.length > 0) {
                    liSelected = next.addClass('selected');
                } else {
                    liSelected = li.last().addClass('selected');
                }
            } else {
                liSelected = li.last().addClass('selected');
            }
        } else if (e.which === 27) {
            $("#syrInputForm").val('');
            $("#suggest-results").html('&nbsp;');
            return false;
        }
    });
    $(".header input[name=tag]").keyup(function(e) {
        if (e.which !== 27 && e.which !== 38 && e.which !== 40) {
            var searched = $(this).val();
            var gghref = 'https://suggestqueries.google.com/complete/search?hl=en&ds=yt&client=youtube&hjson=t&cp=1&q=' + searched;
            var result;
            $.ajax({
                url: gghref,
                type: "POST",
                dataType: 'jsonp',
                success: function(data) {
                    for (var i = 1; i < data[1].length; i++) {
                        if (data[1][i][0].length && data[1][i]) {
                            result += '<li class="gsuggested"><a href="#">' + data[1][i][0] + '</a></li>';
                        }
                    }
                    $("#suggest-results").html("<ul>" + result.replace("undefined", "") + "</ul>");
                    $('.gsuggested > a').click(function() {
                        var valoare = $(this).text();
                        $(".header input[name=tag]").val(valoare).focus();
                        $("#suggest-results").html('&nbsp;');
                        return false;
                    });
                }
            });
        }
    });
}
#suggest-results .selected {background: #CCD5DB;} 
#suggest-results li.selected {background: #CCD5DB;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<div class="header">
<div class="searchWidget">
<form action="" method="get" id="searchform" autocomplete="off" novalidate="true">
   <div class="search-holder">
      <span class="search-button">
        <button type="submit">
           <i class="fa fa-search"></i>
        </button>
     </span>
   <div class="form-control-wrap">
      <input id="syrInputForm" type="text" class="form-control input-lg empty" name="tag" value="" placeholder="Search">                
   </div>
</div>
</form>
<div id="suggest-results"></div>
</div>
</div>

【讨论】:

  • 感谢 Deckerz 的回答,它按预期工作,但有一个小问题我无法解决;例如,当您键入mus 时,您可以选择项目,然后当您继续键入时,例如musi,选择不会从musi 列表的开头开始,而是从mu 继续,当您多次单击向下按钮,然后会出现musi 结果。我会怎么做?提前致谢!
  • 如果输入更多,则删除 liselected 类
  • 不断收到Cannot read property 'removeClass' of undefined。很抱歉打扰你顺便说一句,我是一个试图实现某些目标的新手 :) li.removeClass('selected'); 只会删除选定的状态,但顺序仍然有问题
猜你喜欢
  • 2016-02-20
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多