如何通过单击播放按钮而不是嵌入来触发 YouTube 视频在 iOS 上的浏览器中播放?
How can I trigger a YouTube video to play in browser on iOS by clicking on a play button instead of the embed?
在我的网站上,我想让用户在不离开页面的情况下观看嵌入的 YouTube 视频,但我不希望在点击之前看到不太风格化的 YouTube 嵌入。
这在桌面设备上完全可行,因为您可以使用 YouTube JavaScript API 触发嵌入播放,但在 iOS 上,播放器的程序化触发播放被封锁。那么如何在 iOS 上执行此操作?
在考虑这个问题时,我认为另一种方法是创建一个不透明的样式层,但您可以单击它。这意味着用户认为他们正在点击一个漂亮的按钮,而实际上他们只是点击嵌入来播放。
原来有一种方法可以做到这一点,使用花哨的(非官方)CSS pointer-events
属性!将此设置为 none
意味着点击不注册,而是直接穿过元素到达它后面的任何地方。在这种情况下,YouTube 嵌入了 iframe。支持是 iOS 6+.
这是一个 JSFiddle 的工作。
请注意,这是针对 iOS(也可能是 Android)的 - 它利用视频开始播放时自动全屏显示的行为。如果您在桌面上观看此内容,叠加层将保持......覆盖。
为了让它更漂亮,还需要进一步完善:
- 处理初始点击并更改 UI,以便他们立即知道视频开始播放。也许隐藏叠加层、淡化它或将其更改为简单地表示 "Loading... "
- 完成后,通过重新创建 iframe 来重置视频
你可以用这种技术做一些棘手的事情,例如有一个由小按钮覆盖的小播放器 iframe。仍然会全屏显示,所以它会正常工作。
但不管怎样,你去吧 - 在 iOS 上播放 YouTube 视频的概念证明,而用户不知道他们点击了嵌入。
iOS 只允许调用 HTMLMediaElement.play
函数,仅由用户事件(例如,从“点击”事件处理程序)调度(触发)。
因此,这样的代码将在 iOS 中工作(因为 player.playVideo
是从用户“点击”事件调度的调用):
<div class="video">
<a href="#" class="play">Play</a>
<iframe width="560" height="315" src="https://www.youtube.com/embed/pqLVAeoRavo?enablejsapi=1" frameborder="0" allowfullscreen allow="autoplay"></iframe>
</div>
<script>
(function() {
var player;
window.onYouTubeIframeAPIReady = function() {
new YT.Player(document.querySelector('.video iframe'), {
events: {
onReady: function(e) {
player = e.target
}
}
})
}
document.querySelector('.video .play').addEventListener('click', function(e) {
e.preventDefault()
player.playVideo()
})
})()
</script>
<script src="https://www.youtube.com/iframe_api"></script>
这样的代码也适用于 iOS(因为初始调用 (playMyVideo()
) 仍在“点击”事件中):
<div class="video">
<a href="#" class="play">Play</a>
<iframe width="560" height="315" src="https://www.youtube.com/embed/pqLVAeoRavo?enablejsapi=1" frameborder="0" allowfullscreen allow="autoplay"></iframe>
</div>
<script>
(function() {
var playMyVideo;
window.onYouTubeIframeAPIReady = function() {
new YT.Player(document.querySelector('.video iframe'), {
events: {
onReady: function(e) {
playMyVideo = function() {
var player = e.target
player.playVideo()
}
}
}
})
}
document.querySelector('.video .play').addEventListener('click', function(e) {
e.preventDefault()
playMyVideo()
})
})()
</script>
<script src="https://www.youtube.com/iframe_api"></script>
但是这样的代码在 iOS 中不起作用(因为 player.playVideo
是从 https://www.youtube.com/iframe_api
脚本而不是从“点击”事件;即只有 window.onYouTubeIframeAPIReady
函数声明出现在“点击”事件中,window.onYouTubeIframeAPIReady
从 https://www.youtube.com/iframe_api
脚本调用:
<div class="video">
<a href="#" class="play">Play</a>
<iframe width="560" height="315" src="https://www.youtube.com/embed/pqLVAeoRavo?enablejsapi=1" frameborder="0" allowfullscreen allow="autoplay"></iframe>
</div>
<script>
(function() {
document.querySelector('.video .play').addEventListener('click', function(e) {
e.preventDefault()
window.onYouTubeIframeAPIReady = function() {
new YT.Player(document.querySelector('.video iframe'), {
events: {
onReady: function(e) {
var player = e.target
player.playVideo()
}
}
})
}
var tag = document.createElement('script')
tag.src = 'https://www.youtube.com/iframe_api'
var firstScriptTag = document.getElementsByTagName('script')[0]
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag)
})
})()
</script>
在我的网站上,我想让用户在不离开页面的情况下观看嵌入的 YouTube 视频,但我不希望在点击之前看到不太风格化的 YouTube 嵌入。
这在桌面设备上完全可行,因为您可以使用 YouTube JavaScript API 触发嵌入播放,但在 iOS 上,播放器的程序化触发播放被封锁。那么如何在 iOS 上执行此操作?
在考虑这个问题时,我认为另一种方法是创建一个不透明的样式层,但您可以单击它。这意味着用户认为他们正在点击一个漂亮的按钮,而实际上他们只是点击嵌入来播放。
原来有一种方法可以做到这一点,使用花哨的(非官方)CSS pointer-events
属性!将此设置为 none
意味着点击不注册,而是直接穿过元素到达它后面的任何地方。在这种情况下,YouTube 嵌入了 iframe。支持是 iOS 6+.
这是一个 JSFiddle 的工作。
请注意,这是针对 iOS(也可能是 Android)的 - 它利用视频开始播放时自动全屏显示的行为。如果您在桌面上观看此内容,叠加层将保持......覆盖。
为了让它更漂亮,还需要进一步完善:
- 处理初始点击并更改 UI,以便他们立即知道视频开始播放。也许隐藏叠加层、淡化它或将其更改为简单地表示 "Loading... "
- 完成后,通过重新创建 iframe 来重置视频
你可以用这种技术做一些棘手的事情,例如有一个由小按钮覆盖的小播放器 iframe。仍然会全屏显示,所以它会正常工作。
但不管怎样,你去吧 - 在 iOS 上播放 YouTube 视频的概念证明,而用户不知道他们点击了嵌入。
iOS 只允许调用 HTMLMediaElement.play
函数,仅由用户事件(例如,从“点击”事件处理程序)调度(触发)。
因此,这样的代码将在 iOS 中工作(因为 player.playVideo
是从用户“点击”事件调度的调用):
<div class="video">
<a href="#" class="play">Play</a>
<iframe width="560" height="315" src="https://www.youtube.com/embed/pqLVAeoRavo?enablejsapi=1" frameborder="0" allowfullscreen allow="autoplay"></iframe>
</div>
<script>
(function() {
var player;
window.onYouTubeIframeAPIReady = function() {
new YT.Player(document.querySelector('.video iframe'), {
events: {
onReady: function(e) {
player = e.target
}
}
})
}
document.querySelector('.video .play').addEventListener('click', function(e) {
e.preventDefault()
player.playVideo()
})
})()
</script>
<script src="https://www.youtube.com/iframe_api"></script>
这样的代码也适用于 iOS(因为初始调用 (playMyVideo()
) 仍在“点击”事件中):
<div class="video">
<a href="#" class="play">Play</a>
<iframe width="560" height="315" src="https://www.youtube.com/embed/pqLVAeoRavo?enablejsapi=1" frameborder="0" allowfullscreen allow="autoplay"></iframe>
</div>
<script>
(function() {
var playMyVideo;
window.onYouTubeIframeAPIReady = function() {
new YT.Player(document.querySelector('.video iframe'), {
events: {
onReady: function(e) {
playMyVideo = function() {
var player = e.target
player.playVideo()
}
}
}
})
}
document.querySelector('.video .play').addEventListener('click', function(e) {
e.preventDefault()
playMyVideo()
})
})()
</script>
<script src="https://www.youtube.com/iframe_api"></script>
但是这样的代码在 iOS 中不起作用(因为 player.playVideo
是从 https://www.youtube.com/iframe_api
脚本而不是从“点击”事件;即只有 window.onYouTubeIframeAPIReady
函数声明出现在“点击”事件中,window.onYouTubeIframeAPIReady
从 https://www.youtube.com/iframe_api
脚本调用:
<div class="video">
<a href="#" class="play">Play</a>
<iframe width="560" height="315" src="https://www.youtube.com/embed/pqLVAeoRavo?enablejsapi=1" frameborder="0" allowfullscreen allow="autoplay"></iframe>
</div>
<script>
(function() {
document.querySelector('.video .play').addEventListener('click', function(e) {
e.preventDefault()
window.onYouTubeIframeAPIReady = function() {
new YT.Player(document.querySelector('.video iframe'), {
events: {
onReady: function(e) {
var player = e.target
player.playVideo()
}
}
})
}
var tag = document.createElement('script')
tag.src = 'https://www.youtube.com/iframe_api'
var firstScriptTag = document.getElementsByTagName('script')[0]
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag)
})
})()
</script>