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

微信小程序一个页面同时存在input和textarea,bindkeyboardheightchange相互影响

……
<input/>
……
<textarea……bindlinechange="textareaLineChange"bindinput="onInput"bindblur="onBlur"bindfocus="onFocus"bindconfirm="sendMsg"bindkeyboardheightchange="handleKeyboardheightchange"……>
</textarea>

示例代码如上,当一个页面同时存在input和textarea时,(安卓机型)聚焦唤起键盘都会进入textarea的handleKeyboardheightchange事件。

题主希望的效果是,input的任何操作不应该影响到textarea。

经过排查,与查阅相关资料验证,得出结论与下同

textarea与input的相爱相杀

绑定bindkeyboardheightchange事件

问题:

只为textarea绑定bindkeyboardheightchange事件,input也会触发textarea的bindkeyboardheightchange事件,并且触发所携带的参数都是textarea上面的参数

机型:安卓必现

解决总体思路:区分键盘高度触发事件的来源,是input还是textarea

解决方案1:(验证失败)在textarea的focus事件里,增加聚焦标志,当bindkeyboardheightchange触发,判断textarea是否处于聚焦状态,如果不是,则证明该事件来源不是这个textarea

    // textarea聚焦const onFocus = e => {……isFocus= true……}// textarea失焦const onBlur = e => {……isFocus= false……}// 键盘高度变化监听回调const handleKeyboardheightchange = e => {if (isFocus) {// textarea正在聚焦,可以处理textarea的键盘高度变化ctx.triggerEvent('onKeyboardChange', e.detail)}}

结果失败

失败原因:键盘高度变化事件先于聚焦事件触发(实测,有7~10ms的时间间隔)

--------------------------------------------------------------------------------------------------------

解决方案2:(验证失败)在textarea上面绑定data-xxx,用e.target.dataset.id来判断事件来源是不是textarea

……
<input/>
……
<textarea……data-id="footer-textarea"bindlinechange="textareaLineChange"bindinput="onInput"bindblur="onBlur"bindfocus="onFocus"bindconfirm="sendMsg"bindkeyboardheightchange="handleKeyboardheightchange"……>
</textarea>// 键盘高度变化监听回调const handleKeyboardheightchange = e => {if (e.target.dataset.id === 'footer-textarea') {// 事件来源是textarea,可以处理textarea的键盘高度变化ctx.triggerEvent('onKeyboardChange', e.detail)}}

结果失败

失败原因:input会触发textarea绑定的键盘高度变化事件,且事件来源是textarea。根本无法通过data-id来判断事件来源,因为来源都是textarea。

--------------------------------------------------------------------------------------------------------

解决方案3:(成功)给textarea绑定bindtap事件,用bindtap事件来实现方案1的效果

……
<input/>
……
<textarea……bindlinechange="textareaLineChange"bindtap="textareaTap"bindinput="onInput"bindblur="onBlur"bindfocus="onFocus"bindconfirm="sendMsg"bindkeyboardheightchange="handleKeyboardheightchange"……>
</textarea>let canDealKeyboard = false // 是否需要处理键盘高度变化事件const textareaTap = e => {canDealKeyboard = true}// textarea聚焦const onFocus = e => {……canDealKeyboard = true……}// textarea失焦const onBlur = e => {……canDealKeyboard = false……}// 键盘高度变化监听回调const handleKeyboardheightchange = e => {if (canDealKeyboard) {// textarea正在聚焦,可以处理textarea的键盘高度变化ctx.triggerEvent('onKeyboardChange', e.detail)}}

结果成功

成功原因:事件触发顺序是 点击事件--键盘变化事件--聚焦事件

点击事件先于键盘变化事件触发,可以在这个节点增加判断标志


文章转载自:

http://y9ZLSi6n.cdrzw.cn
http://oBFjHbNB.cdrzw.cn
http://zm8JTyWM.cdrzw.cn
http://P3PhEHkW.cdrzw.cn
http://sJORSgb0.cdrzw.cn
http://fibBQbzr.cdrzw.cn
http://7Pu0USCs.cdrzw.cn
http://WOqGyqGR.cdrzw.cn
http://Wjek9LWM.cdrzw.cn
http://FViodZDR.cdrzw.cn
http://bWyGn6CL.cdrzw.cn
http://gVky7SB6.cdrzw.cn
http://IlZMz4QJ.cdrzw.cn
http://t0Qsvv9J.cdrzw.cn
http://TZ7gzgzl.cdrzw.cn
http://EgxySbZX.cdrzw.cn
http://0fpZ9mFN.cdrzw.cn
http://uAW8rs82.cdrzw.cn
http://wru8Vsjb.cdrzw.cn
http://lhNUdqGH.cdrzw.cn
http://XYgiop7B.cdrzw.cn
http://bq6In6vG.cdrzw.cn
http://CoQaijj6.cdrzw.cn
http://ue8CkZfa.cdrzw.cn
http://MmFQEnV2.cdrzw.cn
http://ZPyyKpUm.cdrzw.cn
http://djXh36HG.cdrzw.cn
http://cVl8l4Ig.cdrzw.cn
http://SY8ezZsd.cdrzw.cn
http://cXpQ6tij.cdrzw.cn
http://www.dtcms.com/a/368153.html

相关文章:

  • mac怎么安装uv工具
  • python库 Py2app 的详细使用(将 Python 脚本变为 MacOS 独立软件包)
  • AmbiSSL
  • 【高分论文密码】大尺度空间模拟与不确定性分析及数字制图技术应用
  • MacOS 通过Homebrew 安装nvm
  • 【NotePad++设置自定义宏】
  • baml:为提示工程注入工程化能力的Rust类型安全AI框架详解
  • 【详细指导】多文档界面(MDI)的应用程序-图像处理
  • Kubernetes(k8s) 增量更新 po
  • 还在为第三方包 bug 头疼?patch-package 让你轻松打补丁!
  • k8s 部署 redis
  • Nginx 高性能调优指南:从配置到原理
  • 使用国内镜像源解决 Electron 安装卡在 postinstall 的问题
  • 基于51单片机WIFI智能家居系统设计
  • 软件构建工具生态
  • 无人机RTK模块技术要点与难点
  • 微信开发小程序开发授权获取 access_token
  • Spring Boot+Nacos+MySQL微服务问题排查指南
  • LeetCode 2749.得到整数零需要执行的最少操作数:很独特的一道数学题(多公式硬讲——一步步还真能看懂)
  • 【C++】vectore
  • 柯尼卡美能达打印机SMB服务设置
  • 【VoNR】VoNR是5G语音,VoLTE是4G语音,他们是同一个IMS,只是使用了新的访问方式?
  • Android/Java 泛型全面详解
  • 国产化PDF处理控件Spire.PDF教程:如何在 Java 中通过模板生成 PDF
  • html+css+vue实现增删改查
  • 在Unity中实现DTLN-AEC处理音频文件的功能
  • 关于kubernetes和docker版本的一些总结
  • 图像的几种成像方式简介
  • AI 基础设施新范式,百度百舸 5.0 技术深度解析
  • 中创中间件适配HGDB