当前位置: 首页 > news >正文

实现实时查询并带有查询结果列表的输入框

这个功能主要是实现了一个可以实时查询结果的搜索框,并具备点击外部关闭搜索结果框体的功能,除了v-show和transition依托于vue实现以外其余功能都基于原生JS实现。
效果图:
在这里插入图片描述

该功能的实现主要是很久之前面试被问到过,当时没有做出来,现在兜兜转转又碰到了这个需求,索性一次性写完整,刚好新学到了composition系列事件,
首先解释一下composition系列事件,这个系列事件分为三种类型
conpositionstart在MDN中,对该事件的定义为:文本合成系统(输入法编辑器)开始新的输入合成时会触发,通俗来说就是在中文输入法开始输入时,该事件就会触发,例图如下
在这里插入图片描述
conpositionupdate该事件是文本合成系统更新输入时会触发,例图如下
在这里插入图片描述
conpositionend该事件在MDN中的定义是当文本段落的组成完成或取消时(敲下回车或者空格),compositionend 事件将被触发,例图如下
在这里插入图片描述
敲击回车后
在这里插入图片描述
实现思路:既然可以获取到用户输入的三种状态,那么就需要声明一个变量用来保存输入状态,最后在监听Input事件的回调中,根据输入状态来实现功能。而且在调试过程中发现,同为同步任务的情况下,compositionend事件的触发是要先于input事件的,那么就表明,在input事件触发的时候,一定可以通过compositionend来将用户的输入状态更新为最新状态。这就给开发带来了很大的便利。

使用composition系列事件不同于监听input事件+防抖的地方在于,如果是正在输入的情况,那么input事件在延时到期后就会触发而不会考虑到此时用户是否已经完成输入而需要触发,而composition事件在没有选择备用词或者没有按下空格/回车是不会触发的,从状态管理的角度来看,状态之间的转移更为清晰可控。
该功能主要针对的点还是在于调起文本合成器输入的情况,如果是普通的连续输入数字/英文/英文+数字的场景,则只用基本的防抖+监听input即可。
HTML部分

<van-field><template #input><label><input name="projectName"></label></template>
</van-field>
<transition name="van-fade"><div v-show="visible" class="projectList"><div class="van-ellipsis listItem" v-for="item in 8">项目{{item}}</div></div>
</transition>

JS部分,Vue只需要声明一个变量则不再赘述

const inputDom = document.querySelector('input[name="projectName"]')let typing = false // 初始化为false,保证用户在连续输入英文/数字的情况下也可以正常进入input逻辑function handleEvent(event) {if (event.type === 'compositionstart') {typing = true}if (event.type === 'compositionend') {console.log('compositionend触发了')// 可以在这里给备选list赋值typing = false}if (event.type === 'input' && typing === false) {console.log(event.target.value);console.log('input触发了')// 可以在这里调用接口vm.projectData.name = inputDom.valuevm.visible = !!event.target.value}if (event.type === 'click' && !!inputDom.value) {vm.visible = true}}inputDom.addEventListener("input", debounce(handleEvent, 1000));inputDom.addEventListener("compositionstart", handleEvent);inputDom.addEventListener("compositionend", handleEvent);inputDom.addEventListener('click', handleEvent)document.addEventListener('click', (e) => {if (!inputDom.contains(e.target)) {vm.visible = false}})

相关文章:

  • 数字化转型核心 数据治理神器Hadoop 生态介绍HDFS、Yarn以及HBase/Hive
  • jvm底层
  • 设计一个简单的Qt界面
  • nodejs安装使用React
  • SQLiteC/C++接口详细介绍sqlite3_stmt类(十三)
  • C#多态性
  • 2024/3/24 蓝桥杯
  • 酒店智能水电表管理解决方案:提升效率、节约成本与环保并重
  • go面向对象
  • 软件杯 深度学习 机器视觉 人脸识别系统 - opencv python
  • Leetcode的使用方法
  • 深入解析代理模式:使用场景、实现及应用实例
  • Nextcloud激活被锁用户
  • 深入了解 Flutter 中多种预定义的 Physics 类
  • ideaSSM 学员信息管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目
  • 【剑指offer】让抽象问题具体化
  • 4个实用的微服务测试策略
  • C++11: atomic 头文件
  • CentOS 7 修改主机名
  • Debian下无root权限使用Python访问Oracle
  • JavaScript类型识别
  • PHP面试之三:MySQL数据库
  • Shell编程
  • tweak 支持第三方库
  • 爱情 北京女病人
  • 从0到1:PostCSS 插件开发最佳实践
  • 大整数乘法-表格法
  • 关于springcloud Gateway中的限流
  • 面试遇到的一些题
  • 前端技术周刊 2019-02-11 Serverless
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 世界上最简单的无等待算法(getAndIncrement)
  • 微信小程序开发问题汇总
  • 线上 python http server profile 实践
  • 移动端 h5开发相关内容总结(三)
  • 怎样选择前端框架
  • 字符串匹配基础上
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​批处理文件中的errorlevel用法
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #pragam once 和 #ifndef 预编译头
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (AngularJS)Angular 控制器之间通信初探
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三) diretfbrc详解
  • (转)Google的Objective-C编码规范
  • (转)nsfocus-绿盟科技笔试题目
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • ***利用Ms05002溢出找“肉鸡
  • **python多态
  • .NetCore项目nginx发布