vue 监听 input框focus 后虚拟键盘的弹出和收起

1,首先创建一个 virtualkeyboard.js文件  文件名无所谓

/**
 *
 * @class 监听虚拟键盘
 * @classdesc 监听虚拟键盘弹出隐藏
 *  @public onEnd 结束监听虚拟键盘
 *  @public onShow 传递一个回调 监听虚拟键盘弹出
 *  @public onHidden 传递一个回调 监听虚拟键盘隐藏
 */
class VirtualKeyboard {
  /** @param 设备类型 1 安卓 2苹果  */
 

  constructor() {
    this.type = this.IsIA()
    this.originalHeight =
      document.documentElement.clientHeight || document.body.clientHeight
  }

  /**
   * @function  onShow 传递一个回调函数
   * @param  虚拟键盘弹出时触发
   */
  onShow = (fn) => {
    this.show = fn
  }

  /**
   * @function  onHidden 传递一个回调函数
   * @param  虚拟键盘隐藏时触发
   */
  onHidden = (fn) => {
    this.hidden = fn
  }

  /**  @function onStart 开始监听虚拟键盘  */
  onStart = () => {
    if (this.type == 1) {
      //获取原窗口的高度
      window.addEventListener('resize', this.onResize)
    }
    if (this.type == 2) {
      // 苹果系统
      document.body.addEventListener('focusin', this.onFocusin)
      document.body.addEventListener('focusout', this.onFocusout)
    }
  }

  /** @function onEnd 结束 监听 虚拟键盘  */
  onEnd = () => {
    if (this.type == 1) {
      //获取原窗口的高度
      window.removeEventListener('resize', this.onResize)
    }
    if (this.type == 2) {
      document.body.removeEventListener('focusin', this.onFocusin)
      document.body.removeEventListener('focusout', this.onFocusout)
    }
  }

  IsIA = () => {
    if (/android/gi.test(navigator.appVersion)) {
      return 1 //安卓
    } else if (
      navigator.userAgent.indexOf('iPhone') != -1 ||
      navigator.userAgent.indexOf('iPod') != -1 ||
      navigator.userAgent.indexOf('iPad') != -1
    ) {
      return 2 // 苹果
    }
  }

  onResize = () => {
    //安卓系统
    //键盘弹起与隐藏都会引起窗口的高度发生变化
    let resizeHeight =
      document.documentElement.clientHeight || document.body.clientHeight

    if (this.originalHeight - resizeHeight > 50) {
      //当软键盘弹起,在此处操作

      this.show('安卓系统: 当软键盘弹起,在此处操作')
    } else {
      //当软键盘收起,在此处操作
      this.hidden('安卓系统: 当软键盘弹起,在此处操作')
    }
  }
  // 苹果获取焦点
  onFocusin = () => {
    //软键盘弹出的事件处理
    this.show('苹果系统:软键盘弹出的事件处理')
  }

  // 苹果失去焦点
  onFocusout = () => {
    //软键盘收起的事件处理
    this.hidden('苹果系统:软键盘收起的事件处理')
  }
}

export default VirtualKeyboard

2,在需要的页面引入上面创建的js

import VirtualKeyboard from '../plugin/watchKeyBorad'  //这是自己的路径
//然后在周期函数内引入函数即可我是写在mounted函数中的
mounted(){
  this.virtualKeyboard = new VirtualKeyboard() //创建对象
  this.virtualKeyboard.onStart()    //开始监听
//监听虚拟键盘弹出事件
    this.virtualKeyboard.onShow(() => {  
//处理事件  
        console.log('虚拟键盘弹出要执行的事件')
     })
//监听键盘收起的事件
   this.virtualKeyboard.onHidden(() => {
          console.log('键盘收起事件')
        })


}

3,在离开页面的时候一定要注销 监听事件  不然会导致内存泄露

  destroyed(){
        // 一般写在页面卸载或组件卸载的生命周期
        this.virtualKeyboard.onEnd()
    },
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Vue + TypeScript 中,可以使用 `van-field` 的 `input` 事件来监听输入的输入事件。当输入获取焦点时,可以通过代码将焦点移动到其他元素,从而防止键盘弹出。 请参考以下代码: ```vue <template> <van-field ref="yourFieldRefName" v-model="value" label="Label" placeholder="Placeholder" @input="handleInput" /> </template> <script lang="ts"> import { Component, Vue } from 'vue-property-decorator'; @Component export default class YourComponent extends Vue { $refs!: { yourFieldRefName: HTMLInputElement; }; value = ''; handleInput() { // 判断输入是否获取焦点 if (document.activeElement === this.$refs.yourFieldRefName) { // 使用 setTimeout 将焦点移动到其他元素,从而防止键盘弹出 setTimeout(() => { const otherElement = document.getElementById('otherElementId'); if (otherElement) { otherElement.focus(); } }, 0); } } } </script> ``` 在上面的代码中,我们使用了 `van-field` 创建了一个输入,并在 `input` 事件中监听输入的输入事件。当输入获取焦点时,我们将通过代码将焦点移动到其他元素,从而防止键盘弹出。 需要注意的是,我们使用了 `setTimeout` 将焦点移动到其他元素。这是因为在 `input` 事件中,当输入获取焦点时,键盘可能已经弹出。通过使用 `setTimeout`,我们可以将焦点移动到其他元素,并等待一段时间,以确保键盘已经关闭。 上面的代码只是示例,请根据您的具体情况进行调整。希望这可以帮助您解决问题!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a small tree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值