Ajax 下拉菜单的键盘导航(向上和向下箭头)

Posted

技术标签:

【中文标题】Ajax 下拉菜单的键盘导航(向上和向下箭头)【英文标题】:Keyboard navigation (up & down arrow) for Ajax drop down 【发布时间】:2012-10-06 05:05:00 【问题描述】:

我按照 W3Schools 教程进行了 AJAX 实时搜索,它运行良好。我将 AJAX 结果作为锚元素返回。

我想为 Ajax 下拉菜单添加键盘导航(即向上箭头和向下箭头),我最好的结果是将焦点放在仅停留一秒钟的第一个结果上,然后焦点消失。我想知道为什么这个焦点会消失,以及任何绕过它的方法。

我的 javascript 代码:

<script type="text/javascript">
    $(document).ready(function()
        $('#searchInput').keyup(function(e)
            var keyCode = e.keyCode || e.which;
            if (keyCode == 40)
                 $('.hint').first().focus();
                 $('.hint').first().css('color','#E8AE00'); //I can get the focus to here, but the focus will disappear right away.
            
        )
    )
</script>

这是我的 php 代码:

<?php
    $q = $_GET["q"];
    $xmlDoc = new DOMDocument();
    $xmlDoc -> load("database.xml");
    $rest = $xmlDoc -> getElementsByTagName('restaurant');

    if (strlen($q)>0)
        $hint[] = "";
        $index = 0;
        for ($i = 0; $i < ($rest->length); $i++)
            $name = $rest -> item($i) -> getElementsByTagName('name');
            $link = $rest -> item($i) -> getElementsByTagName('link');
            if ($name -> item(0) -> nodeType == 1)
                if (strtolower($q) == strtolower(substr($name -> item(0) -> childNodes -> item(0) -> nodeValue,0,strlen($q)))) //if matching
                    $hint[$index] = "<a class='hint' id='hint".$index."' href='".$link -> item(0) -> childNodes -> item(0) -> nodeValue."' onfocus=\"this.style.color='#E8AE00'\">".substr($name -> item(0) -> childNodes -> item(0) -> nodeValue,0,strlen($q))."<b>".substr($name -> item(0) -> childNodes -> item(0) -> nodeValue,strlen($q))."</b></a><br />";
                    $index++;
                
            
        
    

    if ($hint[0] == "")
        echo "no suggestion";
    
    else 
        for ($j = 0; $j < (count($hint)); $j++)
            echo $hint[$j];
        
    
?>

谢谢。

【问题讨论】:

keyup 之后还有其他方法运行吗?听起来好像另一个事件侦听器或延迟方法正在吸引您的注意力。 【参考方案1】:

可能下拉菜单正在消失,因为您正在调用 $('.hint').first().focus();,这会从(又名模糊)#searchInput 窃取焦点。我认为模糊输入会隐藏下拉列表,因为您没有在此处包含一些 JS 代码,这些代码(正确地)隐藏了下拉列表。

我不确定你为什么需要在提示时致电focus()

【讨论】:

【参考方案2】:

您正在构建具有焦点内联 javascript 事件的链接,这似乎真的没有必要?

<a class='hint' id='hint" ...... onfocus=\"this.style.color='#E8AE00'\">"

另外,请注意您多次生成相同的 ID?它们应该是独一无二的!

如果您使用一些 jQuery 并创建一个委托鼠标事件,然后触发该事件而不是焦点事件,它应该很可能工作?

$(function()
    $(document).on(
        mouseenter: function() 
            $(this).css('color', '#E8AE00')
        
    , '.hint');

    $('#searchInput').on('keyup', function(e)
            if (e.which == 40)
                 $('.hint').first().trigger('mouseenter');
            
    );
);

【讨论】:

重复是我的错误。我一直在玩代码,一定忘记了。关于 ID,我实际上为它分配了一个数字变量:hint0、hint1、hint2、...。虽然“聚焦”对结果没有太大影响。 嗨,Adeneo,我试过你的。它仍然没有解决焦点问题。焦点不断回到#searchInput。当我添加额外的行来模糊#searchInput 时,焦点转到滚动条。

以上是关于Ajax 下拉菜单的键盘导航(向上和向下箭头)的主要内容,如果未能解决你的问题,请参考以下文章

如何在下拉“选项”之间向下或向上键盘?

如何使用键盘在 Excel 单元格中下拉菜单? [关闭]

角度下拉菜单 - 使用键盘上/下键在下拉列表中移动项目

创建一个下拉菜单,在页面顶部向上打开,向下滚动时向下打开

两个 div 和 div 子元素之间的键盘箭头导航

Bootstrap 下拉菜单三角形的奥秘是啥?