用Javascript将焦点设置在select元素上会将第一个项目滚动到视图之外



我遇到了一个问题,我想在选择框(multi)上方有一个输入框。选择框中的项目数超过框的高度。(我将框的大小设置为低于项目数)。

<select id="multiSelect" size="3" multiple>
  <option value="item1">Item 1</option>
  <option value="item2">Item 2</option>
  <option value="item3">Item 3</option>
  <option value="item4">Item 4</option>
  <option value="item5">Item 5</option>
  <option value="item6">Item 6</option>
</select>

我想允许用户在上面的文本输入中输入值,然后使用他们的"向下箭头"移动到将显示在选择框中的结果。

inputField.addEventListener("keydown", function(e) {
  if (e.keyCode == 40) {
    multiSelect.focus();
    multiSelect.selectedIndex = 0;
  }
});

当用户这样做时,多选框中的第一个项目就会滚动到视图之外。这个问题在Chrome和Firefox中都会发生(在Mac上[Safari很好])。

你可以在这里看到问题。

https://jsfiddle.net/rsturim/ops9q3xk/

preventDefault添加到您的keyevent中。我注意到,例如,在Safari中,如果可以的话,它会向下滚动一点页面。这意味着keyevent实际上被传递给了一些东西,其中可能包括您的选择:

var inputField = document.getElementById("inputField");
var multiSelect = document.getElementById("multiSelect");
inputField.addEventListener("keydown", function(e) {
  if (e.keyCode == 40) {
    e.preventDefault();
    multiSelect.focus();
    multiSelect.selectedIndex = 0;
  }
});
multiSelect.addEventListener("keydown", function(e) {
  if (e.keyCode == 38 && multiSelect.selectedIndex == 0) {
    inputField.focus();
  }
});
<div>
  <input id="inputField" type="text" placeholder="start here" /> => use down arrow to move to multi-select box
</div>
<div>
  <select id="multiSelect" size="5" multiple>
    <option value="item1">Item 1</option>
    <option value="item2">Item 2</option>
    <option value="item3">Item 3</option>
    <option value="item4">Item 4</option>
    <option value="item5">Item 5</option>
    <option value="item6">Item 6</option>
    <option value="item7">Item 7</option>
    <option value="item8">Item 8</option>
    <option value="item9">Item 9</option>
    <option value="item10">Item 10</option>
  </select> => use up arrow to move to input box
</div>

Aslo,请注意,您的input元素是一个自封闭元素,所以<input />而不是<input></input>(对不起,so Snippet编辑器显示存在语义错误)(在Safari和Chrome中测试)

最新更新