javascript - 如何在 React 中处理“播放()失败,因为用户没有先与文档交互”?
问题描述
我正在构建一个需要在页面加载时播放音频的 React.js/Gatsby 应用程序。我知道 Chrome 默认不允许自动播放,所以我在钩子中设置了mousemove
事件侦听器:useEffect
import React, { useEffect, useRef } from 'react'
const VoiceRecording = ({ source }) => {
const audioRef = useRef()
useEffect(() => {
const playAudio = () => {
audioRef.current.play()
removeListeners()
}
window.addEventListener('mousemove', playAudio)
const removeListeners = () => {
window.removeEventListener('mousemove', playAudio)
}
return () => {
removeListeners()
}
}, [])
return (
<div>
<audio src={source} ref={audioRef} controls />
</div>
)
}
这有效,但并不矛盾。当页面加载并且我移动光标时音频确实会播放,但在它播放之前,Gatsby 会抛出此错误:play() failed because the user didn't interact with the document first
. 我在控制台中遇到了同样的错误。此外,每次页面加载时都不会播放音频。它可能播放 4/10 次。
我也尝试过更改和添加/删除muted, autoplay
等属性。没有运气。
任何帮助将不胜感激。谢谢。
解决方案
推荐阅读
- python - 找不到页面 (404) 没有购物车与给定的查询匹配
- kotlin - 如何正确地向 PublishSubject 施加背压?
- amazon-web-services - 如何在 react-native typescript 模板中配置 Amplify UI 组件
- shell - 编写一个 shell 脚本来查找文件中存在的所有元音并打印相应的单词
- python - python程序打印一个变量然后说它没有定义。为什么?
- mockito - 如何检查注入服务中是否调用了方法?
- python - 如何通过在左侧和右侧的加权平均值之间插值来填充缺失值?
- bash - Ansible:为什么这个脚本在通过 ansible 运行时不会记录?
- python - Plotly:如何为两个不同地块的类别使用相同的颜色?
- jupyter-notebook - jupyter-lab 不加载 jupyter_nbextensions_configurator (但 jupyter-notebook 可以)