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

监听键盘事件

问题:点击输入框弹出键盘遮挡文字

需求:点击输入框键盘弹起,点击别处键盘回收,输入框回到原来状态,

解决办法:

1.采用占位的思想(隐藏),文本框控制采用焦点控制,使用两个@focus和@blur这两个法控制,展示键盘,关闭键盘,这里采用v-textarea来写文本框格式,

<v-container><v-row><v-col cols="12"><!-- 文本输入框,绑定v-model来双向绑定数据,使用ref属性以便在JS中引用 --><v-textarealabel="请输入文字"v-model="text"ref="textarea"@focus="showKeyboard"@blur="closeKeyboard"></v-textarea></v-col></v-row></v-container><!-- 占位元素,用于在键盘弹出时调整页面滚动 --><div ref="keyboardDis" :style="{ height: keyboardVisible ? '150px' : '0' }"></div>

这里因为加了text,data数据这部分需要进行初始化,vue2属性,后面方法里面数据需要在data声明,初始化

data: () => ({text: '',lastHeight: 0, // 用于记录窗口高度,以便检测键盘弹出originalScrollPosition: 0, // 用于记录原始滚动位置keyboardVisible: false, // 控制占位元素显示的标志lastScrollY: 0, // 记录页面滚动位置initialViewportHeight: window.visualViewport ? window.visualViewport.height : window.innerHeight,isInputFocused: false,
}),

之后在methods:中进行写方法这里部分通过占位元素来控制文本框位置,当文本框获得焦点时,会调用这个键盘显示的焦点,且占位键盘出现,文本框上移,当文本框失焦时候,这样隐藏占位元素恢复到原始滚动位置。

showKeyboard() {this.keyboardVisible = true;this.originalScrollPosition = window.scrollY; // 记录原始滚动位置console.log("orginalscroll",this.originalScrollPosition);this.$nextTick(() => { // 确保DOM更新完成后执行const keyboardDis = this.$refs.keyboardDis;keyboardDis.style.display = "block"; // 显示占位元素// window.addEventListener('scroll', this.preventScroll, { passive: false }); // 阻止页面滚动setTimeout(() => { // 延迟执行,确保键盘已经弹出const scrollHeight = window.scrollY + keyboardDis.offsetHeight;console.log("scrollheight",scrollHeight);window.scrollTo(0, scrollHeight); // 滚动页面,使输入框可见}, 300);});},// 关闭键盘时调用的方法closeKeyboard() {const keyboardDis = this.$refs.keyboardDis;keyboardDis.style.display = "none"; // 隐藏占位元素console.log("or",this.originalScrollPosition);window.scrollTo(0, this.originalScrollPosition); // 恢复到原始滚动位置},

现在解决了点击文本框聚焦问题,但是现在未解决的部分是如下图右上角有个下拉箭头部分,点击收起键盘,理应文本框也会恢复原来的状态,但是目前是无法实现,

 采用了事件监听方法:使用resize事件监听方法,在mounted()加入事件监听,

window.addEventListener('resize',this.handleResize);

这样需要释放,在下面写一个方法beforeDestroy()方法,里面写移除resize事件监听,

window.removeEventListener('resize', this.handleResize); // 移除窗口大小变化事件监听

之后再methods中写一个方法handleResize()

handleResize() {const currentHeight = window.innerHeight;console.log("currentheight",currentHeight);if (this.lastHeight && currentHeight < this.lastHeight) {this.showKeyboard(); // 如果高度变小,可能是键盘弹出console.log("1111",1111111);} else {this.closeKeyboard(); // 如果高度恢复正常,可能是键盘收起console.log("2222",222222);}this.lastHeight = currentHeight; // 更新记录的窗口高度},

但是原理就是安卓的键盘是浮于页面的,所以监听resize事件监听不到,所以上面事件不会监听到,键盘主动收起,也不会执行逻辑,但是息屏是改变resize事件,可以监听到,所以会调逻辑,

同时也尝试了监听其他事件未果,尝试了加入防抖和节流,也没有成功,

最后使用另一种文本套文本形式完成,但是最后这种组件方式更改样式,如果给文本加类控制样式,没有效果,还是会遮挡,最后改了全局样式才有改变,但是别的弹窗也会跟着一样变化。

相关文章:

  • 每日一练:回文链表
  • 【C#跨平台开发详解】C#跨平台开发技术之.NET Core基础学习及快速入门
  • 并发编程 - GCD信号量
  • 内网与外网的区别
  • 【北京迅为】《STM32MP157开发板使用手册》- 第二十章 Trusted Firmware-A 移植+第二十一章 U-Boot移植
  • HarmonyOS开发实战( Beta5.0)自定义装饰器实践规范
  • 掌握Python自动化:探索keymousego库的无限可能!
  • Oracle OCP认证值得考吗? 需要门槛吗?
  • 【软件设计师真题】下午题第四大题---算法设计
  • 高基数 GroupBy 在 SLS SQL 中的查询加速
  • linux-进程管理-守护进程(Daemon)
  • 讯飞语音转文字怎么样?试试这4款工具吧!
  • 动态规划解决LCS问题
  • ElasticSearch底层原理解析
  • ESXI8.0 vsphere vcenter 多网卡多网段配置
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 《Java编程思想》读书笔记-对象导论
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 10个确保微服务与容器安全的最佳实践
  • Docker: 容器互访的三种方式
  • ES2017异步函数现已正式可用
  • gitlab-ci配置详解(一)
  • java2019面试题北京
  • JavaScript中的对象个人分享
  • RxJS: 简单入门
  • VUE es6技巧写法(持续更新中~~~)
  • vue的全局变量和全局拦截请求器
  • windows下使用nginx调试简介
  • 分布式熔断降级平台aegis
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 通过git安装npm私有模块
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 阿里云ACE认证之理解CDN技术
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • # Apache SeaTunnel 究竟是什么?
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #图像处理
  • (152)时序收敛--->(02)时序收敛二
  • (2)(2.10) LTM telemetry
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (27)4.8 习题课
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (ros//EnvironmentVariables)ros环境变量
  • (办公)springboot配置aop处理请求.
  • (编译到47%失败)to be deleted
  • (四)React组件、useState、组件样式
  • (算法)硬币问题
  • (转)VC++中ondraw在什么时候调用的
  • .form文件_一篇文章学会文件上传
  • /proc/vmstat 详解
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件