Javascript 如何将Youtube API方法应用于选定的<;iframe>;元素?
我嵌入了许多Youtube视频,这些视频是用react player组件创建的,因此我找不到一种方法来应用iframe api方法,如以下所述:Javascript 如何将Youtube API方法应用于选定的<;iframe>;元素?,javascript,reactjs,iframe,youtube-iframe-api,Javascript,Reactjs,Iframe,Youtube Iframe Api,我嵌入了许多Youtube视频,这些视频是用react player组件创建的,因此我找不到一种方法来应用iframe api方法,如以下所述: <html> <body> <div id="player"></div> <button onclick={stopVideo}>Stop</button> <script> var tag = docu
<html>
<body>
<div id="player"></div>
<button onclick={stopVideo}>Stop</button>
<script>
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
videoId: 'M7lc1UVf-VE',
});
}
function stopVideo() {
player.stopVideo();
}
</script>
</body>
</html>
video = document.getElementsByTagName('iframe')[0]
video.pauseVideo()
以下是完整的组件:
const Slider = (props) => {
const [sliders, setSliders] = useState([])
const [index, setIndex] = useState(0)
//stop and play when change selected video in Carousel
const handleSelect = (selectedIndex, e) => {
let beforeSlide = sliders[index]
let afterSlide = sliders[selectedIndex]
let video
if (beforeSlide.type_rsc == 1) {
if (beforeSlide.resource.indexOf('youtube')) {
video = document.getElementsByTagName('iframe')[0]
console.log(video.getPlayerState())
video.pauseVideo()
}
}
if (afterSlide.type_rsc == 1) {
if (beforeSlide.resource.indexOf('youtube')) {
video = document.getElementsByTagName('iframe')[1]
video.playVideo()
}
}
setIndex(selectedIndex)
}
//loads Youtube API
useEffect(() => {
if (!window.YT) {
const tag = document.createElement('script');
tag.src = 'https://www.youtube.com/iframe_api';
const firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
}
}, [])
//get videos which will be embedded
useEffect(() => {
async function getSlidersClient() {
const rs = await slidersClient()
if (rs.status === 200) {
setSliders(rs.data)
}
}
getSlidersClient()
}, [])
return (
<>
{sliders.length > 0 ? (
<Container className="container-slider margin-top-md">
<Carousel
controls={true}
activeIndex={index}
onSelect={handleSelect}
>
{sliders.map((item, i) => (
<Carousel.Item key={i}>
<ReactPlayer
controls={true}
id={i + item.resource}
url={item.resource}
/>
</Carousel.Item>
))}
</Carousel>
</Container>
) : null}
</>
)
}
export default Slider
const滑块=(道具)=>{
常量[滑块,设置滑块]=useState([])
const[index,setIndex]=useState(0)
//在旋转木马中更改所选视频时停止并播放
const handleSelect=(selectedIndex,e)=>{
let BeforeSiled=滑块[索引]
让afterSlide=滑块[选定的索引]
让视频
如果(beforeSlide.type_rsc==1){
if(beforeSlide.resource.indexOf('youtube')){
video=document.getElementsByTagName('iframe')[0]
console.log(video.getPlayerState())
video.pauseVideo()
}
}
if(afterSlide.type_rsc==1){
if(beforeSlide.resource.indexOf('youtube')){
video=document.getElementsByTagName('iframe')[1]
video.playVideo()
}
}
设置索引(selectedIndex)
}
//加载Youtube API
useffect(()=>{
如果(!window.YT){
const tag=document.createElement('script');
tag.src=https://www.youtube.com/iframe_api';
const firstScriptTag=document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(标记,firstScriptTag);
}
}, [])
//获取将被嵌入的视频
useffect(()=>{
异步函数getSliderClient(){
const rs=等待滑块客户端()
如果(rs.status==200){
固定滑块(rs.data)
}
}
getSlidersClient()
}, [])
返回(
{sliders.length>0(
{sliders.map((项目,i)=>(
))}
):null}
)
}
导出默认滑块
当我尝试应用任何API方法时,我收到此错误:TypeError:video.getPlayerState不是一个函数
但它们确实是文档或答案中提到的函数,因此错误显然是由于其他原因造成的
有没有办法应用youtube API方法来选择元素本身,或者如何实现这一点?您得到的错误是什么。@Sujit.Warrier此错误给我类型错误:video.getPlayerState不是函数。在您提供的链接中,playVideo和pauseVideo方法仅在player对象(YT.player实例)上可用。然而,您在视频对象上调用它,它只是iframe DOM元素的引用。@Sujit.Warrier我认为您所说的方法是正确的。这里的问题是我没有一个player对象,因为iframe是由react player组件生成的,而不是由组件本身生成的YT.player实例。我很想知道iframeapi方法在这种情况下的应用。