Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
实现智能搜索提示与数据验证的Autocomplete组件教程_创想鸟

实现智能搜索提示与数据验证的Autocomplete组件教程

实现智能搜索提示与数据验证的autocomplete组件教程

本文将指导你如何使用JavaScript实现一个具有智能搜索提示和数据验证功能的Autocomplete组件。该组件能够在用户输入时提供匹配的选项,支持在字符串的任意位置进行匹配,并且可以限制用户输入,只允许选择预定义的选项。

1. HTML结构

首先,我们需要一个HTML结构来容纳输入框和Autocomplete列表。

2. JavaScript实现Autocomplete功能

接下来,我们将使用JavaScript来实现Autocomplete的核心功能。

2.1 显示所有选项

要实现当光标位于空字段时显示所有选项,我们需要修改input事件监听器。当输入框为空时,显示整个列表。

inp.addEventListener("input", function(e) {    var a, b, i, val = this.value;    closeAllLists();    if (!val) {      // 显示所有选项      a = document.createElement("DIV");      a.setAttribute("id", this.id + "autocomplete-list");      a.setAttribute("class", "autocomplete-items");      this.parentNode.appendChild(a);      for (i = 0; i < arr.length; i++) {          b = document.createElement("DIV");          b.innerHTML = arr[i];          b.innerHTML += "";          b.addEventListener("click", function(e) {            inp.value = this.getElementsByTagName("input")[0].value;            closeAllLists();          });          a.appendChild(b);      }      return false;    }    currentFocus = -1;    a = document.createElement("DIV");    a.setAttribute("id", this.id + "autocomplete-list");    a.setAttribute("class", "autocomplete-items");    this.parentNode.appendChild(a);    for (i = 0; i  -1) {        b = document.createElement("DIV");        b.innerHTML = arr[i].replace(new RegExp(val, 'gi'), "$&");        b.innerHTML += "";        b.addEventListener("click", function(e) {          inp.value = this.getElementsByTagName("input")[0].value;          closeAllLists();        });        a.appendChild(b);      }    }  });

2.2 匹配任意位置的字符串

要实现匹配字符串中任意位置的功能,我们需要修改匹配逻辑。不再使用substr(),而是使用indexOf()来检查匹配项。

if (arr[i].toUpperCase().indexOf(val.toUpperCase()) > -1) {    /*create a DIV element for each matching element:*/    b = document.createElement("DIV");    /*make the matching letters bold:*/    // 使用正则表达式高亮匹配的字符串    b.innerHTML = arr[i].replace(new RegExp(val, 'gi'), "$&");    b.innerHTML += "";    /*execute a function when someone clicks on the item value (DIV element):*/    b.addEventListener("click", function(e) {      /*insert the value for the autocomplete text field:*/      inp.value = this.getElementsByTagName("input")[0].value;      /*close the list of autocompleted values,      (or any other open lists of autocompleted values:*/      closeAllLists();    });    a.appendChild(b);  }

2.3 限制输入并验证

为了限制用户只能输入Autocomplete列表中的值,我们需要在表单提交前进行验证,或者在每次输入后进行验证。这里提供一个简单的输入验证方法。

inp.addEventListener("blur", function() {    let currentValue = this.value;    let isValid = false;    for (let i = 0; i < arr.length; i++) {        if (arr[i] === currentValue) {            isValid = true;            break;        }    }    if (!isValid) {        this.value = ""; // 清空输入框        alert("请输入有效的水果名称"); // 提示用户    }});

这段代码在输入框失去焦点时(blur事件)触发,检查输入的值是否在fruitlist数组中。如果不在,则清空输入框并提示用户。

2.4 完整的JavaScript代码

function autocomplete(inp, arr) {  var currentFocus;  inp.addEventListener("input", function(e) {    var a, b, i, val = this.value;    closeAllLists();    if (!val) {      // 显示所有选项      a = document.createElement("DIV");      a.setAttribute("id", this.id + "autocomplete-list");      a.setAttribute("class", "autocomplete-items");      this.parentNode.appendChild(a);      for (i = 0; i < arr.length; i++) {          b = document.createElement("DIV");          b.innerHTML = arr[i];          b.innerHTML += "";          b.addEventListener("click", function(e) {            inp.value = this.getElementsByTagName("input")[0].value;            closeAllLists();          });          a.appendChild(b);      }      return false;    }    currentFocus = -1;    a = document.createElement("DIV");    a.setAttribute("id", this.id + "autocomplete-list");    a.setAttribute("class", "autocomplete-items");    this.parentNode.appendChild(a);    for (i = 0; i  -1) {        b = document.createElement("DIV");        b.innerHTML = arr[i].replace(new RegExp(val, 'gi'), "$&");        b.innerHTML += "";        b.addEventListener("click", function(e) {          inp.value = this.getElementsByTagName("input")[0].value;          closeAllLists();        });        a.appendChild(b);      }    }  });  inp.addEventListener("keydown", function(e) {    var x = document.getElementById(this.id + "autocomplete-list");    if (x) x = x.getElementsByTagName("div");    if (e.keyCode == 40) {      currentFocus++;      addActive(x);    } else if (e.keyCode == 38) {      currentFocus--;      addActive(x);    } else if (e.keyCode == 13) {      e.preventDefault();      if (currentFocus > -1) {        if (x) x[currentFocus].click();      }    }  });  function addActive(x) {    if (!x) return false;    removeActive(x);    if (currentFocus >= x.length) currentFocus = 0;    if (currentFocus < 0) currentFocus = (x.length - 1);    x[currentFocus].classList.add("autocomplete-active");  }  function removeActive(x) {    for (var i = 0; i < x.length; i++) {      x[i].classList.remove("autocomplete-active");    }  }  function closeAllLists(elmnt) {    var x = document.getElementsByClassName("autocomplete-items");    for (var i = 0; i < x.length; i++) {      if (elmnt != x[i] && elmnt != inp) {        x[i].parentNode.removeChild(x[i]);      }    }  }  document.addEventListener("click", function(e) {    closeAllLists(e.target);  });  inp.addEventListener("blur", function() {    let currentValue = this.value;    let isValid = false;    for (let i = 0; i < arr.length; i++) {        if (arr[i] === currentValue) {            isValid = true;            break;        }    }    if (!isValid) {        this.value = "";        alert("请输入有效的水果名称");    }});}var fruitlist = [  "Apple",  "Mango",  "Pear",  "Banana",  "Berry"];autocomplete(document.getElementById("myFruitList"), fruitlist);

3. CSS样式

为了使Autocomplete列表看起来更美观,我们可以添加一些CSS样式。

.autocomplete {  position: relative;  display: inline-block;}.autocomplete-items {  position: absolute;  border: 1px solid #d4d4d4;  border-bottom: none;  border-top: none;  z-index: 99;  top: 100%;  left: 0;  right: 0;}.autocomplete-items div {  padding: 10px;  cursor: pointer;  background-color: #fff;  border-bottom: 1px solid #d4d4d4;}.autocomplete-items div:hover {  background-color: #e9e9e9;}.autocomplete-active {  background-color: DodgerBlue !important;  color: #fff;}

4. 总结

通过以上步骤,我们实现了一个具有智能搜索提示和数据验证功能的Autocomplete组件。这个组件可以在用户输入时提供匹配的选项,支持在字符串的任意位置进行匹配,并且可以限制用户输入,只允许选择预定义的选项。你可以根据自己的需求,进一步扩展和优化这个组件。

注意事项

在实际应用中,可以考虑使用节流或防抖技术来优化输入事件的处理,减少不必要的计算。可以从服务器端获取Autocomplete列表,以支持更大的数据集。可以添加更多的验证规则,例如检查输入是否为空,或者是否符合特定的格式。为了更好的用户体验,可以添加键盘导航功能,允许用户使用键盘上下键选择Autocomplete列表中的选项。

以上就是实现智能搜索提示与数据验证的Autocomplete组件教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1324501.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CSV文件数据追加与自增ID处理教程
上一篇 2025年12月12日 11:10:06
深入理解 PHP json_encode() 的UTF-8编码要求及处理策略
下一篇 2025年12月12日 11:10:19

相关推荐

  • 怎样在iPhone情侣模式中分享视频?快速上传和同步的实用方法

    怎样在iPhone情侣模式中分享视频?快速上传和同步的实用方法怎样在iPhone情侣模式中分享视频?快速上传和同步的实用方法怎样在iPhone情侣模式中分享视频?快速上传和同步的实用方法怎样在iPhone情侣模式中分享视频?快速上传和同步的实用方法

    最实用的方法是使用iCloud共享相簿,它支持情侣间视频快速上传与实时同步。首先双方需开启iCloud照片中的共享相簿功能,然后创建专属相簿并邀请对方加入。此后,任一方添加的视频会自动同步至对方设备,且不占用个人iCloud空间。相比AirDrop(限近距离)、即时通讯工具(压缩画质)或云盘(占存储…

    2026年9月22日 • 用户投稿
    000
  • 神马搜索App用户反馈处理教程_神马搜索App问题解决技巧

    首先通过App内“帮助与反馈”提交问题,其次针对负面信息访问官网进行侵权投诉,最后定期清理缓存以解决卡顿或显示异常问题。 如果您在使用神马搜索App时遇到问题或希望反馈体验,可以通过官方渠道提交信息以获得处理。以下是针对不同问题的解决步骤: 本文运行环境:iPhone 15 Pro,iOS 18 一…

    2026年9月22日
    000
  • 如何判断网络延迟(Ping值)过高是由运营商问题还是自身设备引起的?

    先重启设备并检查本地连接,若有线网络延迟降低则问题在无线信号;通过ping网关和外部DNS判断故障范围,结合tracert追踪路径,前几跳异常指向运营商问题,最后用官方测速工具验证并联系客服解决。 判断网络延迟高是运营商还是自身设备的问题,关键在于逐步隔离排查。从最接近你的设备开始测试,向外层层推进…

    2026年9月22日
    100
  • 使用MockWebServer对FeignClient进行单元测试

    本文详细阐述了如何利用Spring Cloud LoadBalancer和MockWebServer对FeignClient进行高效单元测试。通过在测试配置中动态注册MockWebServer实例,并将其作为FeignClient的服务发现目标,开发者可以精确模拟后端API的行为,包括各种HTTP响…

    2026年9月22日
    000
  • 豫事办的密码怎么改

    首先通过个人中心修改密码或使用忘记密码功能重置。记得密码时,进入豫事办APP我的→设置→修改密码,输入原密码和新密码即可;忘记密码则在登录页点击“忘记密码”,输入手机号获取验证码后设置新密码完成重置。 如果您需要更新您的豫事办账户密码以确保账户安全,可以通过应用内设置直接修改,或在忘记密码时通过身份…

    2026年9月22日
    400
  • Canva中AI生成图片如何导出?教你快速保存设计作品的方法

    答案:Canva中导出AI生成图片的操作与普通图片相同,点击右上角“分享”按钮,选择“下载”,可选PNG、JPG、PDF、SVG、MP4或GIF等格式;为保证画质,建议优先选用PNG格式,避免有损压缩,同时选择高分辨率和合适尺寸,Pro用户可进一步调整质量与透明背景设置;除下载外,还可通过分享链接、…

    2026年9月22日
    800
  • VSCode安全更新机制解析

    VSCode通过自动检查、数字签名验证和用户可控策略确保更新安全。启动时后台定期HTTPS请求检查新版本,每日一次;安装包经平台特定签名(Windows Authenticode、macOS代码签名、Linux GPG)验证完整性;用户可选自动更新、提示或关闭,企业可集中管控;微软通过安全入口响应漏…

    2026年9月22日
    100
  • Hazelcast缓存数据未显示:排查与解决指南

    本文旨在解决在使用Spring Cache结合Hazelcast时,通过@CachePut等注解成功将数据放入缓存,但无法通过HazelcastInstance获取缓存数据的问题。文章将深入探讨可能的原因,并提供详细的配置步骤和代码示例,帮助开发者正确配置和使用Hazelcast缓存。 在使用Spr…

    2026年9月22日
    000
  • Laravel 8 登录后重定向至仪表盘的策略与实践

    本教程详细阐述了在 Laravel 8 中实现用户登录后重定向到仪表盘的多种策略。我们将探讨如何通过配置 LoginController 的 $redirectTo 属性、利用 RouteServiceProvider 定义常量以及在自定义登录方法中进行精确控制来管理重定向流程。文章还涵盖了相关中间…

    2026年9月22日
    000
  • 如何在iPhone情侣模式中启用视频通话?快速连接彼此的设置方法

    如何在iPhone情侣模式中启用视频通话?快速连接彼此的设置方法如何在iPhone情侣模式中启用视频通话?快速连接彼此的设置方法如何在iPhone情侣模式中启用视频通话?快速连接彼此的设置方法如何在iPhone情侣模式中启用视频通话?快速连接彼此的设置方法

    iPhone虽无官方“情侣模式”,但可通过FaceTime或微信、WhatsApp等第三方应用实现高质量视频通话。首选FaceTime,操作便捷、画质清晰,支持SharePlay共享影音,仅限苹果设备;跨平台可选微信、WhatsApp等,注重隐私可用Telegram。优化体验需稳定网络、良好光线与背…

    2026年9月22日 • 用户投稿
    200
  • Java中异常处理与方法返回值结合

    异常发生时不应返回默认值,而应通过抛出异常或使用Optional、自定义结果类等方式明确传递错误信息,确保调用方能正确处理失败情况,提升代码健壮性与可读性。 在Java中,异常处理与方法返回值的结合是一个常见的编程问题。理解它们之间的关系有助于写出更健壮、可读性更强的代码。当一个方法可能发生异常时,…

    2026年9月22日
    000
  • VSCode如何通过扩展实现Markdown预览 VSCode Markdown预览功能的配置方法

    安装“markdown all in one”或“markdown preview enhanced”等扩展;2. 安装后通过ctrl+shift+v打开预览;3. 在设置中配置预览样式、主题、字体等;4. 启用“auto show preview to side”实现自动预览;5. 开启“scro…

    2026年9月22日
    000
  • 谷歌浏览器安卓版如何清除数据_安卓版Chrome应用数据清理方法

    首先清除浏览数据可解决谷歌浏览器页面加载慢、自动填充错误等问题。通过Chrome设置菜单可一次性清除指定时间范围内的历史记录、Cookie及缓存;针对特定网站问题,可仅清除该站点的数据以保留其他登录状态;若问题严重,可通过手机系统设置中的应用管理清除Chrome的缓存或全部数据,以重置应用状态。 如…

    2026年9月22日
    000
  • E票电影app微信解绑教程

    E票电影app微信解绑操作指南: 1、启动应用后,选择底部菜单中的“我的”页面,接着点击“设置”图标。 2、在设置界面中,找到并进入“账户与安全”功能项。 3、进入绑定信息页面后,点击“已绑定”的微信账号,按照提示完成解绑操作。 以上就是E票电影app微信解绑教程的详细内容,更多请关注创想鸟其它相关…

    2026年9月22日
    100
  • 成都一青旅禁止40岁以上男性预订?店家回应

    近日,四川成都的一家青年旅舍因其一项特殊的预订规则而引发了网络热议。有网友发现,该青旅推出的4元特价房,竟明确禁止40岁以上的男性和30岁以上的女性进行预订。 特价房背后的“附加任务” 10月13日,记者联系了涉事的三家青旅。工作人员向记者证实了这一年龄限制的存在。他们解释称,这4元的特价并非简单的…

    用户投稿 2026年9月22日
    000
  • 华为天际通Go将支持eSIM:设备在路上了

    华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了

    9月3日消息,今年的iphone 17 air将仅支持esim,彻底移除实体sim卡槽结构。随着新品发布日期的临近,国内esim政策的进展也愈发引人关注。 然而综合多方信息来看,iPhone 17 Air国行版本可能无法赶上首发,因前期在国内无法使用eSIM服务,导致该机型短期内难以在国内上市。 相…

    2026年9月22日 • 用户投稿
    000
  • 递归实现列表排序检查与条件移除最大值

    本文详细介绍了如何使用Java递归方法处理整数列表。核心内容包括:首先检查列表是否已排序,如果已排序则直接返回false;如果未排序,则查找列表中的最大值。仅当最大值位于列表的起始或结束位置时,才将其移除并递归地继续处理列表。如果最大值位于列表中间,则打印当前列表并终止递归。 在数据处理和算法设计中…

    2026年9月22日
    000
  • 国泰航空“广州始发礼遇”限时开启,新增广州往返香港航班助力畅游亚洲

    落地即启程,中转再提速,轻松畅游亚洲 秋意正浓,正是踏上旅途的好时机。国泰航空为大湾区“1小时生活圈”注入全新活力——自2025年10月27日起,广州与中国香港之间的往返航班将加密至每日三班,并同步推出“广州始发礼遇”限时优惠活动,让旅客以更实惠的价格畅行亚洲热门目的地。 限时优惠抢先订 亚洲美景随…

    2026年9月22日
    100
  • UC浏览器为什么无法登录某些网站账号_UC浏览器部分网站无法登录原因及对策

    首先关闭广告过滤功能,清除缓存与Cookie,关闭云端加速,切换网络或DNS,最后尝试桌面模式或其他浏览器解决UC浏览器登录无响应问题。 如果您尝试在UC浏览器中登录某个网站账号,但页面无响应或提示错误,则可能是由于浏览器的安全策略、缓存问题或设置限制导致无法正常加载登录界面。以下是解决此问题的步骤…

    2026年9月22日
    100
  • 优化Spring Boot应用:构建高效通用的DTO与实体映射服务

    本文旨在解决Spring Boot项目中DTO与实体间重复映射的痛点。通过引入一个基于泛型的抽象服务层,结合ModelMapper工具,我们展示了如何构建一个类型安全、可重用的通用映射机制。此方案显著减少了样板代码,提升了代码的可维护性和开发效率,避免了手动类型转换的繁琐与潜在错误。 在构建基于sp…

    2026年9月22日
    100

发表回复

登录后才能评论
关注微信