自定义播放暂停按钮 - Youtube Iframe
Custom Play Pause buttons - Youtube Iframe
我想在 React 项目的 youtube iframe 上实现自定义 play/pause 按钮,但是无法实现!它 returns 所有类型的错误,例如:当我按下我的自定义静音按钮时,它给出:player.mute is not a function
等等。
这是我使用的代码:
var tag = document.createElement("script");
tag.src = "https://www.youtube.com/iframe_api";
tag.setAttribute("onload", "onYouTubeIframeReady()");
var firstScriptTag = document.getElementsByTagName("script")[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var player;
window.onYouTubeIframeReady = function () {
player = new YT.Player("player", {
videoId: "sGPrx9bjgC8",
autoplay: true,
events: {
onReady: onPlayerReady
}
});
};
function onPlayerReady(event) {
event.target.playVideo();
}
const playVid = () => {
player.playVideo();
};
const unMuteVid = () => {
player.unMute();
};
const muteVid = () => {
player.mute();
};
这是一个CodeSandbox。
非常感谢任何帮助!
根本原因
您的代码 运行 在 App 组件渲染中。
在执行需要修改 DOM 或依赖于 DOM 中存在的组件呈现的元素时,您应该使用 useEffect
挂钩。
在这种情况下,您可以将设置代码移至 useEffect
并使用 useState
挂钩设置播放器。
这样可以确保 iframe 已安装并且引用正确。
看到它在这里工作:https://codesandbox.io/s/distracted-murdock-o96u5?file=/src/App.js
const [player, setPlayer] = useState();
useEffect(() => {
var tag = document.createElement("script");
tag.src = "https://www.youtube.com/iframe_api";
tag.setAttribute("onload", "onYouTubeIframeReady()");
var firstScriptTag = document.getElementsByTagName("script")[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
window.onYouTubeIframeReady = function () {
setPlayer(
new YT.Player("player", {
videoId: "sGPrx9bjgC8",
autoplay: true,
events: {
onReady: onPlayerReady
}
})
);
};
function onPlayerReady(event) {
event.target.playVideo();
}
}, []);
const playVid = () => {
console.log(player);
player.playVideo();
};
const unMuteVid = () => {
player.unMute();
};
const muteVid = () => {
player.mute();
};
带有解决方法的原始答案
虽然我仍然不确定根本原因,但似乎 new YT.Player
没有返回与 onReady 事件中引用的对象相同的对象。
一个解决方法是将 playerReady 事件的 event.target 引用保存到播放器变量中,然后使用它。
function onPlayerReady(event) {
player = event.target;
它在这里工作:
https://codesandbox.io/s/distracted-dream-n2qmi?file=/src/App.js
我想在 React 项目的 youtube iframe 上实现自定义 play/pause 按钮,但是无法实现!它 returns 所有类型的错误,例如:当我按下我的自定义静音按钮时,它给出:player.mute is not a function
等等。
这是我使用的代码:
var tag = document.createElement("script");
tag.src = "https://www.youtube.com/iframe_api";
tag.setAttribute("onload", "onYouTubeIframeReady()");
var firstScriptTag = document.getElementsByTagName("script")[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var player;
window.onYouTubeIframeReady = function () {
player = new YT.Player("player", {
videoId: "sGPrx9bjgC8",
autoplay: true,
events: {
onReady: onPlayerReady
}
});
};
function onPlayerReady(event) {
event.target.playVideo();
}
const playVid = () => {
player.playVideo();
};
const unMuteVid = () => {
player.unMute();
};
const muteVid = () => {
player.mute();
};
这是一个CodeSandbox。
非常感谢任何帮助!
根本原因
您的代码 运行 在 App 组件渲染中。
在执行需要修改 DOM 或依赖于 DOM 中存在的组件呈现的元素时,您应该使用 useEffect
挂钩。
在这种情况下,您可以将设置代码移至 useEffect
并使用 useState
挂钩设置播放器。
这样可以确保 iframe 已安装并且引用正确。
看到它在这里工作:https://codesandbox.io/s/distracted-murdock-o96u5?file=/src/App.js
const [player, setPlayer] = useState();
useEffect(() => {
var tag = document.createElement("script");
tag.src = "https://www.youtube.com/iframe_api";
tag.setAttribute("onload", "onYouTubeIframeReady()");
var firstScriptTag = document.getElementsByTagName("script")[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
window.onYouTubeIframeReady = function () {
setPlayer(
new YT.Player("player", {
videoId: "sGPrx9bjgC8",
autoplay: true,
events: {
onReady: onPlayerReady
}
})
);
};
function onPlayerReady(event) {
event.target.playVideo();
}
}, []);
const playVid = () => {
console.log(player);
player.playVideo();
};
const unMuteVid = () => {
player.unMute();
};
const muteVid = () => {
player.mute();
};
带有解决方法的原始答案
虽然我仍然不确定根本原因,但似乎 new YT.Player
没有返回与 onReady 事件中引用的对象相同的对象。
一个解决方法是将 playerReady 事件的 event.target 引用保存到播放器变量中,然后使用它。
function onPlayerReady(event) {
player = event.target;
它在这里工作: https://codesandbox.io/s/distracted-dream-n2qmi?file=/src/App.js