要实现一个用JavaScript写的Select支持上下键、首字母筛选以及回车取值的功能可以分为以下几个步骤:
要实现一个用JavaScript写的Select支持上下键、首字母筛选以及回车取值的功能可以分为以下几个步骤:
- 创建一个select元素并隐藏原生的下拉列表。可以使用CSS的display:none或者position:absolute; left:-9999px; 等方法来实现。
<select id="mySelect" style="display:none;">
<option value="opt1">Option 1</option>
<option value="opt2">Option 2</option>
<option value="opt3">Option 3</option>
<option value="opt4">Option 4</option>
<option value="opt5">Option 5</option>
</select>
- 创建一个文本框用来模拟下拉列表,并在其下方插入一个显示选项的列表框。同时在文本框的keydown事件中添加上下键和回车键的事件处理函数。
<div style="position:relative;">
<input id="mySelectTxt" placeholder="请选择" />
<ul id="mySelectList"></ul>
</div>
const mySelect = document.getElementById('mySelect');
const mySelectTxt = document.getElementById('mySelectTxt');
const mySelectList = document.getElementById('mySelectList');
let options = [];
for (let opt of mySelect.options) {
options.push(opt.textContent);
}
function filterOptions(keyword) {
return options.filter(o => o.toLowerCase().startsWith(keyword.toLowerCase()));
}
function updateList(keyword) {
const filteredOptions = filterOptions(keyword);
mySelectList.innerHTML = '';
for (let opt of filteredOptions) {
const li = document.createElement('li');
li.textContent = opt;
li.addEventListener('click', () => {
mySelectTxt.value = opt;
mySelect.focus();
mySelectList.innerHTML = '';
});
mySelectList.appendChild(li);
}
}
mySelectTxt.addEventListener('keydown', e => {
if (e.keyCode === 38) { // Up arrow
if (mySelectList.childNodes.length > 0) {
const selected = mySelectList.querySelector('.selected');
if (selected) {
if (selected.previousSibling) {
selected.classList.remove('selected');
selected.previousSibling.classList.add('selected');
}
} else {
mySelectList.lastChild.classList.add('selected');
}
}
} else if (e.keyCode === 40) { // Down arrow
if (mySelectList.childNodes.length > 0) {
const selected = mySelectList.querySelector('.selected');
if (selected) {
if (selected.nextSibling) {
selected.classList.remove('selected');
selected.nextSibling.classList.add('selected');
}
} else {
mySelectList.firstChild.classList.add('selected');
}
}
} else if (e.keyCode === 13) { // Enter
const selected = mySelectList.querySelector('.selected');
if (selected) {
mySelectTxt.value = selected.textContent;
}
mySelect.focus();
mySelectList.innerHTML = '';
}
});
mySelectTxt.addEventListener('input', e => {
updateList(e.target.value);
});
- 在文本框的input事件中筛选出符合输入框内内容的下拉列表选项并展示出来。可以使用字符串的indexOf或正则表达式等方式来搜索符合条件的选项,并展示出来。
function filterOptions(keyword) {
return options.filter(o => o.toLowerCase().startsWith(keyword.toLowerCase()));
}
function updateList(keyword) {
const filteredOptions = filterOptions(keyword);
mySelectList.innerHTML = '';
for (let opt of filteredOptions) {
const li = document.createElement('li');
li.textContent = opt;
li.addEventListener('click', () => {
mySelectTxt.value = opt;
mySelect.focus();
mySelectList.innerHTML = '';
});
mySelectList.appendChild(li);
}
}
mySelectTxt.addEventListener('input', e => {
updateList(e.target.value);
});
示例1:
<select id="mySelect" style="display:none;">
<option value="1">China</option>
<option value="2">Japan</option>
<option value="3">South Korea</option>
<option value="4">Thailand</option>
<option value="5">Indonesia</option>
<option value="6">Vietnam</option>
<option value="7">Malaysia</option>
<option value="8">Singapore</option>
<option value="9">Philippines</option>
</select>
<div style="position:relative;">
<input id="mySelectTxt" placeholder="请选择" />
<ul id="mySelectList"></ul>
</div>
<script>
const mySelect = document.getElementById('mySelect');
const mySelectTxt = document.getElementById('mySelectTxt');
const mySelectList = document.getElementById('mySelectList');
let options = [];
for (let opt of mySelect.options) {
options.push(opt.textContent);
}
function filterOptions(keyword) {
return options.filter(o => o.toLowerCase().startsWith(keyword.toLowerCase()));
}
function updateList(keyword) {
const filteredOptions = filterOptions(keyword);
mySelectList.innerHTML = '';
for (let opt of filteredOptions) {
const li = document.createElement('li');
li.textContent = opt;
li.addEventListener('click', () => {
mySelectTxt.value = opt;
mySelect.focus();
mySelectList.innerHTML = '';
});
mySelectList.appendChild(li);
}
}
mySelectTxt.addEventListener('input', e => {
updateList(e.target.value);
});
</script>
示例2:
<select id="mySelect" style="display:none;">
<option value="option1">Red</option>
<option value="option2">Green</option>
<option value="option3">Blue</option>
<option value="option4">Yellow</option>
<option value="option5">Black</option>
<option value="option6">White</option>
</select>
<div style="position:relative;">
<input id="mySelectTxt" placeholder="请选择" />
<ul id="mySelectList"></ul>
</div>
<script>
const mySelect = document.getElementById('mySelect');
const mySelectTxt = document.getElementById('mySelectTxt');
const mySelectList = document.getElementById('mySelectList');
let options = [];
for (let opt of mySelect.options) {
options.push(opt.textContent);
}
function filterOptions(keyword) {
return options.filter(o => o.toLowerCase().startsWith(keyword.toLowerCase()));
}
function updateList(keyword) {
const filteredOptions = filterOptions(keyword);
mySelectList.innerHTML = '';
for (let opt of filteredOptions) {
const li = document.createElement('li');
li.textContent = opt;
li.addEventListener('click', () => {
mySelectTxt.value = opt;
mySelect.focus();
mySelectList.innerHTML = '';
});
mySelectList.appendChild(li);
}
}
mySelectTxt.addEventListener('input', e => {
updateList(e.target.value);
});
</script>
织梦狗教程
本文标题为:一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能


基础教程推荐
猜你喜欢
- js选择并转移导航菜单示例代码 2024-01-05
- HTML - <div>和<span>标签 2023-10-27
- 【有手就行系列】Vue快速入门案例 2023-10-08
- CSS鼠标悬浮DIV后显示DIV外的按钮解决方法 2023-12-29
- Javascript Bootstrap的网格系统,导航栏和轮播详解 2023-08-12
- Ajax调用restful接口传送Json格式数据的方法 2023-01-20
- vue-cli2.x:vue项目运行npm run dev命令时,项目在浏览器自动打开页面的方法 2023-10-08
- 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之业务数据增删改查(七) 2023-10-08
- CSS双飞翼布局的两种方式实现示例 2023-12-11
- LazyLoad 延迟加载(按需加载) 2023-12-19