我遇到问题,我想在选择框(多个)上方有一个输入框。选择框中包含的项目多于框的高度。 (我将框的大小设置为低于项目数)。
<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很好])。
你可以在这里看到问题。
答案 0 :(得分:1)
将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片段编辑器向我显示存在语义错误)
(在Safari和Chrome中测试)