【问题标题】:How to navigate between divs with class name on keydown?如何在 keydown 上使用类名在 div 之间导航?
【发布时间】:2017-09-30 22:07:50
【问题描述】:

我有图像 div 列表,并希望通过按下键盘上的右、左、上和下箭头在它们之间导航。我尝试了以下 jQuery,但是当我按下箭头时图像焦点永远不会改变。我想要图像边框当它收到焦点时会发光,以便用户知道选择了哪个。(我希望默认焦点始终位于第一个 div 上,始终在页面加载时)。任何人都可以帮我解决这个问题。提前致谢。

分区:

<div class="scroller">
<div id="Div1" style="display: visiable;">  

<div class="image1">
<a href="javascript:doIt('10')">
<img src="./content/1/102.jpg" alt="..">Movie 1
</a>
</div>
<div class="image2">
<a href="javascript:doIt('11')">
<img src="./content/2/102.jpg" alt="..">Movie 2
</a>
</div>
<div class="image3">
<a href="javascript:doIt('12')">
<img src="./content/3/102.jpg" alt="..">Movie 3
</a>
</div>
<div class="image4">
<a href="javascript:doIt('13')">
<img src="./content/4/102.jpg" alt="..">Movie 4
</a>
</div>

</div>
</div>

jquery:

<script>
$(document).keydown(function (e) {
        var index = $(":focus").index() + 1;
        if (e.which === 37) {
                alert("left:37");
            $('div a:nth-child(' + (index - 1) + ')').focus();
    } else if (e.which === 39) {
                alert("right 39");
            $('div a:nth-child(' + (index + 1) + ')').focus();
    } else if (e.which === 38) {
                alert("Up:38");
            $('div  a:nth-child(' + (index - 1) + ')').focus();
    } else if (e.which === 40) {
                alert("Down:40");
            $('div a:nth-child(' + (index + 1) + ')').focus();
    }
});


</script>

css:

<style>

.image {
float:left;
width: 50%;
}

img {
width:100%;
}

a:focus {
  //border: 1px solid black;
  outline: none;
  border-color: #9ecaed;
  box-shadow: 0 0 10px #9ecaed;
}

.container {
width:100%;
}

@media (max-width: 740px){
.image {
width: 100%;
}
}

div.scroller {
overflow:scroll;    
}
</style>

【问题讨论】:

    标签: javascript jquery css focus keydown


    【解决方案1】:

    你的选择器是问题:

    $('div a:nth-child(' + (index - 1) + ')').focus();

    这是针对 div 的 a:nth-child,但由于每个 div 都只有一个 a,所以逻辑是有缺陷的。它应该将 div 定位为父 div (#Div1) 的第 n 个子元素,如下所示:

    $('#Div1 div:nth-child(' + (index - 1) + ')').focus();

    您可以通过为 div 设置 tabindex=0 来使它们具有焦点(这可以保持正常的跳格顺序,但允许它们接收焦点,从而使您的 JS 逻辑更简单一些)。

    这是一个有效的代码笔:https://codepen.io/anon/pen/dVzoQK

    【讨论】:

    • 感谢您的回复。我进行了更改,但仍然有一个我按任何箭头,焦点永远不会改变到下一个或上一个!我知道如何运行 codepen 吗?它不像 jsfiddle:-(
    • 如果有帮助,这里是 jsfiddle 中的相同示例:jsfiddle.net/j06v8sah/2
    • 正如您在页面加载的 jsfiddle 示例中注意到的,焦点未设置在第一个拇指上,当我按下箭头时,焦点消失而不是焦点更改为下一个或上一个!我需要这个功能,因为我正在开发这个功能,所以它最后可以与遥控器一起使用!如何在开始时将焦点设置在第一个项目上并在我按下不同的箭头时更改它?
    • 好吧,在这种情况下,您只需要在第一个 div 上使用 .focus() 来设置默认值,将此行添加到 JavaScript:$(document).ready(function() { $('#Div1 div:eq(0)').focus(); }); - 对我来说焦点不会消失,它按照指定的方式在列表中向上或向下移动,您使用的是什么浏览器?
    • 似乎 Firefox 和焦点有一些问题,我不得不重新设计选择器并将 tabindex 添加到链接本身以允许它们聚焦,现在应该可以工作了:jsfiddle.net/4fsyg9ay 请注意,初始自动聚焦在 jsfiddle 中对我不起作用,我不确定这是否是因为它与多个 iframe 等一起工作的方式,但它在 codepen 中对我有用,当我将所有代码粘贴到我自己的本地 HTML 页面时它确实工作,所以我认为这是一个特定于 jsfiddle 的错误,无需担心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    相关资源
    最近更新 更多