【问题标题】:Select option using keyboard based on value attribute根据值属性使用键盘选择选项
【发布时间】:2018-11-15 05:43:43
【问题描述】:
<select>
 <option value="1">Jan</option>
 <option value="2">Feb</option>
 <option value="3">Mar</option>
 <option value="4">Apr</option>
 <option value="5">May</option>
 <option value="6">Jun</option>
 <option value="7">Jul</option>
 <option value="8">Aug</option>
 <option value="9">Sept</option>
 <option value="10">Oct</option>
 <option value="11">Nov</option>
 <option value="12">Dec</option>
</select>

我有月份的列表,它们有代表月份的数值。我需要在聚焦时通过在键盘上键入 3 来选择 Mar。

现在我必须输入“m”来选择 Mar 或任何月份的第一个字母来选择那个月份。

你可以在这里看看小提琴:https://jsfiddle.net/tn0gL34h/1/

【问题讨论】:

  • 欢迎来到stackoverflow。您是否考虑过这样命名每个月:1 - Jan2 - Feb,等等?
  • 我不需要向用户显示月份数。我曾想过这样做。

标签: javascript jquery html


【解决方案1】:

检查一下,我稍微修改了 ahmad 的答案,这也适用于 2 位数字。 source

var typingTimer;                
var doneTypingInterval = 1000;  
var $input = $('select');
var keys = '';

$input.on('keyup', function (e) {
  keys += parseInt(e.key);
  console.log(keys);
  clearTimeout(typingTimer);
  typingTimer = setTimeout(doneTyping, doneTypingInterval);
});

//on keydown, clear the countdown 
$input.on('keydown', function () {
  clearTimeout(typingTimer);
});

//user is "finished typing," do something
function doneTyping () {
  if(keys != ''){
    //do something
    $input.val(parseInt(keys));
    keys='';
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<select>
 <option value="1">Jan</option>
 <option value="2">Feb</option>
 <option value="3">Mar</option>
 <option value="4">Apr</option>
 <option value="5">May</option>
 <option value="6">Jun</option>
 <option value="7">Jul</option>
 <option value="8">Aug</option>
 <option value="9">Sept</option>
 <option value="10">Oct</option>
 <option value="11">Nov</option>
 <option value="12">Dec</option>
</select>

【讨论】:

  • 您在控制台中遇到什么错误?也许我们可以解决这个问题
  • 没有错误,它在某些浏览器上根本不起作用。例如,我的keyup 987654325 @事件未捕获选择菜单打开时。我的答案中有一个链接,其中包含大量关于此的讨论。
  • 我猜是浏览器的行为在选择菜单打开时阻止了 keydown 事件
  • 是的 - 如果您知道将使用哪种浏览器,那么您的答案是好的。例如 - 如果这是员工在受控环境中使用的应用程序,那就没问题了。
  • 我发现 this link 它说它是谷歌浏览器特有的,请检查
【解决方案2】:

从 1 月到 9 月的几个月内,以下代码都可以使用,因为它们都需要一次按键。

对于其他月份,第 10 个月、第 11 个月和第 12 个月,您必须手动选择。

$('select').on('keyup',function(e){
  // this will only work for Jan --> Sep
  // becuase Oct --> Dec require two digits
  
  $(this).val(parseInt(e.key));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<select>
 <option value="1">Jan</option>
 <option value="2">Feb</option>
 <option value="3">Mar</option>
 <option value="4">Apr</option>
 <option value="5">May</option>
 <option value="6">Jun</option>
 <option value="7">Jul</option>
 <option value="8">Aug</option>
 <option value="9">Sept</option>
 <option value="10">Oct</option>
 <option value="11">Nov</option>
 <option value="12">Dec</option>
</select>

【讨论】:

  • 您必须先选择组合框。单击它或突出显示它@Teemu
  • 我正在使用 Chrome,这很好用。我会检查 IE @Teemu
  • 如果你输入的是两位数的数字,它不会起作用(尝试输入 11)
  • @AlonShmiel 我同意。在接受击键组合之前,必须重新编写代码以考虑一些时间延迟
  • 实际上这也适用于 FF(和 Edge)。在 FF 中,您必须先用鼠标选择月份,或者使用 TAB 导航到选择。
【解决方案3】:

据我所知,唯一可靠的方法是使用 javacript 选择菜单替换插件。在选择集中时捕获按键的技术适用于某些浏览器,但不适用于其他浏览器(请参阅此处的更多讨论:keydown event in drop down list)。事实上,尽管其他人提到它对他们有用,但 Ahmad 上面的回答在我的浏览器上不起作用(Chrome 49 / OS X 10.8)。

这是一个示例,说明如何使用 Select2 修改匹配器方法:

$('select').select2({
  matcher: function(params, data) {
    if ($.trim(params.term) === '') {
      return data;
    } else if (data.id.indexOf(params.term) === 0) {
      // this is where the magic happens
      // we return options where search input matches
      // the beginning of the value
      return data;
    } else {
      return null;
    }
  }
});
select {
  width: 100px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
<select>
  <option value="1">Jan</option>
  <option value="2">Feb</option>
  <option value="3">Mar</option>
  <option value="4">Apr</option>
  <option value="5">May</option>
  <option value="6">Jun</option>
  <option value="7">Jul</option>
  <option value="8">Aug</option>
  <option value="9">Sept</option>
  <option value="10">Oct</option>
  <option value="11">Nov</option>
  <option value="12">Dec</option>
</select>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 2013-05-02
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    相关资源
    最近更新 更多