uni-app App中video退出全屏后uni-popup的input输入框无法唤起键盘,切到后台再回来才能显示

发布于 1周前 作者 sinazl 来自 Uni-App

uni-app App中video退出全屏后uni-popup的input输入框无法唤起键盘,切到后台再回来才能显示

问题描述

  1. 先退出全屏播放,
    this.videoContext.exitFullScreen()
  2. 暂停视频,
    this.videoContext.pause();
  3. 隐藏video,
    this.mypop3 = false
  4. 打开弹窗
    setTimeout(() => {
      this.$refs.popup.open()
    }, 500)  

弹窗里的输入框

<uni-easyinput maxlength="4" v-model="codeData.code" placeholder="请输入验证码" :inputBorder="false">

第一次输入框可以正常输入,第二次无法唤起键盘


8 回复

HBuilderX 4.0.2024012711-alpha 已修复。


我4.06 还是出现啊

这个是有问题,已上报官方,vue3 下会出现

已复现,结束全屏之后,键盘不能弹出,附上测试代码,交给客户端同事排查

安卓小米 13 复现,ios 未复现

回复 DCloud_UNI_OttoJi: 那nvue页面使用video,自定义了弹幕输入框,视频全屏播放时,点击输入框,键盘闪一下就立马收起了

回复 菜菜2: 单独提问吧

在 uni-app 中,video 组件退出全屏后,uni-popup 中的 input 输入框无法唤起键盘的问题,可能是由于 video 组件的全屏模式与 input 的焦点管理之间存在冲突。以下是一些可能的解决方案:

1. 延迟设置焦点

video 退出全屏后,尝试延迟设置 input 的焦点,以确保 video 组件已经完全退出全屏模式。

onVideoFullscreenChange(e) {
  if (!e.detail.fullScreen) {
    setTimeout(() => {
      this.$refs.input.focus();
    }, 300); // 延迟 300ms
  }
}

2. 强制刷新页面

video 退出全屏后,强制刷新页面或重新渲染 uni-popup 组件,以确保 input 能够正常获取焦点。

onVideoFullscreenChange(e) {
  if (!e.detail.fullScreen) {
    this.$forceUpdate(); // 强制刷新页面
    this.$nextTick(() => {
      this.$refs.input.focus();
    });
  }
}

3. 使用 uni.hideKeyboarduni.showKeyboard

video 退出全屏后,手动隐藏并重新显示键盘,以触发键盘的重新唤起。

onVideoFullscreenChange(e) {
  if (!e.detail.fullScreen) {
    uni.hideKeyboard();
    this.$nextTick(() => {
      uni.showKeyboard({
        input: this.$refs.input
      });
    });
  }
}

4. 使用 uni.createSelectorQuery 获取 input 并设置焦点

通过 uni.createSelectorQuery 获取 input 元素并手动设置焦点。

onVideoFullscreenChange(e) {
  if (!e.detail.fullScreen) {
    uni.createSelectorQuery().select('#inputId').node((res) => {
      if (res.node) {
        res.node.focus();
      }
    }).exec();
  }
}

5. 检查 video 组件的 fullscreen 事件

确保 video 组件的 fullscreen 事件正确触发,并在事件回调中处理 input 的焦点问题。

<video @fullscreenchange="onVideoFullscreenChange"></video>
methods: {
  onVideoFullscreenChange(e) {
    if (!e.detail.fullScreen) {
      this.$refs.input.focus();
    }
  }
}

6. 使用 uni.onAppShow 监听应用回到前台

如果以上方法都无法解决问题,可以尝试在应用回到前台时手动设置 input 的焦点。

onLoad() {
  uni.onAppShow(() => {
    this.$refs.input.focus();
  });
}

7. 检查 uni-popupmask 属性

确保 uni-popupmask 属性没有阻止 input 获取焦点。可以尝试将 mask 设置为 false

<uni-popup :mask="false"></uni-popup>

8. 使用 uni.setNavigationBarTitle 强制刷新页面

通过设置导航栏标题来强制刷新页面,以确保 input 能够正常获取焦点。

onVideoFullscreenChange(e) {
  if (!e.detail.fullScreen) {
    uni.setNavigationBarTitle({
      title: 'New Title'
    });
    this.$nextTick(() => {
      this.$refs.input.focus();
    });
  }
}

9. 检查 inputfocus 方法

确保 inputfocus 方法能够正常调用,并且 input 元素已经正确渲染。

onVideoFullscreenChange(e) {
  if (!e.detail.fullScreen) {
    this.$nextTick(() => {
      this.$refs.input.focus();
    });
  }
}

10. 使用 uni.createVideoContext 控制 video 组件

通过 uni.createVideoContext 控制 video 组件,确保在退出全屏后正确处理 input 的焦点问题。

onVideoFullscreenChange(e) {
  if (!e.detail.fullScreen) {
    const videoContext = uni.createVideoContext('myVideo');
    videoContext.exitFullScreen();
    this.$nextTick(() => {
      this.$refs.input.focus();
    });
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!