JavaScript组件开发之输入框加候选框
发布时间 - 2026-01-11 00:05:51 点击率:次1.兼容ie8 主要是事件兼容
var EventUtil = {
on:function(elem,type,handler){
if(elem.addEventListener){
elem.addEventListener(type,handler,false);
}else if(elem.attachEvent){
elem.attachEvent("on"+type,handler);
}
},
getEvent:function(event){
return event||window.event;
},
getTarget:function(event){
return event.target||event.srcElement;
},
getCharCode:function(event){
if(typeof event.handler == "number"){
return event.charCode;
}else{
return event.keyCode;
}
}
}
2.对于候选框里面的内容使用事件代理,以及点击空白处消失
EventUtil.on(document.body,'click',function(e){
stopPropagation(e);
if(EventUtil.getTarget(e).nodeName=='BODY'){
datalist.style.visibility = 'hidden';
datalist.innerHTML ='';
}
if(EventUtil.getTarget(e).nodeName == "LI"){
input.value = EventUtil.getTarget(e).innerHTML;
datalist.style.visibility = 'hidden';
datalist.innerHTML ='';
}
})
3.兼容模式下的防止冒泡
function stopPropagation(e){
e = window.event||e;
if(document.all){
e.cancelBubble = true;
}else{
e.stopPropagation();
}
}
4.效果图
5.完整代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style media="screen">
html,body{margin: 0;padding: 0;height: 100%;width: 100%;}
input{
width: 200px;
border:1px solid grey;
padding: 0 2px;
line-height: 1.5rem;
box-sizing: border-box;
outline: none;
}
ul{
margin:0;
width: 200px;
padding: 0;
list-style: none;
box-sizing: border-box;
padding: 1px;
border:1px solid;
border-color: grey;
visibility: hidden;
}
li{
line-height: 1.5rem;
padding: 0 0 0 1px;
}
li:hover{
background-color: grey;
}
.section{
top:30%;
left:50%;
position: absolute;
margin-left: -100px;
}
</style>
</head>
<body>
<div class="section">
<input id="search"/>
<ul id="datalist">
</ul>
</div>
</body>
<script type="text/javascript">
var EventUtil = {
on:function(elem,type,handler){
if(elem.addEventListener){
elem.addEventListener(type,handler,false);
}else if(elem.attachEvent){
elem.attachEvent("on"+type,handler);
}
},
getEvent:function(event){
return event||window.event;
},
getTarget:function(event){
return event.target||event.srcElement;
},
getCharCode:function(event){
if(typeof event.handler == "number"){
return event.charCode;
}else{
return event.keyCode;
}
}
}
function stopPropagation(e){
e = window.event||e;
if(document.all){
e.cancelBubble = true;
}else{
e.stopPropagation();
}
}
var input = document.getElementById('search');
var datalist = document.getElementById('datalist');
var list_array = ['aa','aab','abc'];
function generatelist(array){
var _innerHTML = '';
for (var i = 0; i < array.length; i++) {
_innerHTML += '<li>'+array[i]+'</li>';
}
datalist.innerHTML = _innerHTML;
}
function findInArray(s){
var filter_array = [];
if(s!=''){
for (var i = 0; i < list_array.length; i++) {
if(list_array[i].indexOf(s)===0){
filter_array.push(list_array[i])
}
}
}
return filter_array;
}
input.onkeyup = function(){
var new_array = findInArray(this.value);
generatelist(new_array);
if(new_array.length>0){
setTimeout(function(){datalist.style.visibility = 'visible';},0);
}else{
setTimeout(function(){datalist.style.visibility = 'hidden';},0);
}
}
EventUtil.on(document.body,'click',function(e){
stopPropagation(e);
if(EventUtil.getTarget(e).nodeName=='BODY'){
datalist.style.visibility = 'hidden';
datalist.innerHTML ='';
}
if(EventUtil.getTarget(e).nodeName == "LI"){
input.value = EventUtil.getTarget(e).innerHTML;
datalist.style.visibility = 'hidden';
datalist.innerHTML ='';
}
})
</script>
</html>
# js
# 输入框加候选框
# javascript
# 输入框
# Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
# Vue.js数字输入框组件使用方法详解
# JS 仿支付宝input文本输入框放大组件的实例
# JS通过正则限制 input 输入框只能输入整数、小数(金额或者现金) 两位小数
# js与jquery实时监听输入框值的oninput与onpropertychange方法
# js监听输入框值的即时变化onpropertychange、oninput
# JS实现在网页中弹出一个输入框的方法
# js动态修改input输入框的type属性(实现方法解析)
# js监听input输入框值的实时变化实例
# JavaScript实现一个输入框组件
# 主要是
# 空白处
# 模式下
# visibility
# style
# datalist
# innerHTML
# LI
# hidden
# body
# document
# click
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
济南网站建设制作公司,室内设计网站一般都有哪些功能?
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
如何选择PHP开源工具快速搭建网站?
php结合redis实现高并发下的抢购、秒杀功能的实例
C++用Dijkstra(迪杰斯特拉)算法求最短路径
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
5种Android数据存储方式汇总
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
敲碗10年!Mac系列传将迎来「触控与联网」双革新
Laravel如何配置任务调度?(Cron Job示例)
西安专业网站制作公司有哪些,陕西省建行官方网站?
如何快速生成专业多端适配建站电话?
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
如何在VPS电脑上快速搭建网站?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
Python图片处理进阶教程_Pillow滤镜与图像增强
音乐网站服务器如何优化API响应速度?
Laravel如何自定义分页视图?(Pagination示例)
EditPlus中的正则表达式实战(6)
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
QQ浏览器网页版登录入口 个人中心在线进入
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
如何用狗爹虚拟主机快速搭建网站?
如何挑选优质建站一级代理提升网站排名?
如何在阿里云购买域名并搭建网站?
Firefox Developer Edition开发者版本入口
进行网站优化必须要坚持的四大原则
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
如何快速辨别茅台真假?关键步骤解析
网易LOFTER官网链接 老福特网页版登录地址
Laravel如何使用withoutEvents方法临时禁用模型事件
如何用景安虚拟主机手机版绑定域名建站?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
奇安信“盘古石”团队突破 iOS 26.1 提权
如何快速搭建自助建站会员专属系统?
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
JavaScript如何实现倒计时_时间函数如何精确控制
如何快速打造个性化非模板自助建站?
音响网站制作视频教程,隆霸音响官方网站?
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Linux网络带宽限制_tc配置实践解析【教程】

