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

html 复制代码
......
<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

javascript 复制代码
    // 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

javascript 复制代码
......
<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的效果

html 复制代码
......
<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)
      }
    }

结果成功

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

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

相关推荐
2501_915921434 小时前
混合开发应用安全方案,在多技术栈融合下构建可持续、可回滚的保护体系
android·安全·ios·小程序·uni-app·iphone·webview
q_19132846954 小时前
基于SpringBoot2+Vue2+uniapp的考研社区论坛网站及小程序
java·vue.js·spring boot·后端·小程序·uni-app·毕业设计
pearbing4 小时前
多平台发力:小程序搜索优化的实用策略指南
小程序·小程序搜索排名·小程序优化·小程序搜索排名优化·小程序搜索优化·小程序seo
2501_915106325 小时前
Charles抓包怎么用 Charles抓包工具详细教程、网络调试方法、HTTPS配置与手机抓包实战
网络·ios·智能手机·小程序·https·uni-app·webview
00后程序员张6 小时前
Fastlane 结合 开心上架,构建跨平台可发布的 iOS 自动化流水线实践
android·运维·ios·小程序·uni-app·自动化·iphone
游戏开发爱好者86 小时前
iOS 性能测试的工程化方法,构建从底层诊断到真机监控的多工具测试体系
android·ios·小程序·https·uni-app·iphone·webview
计算机毕设指导66 小时前
基于Springboot+微信小程序流浪动物救助管理系统【源码文末联系】
java·spring boot·后端·spring·微信小程序·tomcat·maven
2501_916008896 小时前
iOS App 混淆的真实世界指南,从构建到成品 IPA 的安全链路重塑
android·安全·ios·小程序·uni-app·cocoa·iphone
计算机毕设指导67 小时前
基于微信小程序的健康指导平台【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·tomcat·maven
wx_ywyy67987 小时前
同城跑腿小程序核心功能解析:多订单合并、智能计费与实时位置共享
小程序·跑腿小程序·小程序制作·同城小程序·同城服务小程序开发·跑腿小程序开发·外卖小程序开发