javascript - 当新视频以模态开始时停止播放其他 Youtube 视频
问题描述
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
function onYouTubeIframeAPIReady() {
var $ = jQuery;
var players = [];
$('iframe').filter(function() {
return this.src.indexOf('https://www.youtube.com/') == 0
}).each(function(k, v) {
if (!this.id) {
this.id = 'embeddedvideoiframe' + k
}
players.push(new YT.Player(this.id, {
events: {
'onStateChange': function(event) {
if (event.data == YT.PlayerState.PLAYING) {
$.each(players, function(k, v) {
if (this.getIframe().id != event.target.getIframe().id) {
this.pauseVideo();
}
});
}
}
}
}))
});
}
});
它们上面的代码适用于嵌入式播放器,但是如果您在所有 iframe 嵌入式视频工作之前点击视频播放,它通常会停止工作,除非您刷新页面。在加载所有 Youtube Embeddes 之后,有没有办法调用此代码?
解决方案
您可以使用onReady
带有 Promises 的事件来确定是否加载了所有视频。它可能是这样的:
function onYouTubeIframeAPIReady() {
var $ = jQuery;
var players = [];
var loaded = [];
var allLoaded = false;
$('iframe').filter(function() {
return this.src.indexOf('https://www.youtube.com/') == 0
}).each(function(k, v) {
var that
if (!this.id) {
this.id = 'embeddedvideoiframe' + k
}
that = this.id;
loaded.push(new Promise(function (resolve, reject) {
players.push(new YT.Player(that.id, {
events: {
'onReady': resolve,
'onStateChange': function(event) {
if (!allLoaded) return;
if (event.data == YT.PlayerState.PLAYING) {
$.each(players, function(k, v) {
if (that.getIframe().id != event.target.getIframe().id) {
that.pauseVideo();
}
});
}
}
}
}))
}));
});
Promise.all(loaded).then(function () {
allLoaded = true;
});
}
推荐阅读
- vue.js - 具有 prop 类型 [String,Number] 的 Vue.js 应用程序。然而得到错误:预期的字符串,得到数字。为什么?
- c# - 数学生成器流行测验
- python - 反复尝试安装 geopandas 得到相同的结果
- azure-functions - 通过 ARM 模板部署 Functions 时 Azure 中的磁盘已满冲突
- django - Django 嵌套序列化器字段 - 空 OrderedDict
- elasticsearch - Elasticsearch:如何将十六进制字符串作为数字类型(整数或长整数)摄取?
- reactjs - 到达断点时如何从 JS 重置 Tailwind 移动菜单
- python - 无法访问 request.json 内容
- unity3d - 强制 Unity 检查是否与触发器发生碰撞
- salesforce - 如何按需捕获由电子邮件转个案创建的重复个案?