7

首先,我想只使用原生 JavaScript 来完成这项任务。

假设我要制作一个自定义下拉菜单,HTML 代码看起来像这样。

<div class="dropdown">
  <span class="dropdown-label" style="display:block">Select a thing</span>
  <ul class="dropdownItemContainer">
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
    <li>Item 4</li>
    <li>Item 5</li>
    <li>Item 6</li>
  </ul>
</div>

在 CSS 文件中,我有一些接近于此的内容:

ul.dropdownItemContainer li:hover {
  background-color: #FF0000;
}

是的,确实没有下拉行为,但这实际上不是讨论的重点。问题是我想不出一种体面的方法来为此下拉菜单启用键盘控制。期望的结果如下:我按下向下键,第一个选项被突出显示;我再次按下它,第二个选项被突出显示,依此类推。

我在这一点上看到的唯一选择(刚开始学习 JS)是获取所有的ul孩子,将它们粘贴到一个数组中,并通过 JS 方法以适当的方式为标签分配背景颜色,只要按下键按下。

另一方面,我仍然有鼠标控制的 CSS 中描述的 :hover 行为。有模拟悬停的聪明方法吗?

4

4 回答 4

8

我会在你的 li 元素上简单地分配一个类,并使用 keydown 处理程序来引导它。以下代码并不完整,而是为您提供了一些可以使用的东西。

var active = document.querySelector(".hover") || document.querySelector(".dropdownItemContainer li");

document.addEventListener("keydown",handler);
document.addEventListener("mouseover",handler);

function handler(e){
    console.log(e.which);
        active.classList.remove("hover");
    if (e.which == 40){
        active = active.nextElementSibling || active;
    }else if (e.which == 38){      
        active = active.previousElementSibling || active;
    }else{
        active = e.target;
    }
        active.classList.add("hover");
}

你可以在这里看到一个工作示例

于 2013-02-07T09:41:15.160 回答
1

您可能想要使用库而不是从头开始编写代码。

http://vebersol.net/demos/jquery-custom-forms/

http://www.dreamcss.com/2009/05/15-jquery-plugins-to-enhance-your-html.html

于 2013-02-07T09:22:11.213 回答
0

现实你不需要任何 js 来进行下拉,但你可以使用 JavaScript 事件来模拟它。你可以使用像hover , focus , onclick这样的事件

在 JS 中,您可以将其用于设置事件

  document.getElementById('id').addEventListener('focus',function(e){
    //place code that want ran at event happened
  }  

在 JQuery 中,您可以使用bindclick、...

  $('#id')bind('focus',function(e){
    //place code that want ran at event happened
  }

活动一览

http://www.quirksmode.org/dom/events/index.html

于 2013-02-07T09:34:02.750 回答
0

我建议从 css 中删除悬停属性。并且只添加一个在按键和鼠标悬停时应用的悬停类

这在代码中可能看起来像这样

var dropDown = document.getElementsByClassName("dropdownItemContainer")[0]

document.addEventListener("keydown",function (e) {
    if(e.keyCode == 38 || e.keyCode == 40 ) {
        var key = e.keyCode
        var hovered = dropDown.getElementsByClassName("hovered")
        if(hovered.length != 0 ) {
            cur = hovered[0]
            cur.className = ""
            cur = cur[(key==38?"previous":"next")+"ElementSibling"] || dropDown.children[key==38?dropDown.children.length-1:0] 
        } else {
            cur = dropDown.children[key==38?dropDown.children.length-1:0]
        }
        cur.className="hovered"
    }
});


dropDown.addEventListener("mouseover",function (e) {
    for( var i = 0,j; j = dropDown.getElementsByClassName("hovered")[i];i++)
        j.className = "";
    e.srcElement.className = "hovered";
});

这是一个关于JSFiddle的例子

于 2013-02-07T10:31:32.673 回答