uni-app video标签和input标签在同一页面下,视频切换全屏后返回input点击聚焦无法弹起键盘

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

uni-app video标签和input标签在同一页面下,视频切换全屏后返回input点击聚焦无法弹起键盘

项目信息 详情
产品分类 uniapp/App
PC开发环境 Windows
PC开发环境版本 Windows 11 专业版22621.2861
HBuilderX类型 正式
HBuilderX版本 3.96
手机系统 Android
手机系统版本 Android 9.0
手机厂商 vivo
手机机型 vivox23
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码:

<template>
<view class="content">
<video style="width: 100%" autoplay controls src="http://www.w3school.com.cn/i/movie.mp4"></video>
<input type="text">
</view>
</template>

操作步骤:

  1. 点击视频全屏按钮
  2. 返回全屏
  3. 点击输入框

预期结果:

可以正常弹出键盘

实际结果:

无法弹出键盘

bug描述:

app版本 一个页面有input 输入框 有video 标签 当切换视频为全屏后返回时,input不能弹起键盘了,经测试ios,华为nova7pro Oppo 红米等手机可以正常弹起,vivox27幻彩版和锤子坚果pro会有此问题出现,目前设备有限只测试到这两款手机存在此问题,希望官方给出解决方案 谢谢


3 回复

这个是个问题,之前已经提给官方了,估计下一版会更新


uni-app 中,当 video 标签和 input 标签在同一页面时,视频切换全屏后返回页面,input 点击聚焦无法弹起键盘的问题,通常是由于全屏视频播放时,页面的焦点管理出现问题导致的。以下是一些可能的解决方案:

1. 使用 focus 方法手动触发键盘

input@focus 事件中,手动调用 inputfocus 方法,确保键盘能够弹起。

<template>
  <view>
    <video id="myVideo" src="your-video-url" controls></video>
    <input type="text" @focus="handleFocus" />
  </view>
</template>

<script>
export default {
  methods: {
    handleFocus(event) {
      // 手动触发 input 的 focus 事件
      event.target.focus();
    }
  }
}
</script>

2. 监听视频全屏状态变化

通过监听视频的全屏状态变化,在全屏退出时手动触发 inputfocus 方法。

<template>
  <view>
    <video id="myVideo" src="your-video-url" controls @fullscreenchange="handleFullscreenChange"></video>
    <input type="text" ref="myInput" />
  </view>
</template>

<script>
export default {
  methods: {
    handleFullscreenChange(event) {
      if (!event.detail.fullScreen) {
        // 视频退出全屏时,手动触发 input 的 focus 事件
        this.$refs.myInput.focus();
      }
    }
  }
}
</script>

3. 使用 setTimeout 延迟触发 focus

有时候,焦点管理的问题可能是由于事件触发的时机问题。可以使用 setTimeout 延迟触发 inputfocus 方法。

<template>
  <view>
    <video id="myVideo" src="your-video-url" controls @fullscreenchange="handleFullscreenChange"></video>
    <input type="text" ref="myInput" />
  </view>
</template>

<script>
export default {
  methods: {
    handleFullscreenChange(event) {
      if (!event.detail.fullScreen) {
        // 延迟 100ms 触发 input 的 focus 事件
        setTimeout(() => {
          this.$refs.myInput.focus();
        }, 100);
      }
    }
  }
}
</script>

4. 使用 uni-appfocus API

uni-app 提供了 uni.createSelectorQuery() 方法,可以通过选择器获取 input 元素并手动触发 focus

<template>
  <view>
    <video id="myVideo" src="your-video-url" controls @fullscreenchange="handleFullscreenChange"></video>
    <input type="text" id="myInput" />
  </view>
</template>

<script>
export default {
  methods: {
    handleFullscreenChange(event) {
      if (!event.detail.fullScreen) {
        // 使用 uni-app 的 API 获取 input 元素并触发 focus
        uni.createSelectorQuery().select('#myInput').node((res) => {
          if (res && res.node) {
            res.node.focus();
          }
        }).exec();
      }
    }
  }
}
</script>

5. 检查 inputreadonly 属性

确保 inputreadonly 属性没有被设置为 true,否则即使聚焦也无法弹起键盘。

<input type="text" readonly="false" />

6. 检查 inputdisabled 属性

确保 inputdisabled 属性没有被设置为 true,否则无法聚焦。

<input type="text" disabled="false" />

7. 检查 inputfocus 事件是否被阻止

确保 inputfocus 事件没有被其他代码阻止或覆盖。

8. 使用 uni-appfocus 方法

uni-app 提供了 uni.pageScrollTo 方法,可以通过滚动页面来触发 inputfocus 事件。

<template>
  <view>
    <video id="myVideo" src="your-video-url" controls @fullscreenchange="handleFullscreenChange"></video>
    <input type="text" id="myInput" />
  </view>
</template>

<script>
export default {
  methods: {
    handleFullscreenChange(event) {
      if (!event.detail.fullScreen) {
        // 使用 uni-app 的 API 滚动页面并触发 input 的 focus 事件
        uni.pageScrollTo({
          selector: '#myInput',
          success: () => {
            uni.createSelectorQuery().select('#myInput').node((res) => {
              if (res && res.node) {
                res.node.focus();
              }
            }).exec();
          }
        });
      }
    }
  }
}
</script>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!