有时您只需要通过页面上的某些用户交互来开始播放视频,而不仅仅是直接点击该视频本身。也许您自己的“播放视频”按钮位于您的页面上,并且您希望在点击该按钮时开始播放该视频。那是 JavaScript 的领域。如果该视频是 YouTube 或 Vimeo 视频,我们需要使用它们提供的 API。没问题。
对于这些示例,我们假设您已经选择了一个视频,并且您将把它放在页面上的一个
对于 YouTube
?enablejsapi=1
1. 确保 iframe src URL 的末尾有 像这样
<iframe src="//www.youtube.com/embed/FKWwdQu6_ok?enablejsapi=1" frameborder="0" allowfullscreen id="video"></iframe>
我还将一个 id 属性放在 iframe 上,以便通过 JavaScript 轻松快速地定位它。
2. 加载 YouTube 播放器 API
您可以直接在 <script>
中链接到它,但他们所有的文档都显示了以 异步风格 加载它,这对于第三方脚本来说总是好的,所以让我们这样做
// Inject YouTube API script
var tag = document.createElement('script');
tag.src = "//www.youtube.com/player_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
onYouTubePlayerAPIReady
的全局函数
3. 创建一个名为 这是 回调函数,YouTube API 在准备就绪时会调用它。它需要命名为这个。
function onYouTubePlayerAPIReady() {
}
您很可能在页面上对 JavaScript 有一些 结构,因此一般情况下,我建议让此函数调用组织系统中的另一个函数,并立即走上正轨。但对于本教程,让我们保持它的“汤汁感”。
4. 创建播放器对象
这是能够控制该视频的对象。我们将使用 HTML 中该 iframe 上的 id
属性来创建它。
var player;
function onYouTubePlayerAPIReady() {
// create the global player from the specific iframe (#video)
player = new YT.Player('video', {
events: {
// call this function when player is ready to use
'onReady': onPlayerReady
}
});
}
另一个回调!
5. 创建“播放器就绪”回调并绑定事件
我们在创建播放器对象时为该函数命名。它会自动将事件对象传递给它,其中 event.target 是播放器,但由于我们已经为此有一个全局变量,所以让我们只使用它。
这里,我们将一个简单的点击事件绑定到页面上 id 为 #play-button 的元素(任何您想要的自定义按钮)并调用播放器对象的 playVideo
方法。
function onPlayerReady(event) {
// bind events
var playButton = document.getElementById("play-button");
playButton.addEventListener("click", function() {
player.playVideo();
});
var pauseButton = document.getElementById("pause-button");
pauseButton.addEventListener("click", function() {
player.pauseVideo();
});
}
现在一起
就这样!这是一个演示
查看 CodePen 上的 Chris Coyier 的笔 YouTube 播放按钮 (@chriscoyier)。
我在里面使用了一些 SVG 模板 来创建按钮,只是为了好玩。
对于 Vimeo
?api=1
1. 确保 iframe src URL 的末尾有 <iframe src="//player.vimeo.com/video/80312270?api=1" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen id="video"></iframe>
我还将一个 id
属性放在 iframe 上,以便通过 JavaScript 轻松快速地定位它。
2. 加载“froogaloop” JS 库
Vimeo 播放器 API 实际上是通过将命令直接发送到 iframe 的 postMessage
来工作的。您不需要 froogaloop 库 来执行此操作,但 postMessage
本身有一些复杂性,而这个库(由 Vimeo 本身创建)使它变得更加容易。此外,它只有 1.8kb,所以我建议使用它。
<script src="froogaloop.min.js"></script>
3. 创建播放器对象
var iframe = document.getElementById('video');
// $f == Froogaloop
var player = $f(iframe);
我们通过添加的 id
属性来定位 iframe。然后我们使用特殊的 froogaloop $f
来创建播放器。
4. 绑定事件
现在我们只需要调用该播放器对象上的方法来播放和暂停视频,所以让我们在点击播放和暂停按钮时调用它们。
var playButton = document.getElementById("play-button");
playButton.addEventListener("click", function() {
player.api("play");
});
var pauseButton = document.getElementById("pause-button");
pauseButton.addEventListener("click", function() {
player.api("pause");
});
现在一起
就这样!这是一个演示
查看 CodePen 上的 Chris Coyier 的笔 Vimeo 视频的暂停/播放按钮 (@chriscoyier)。
您可以使用这两种服务的 API 做更多的事情。这很有趣,直接开始吧!
YouTube 示例在 Chrome 版本 32.0.1700.77 中似乎已损坏。
很奇怪。这是我使用完全相同的浏览器正常工作的屏幕截图:https://chriscoyier.viewscreencasts.com/c8bf7c6643664632a1eee2dcc738e1ad
有趣的是...onPlayerReady 似乎没有被调用。
这是一个屏幕截图
我认为这与 CodePen 有关。我无法让 YouTube iframe 正常工作,即使它独自存在,但我可以在其他地方让它正常工作。
我建议完全清除浏览器缓存。今天对其他人来说,这有效。我们在过去几天对 CodePen 进行了一些基础设施更改,这可能会导致这里出现奇怪的问题。
不,似乎也不是这样。在隐身模式下运行(应该完全清除缓存),但仍然无法正常工作。:/
我还仔细检查了 Chrome 是否只是与 iframe 内部的 iframe 不兼容,但事实并非如此。好吧,代码片段在其他地方可以正常工作,我想这就是这篇文章的重点:P
对我来说也不起作用。Chrome 版本 32.0.1700.102
我让很多人在 Chrome 中试了一下,大约 50% 的人成功了。我希望我能告诉你为什么。如果我在你的网站上使用实际代码,它可能会正常工作。正如你从上面我发布的视频中看到的,我使用的是与你们相同的浏览器,它可以正常工作。
你只需要在 enablejsapi=1 后添加 &html5=1 强制使用 html5 播放器。
有些人可能选择在他们的谷歌帐户上始终使用 html5 播放器。那些没有的人会看到 Flash 播放器失败。
@Paul 在 Chrome 中添加 &html5=1 为我解决了这个问题,尽管我认为这会导致它在需要 Flash 的其他浏览器中失败。不过,这仍然比完全不支持 Chrome 好得多。
是的,HTML5 参数是为我修复它的部分。太可惜了,因为这是一个非常不错的实现。
为了澄清,我不确定 html5 播放器是否适用于所有此技术的实现。我怀疑并非如此,但对于在 CodePen 上使用 YouTube,这将是必要的。可能是由于多个 iframe。
Ubuntu 12.04,Fx 26.0,YouTube 演示对我来说也不起作用……
棒极了。很棒的 Chris!
Vimeo 可以工作,但 YouTube 结果无法工作 #justsaying 顺便感谢
上面有一个关于此的帖子。如果你有其他信息要添加,请务必告诉我,但我认为我们将坚持只有一个“它不起作用”的帖子。
这很有趣,我上周刚对这些 API 进行了一些研究,结果……它不起作用。我认为我没有很好地管理 Yt 的回调函数的强制名称。你确定它不能自定义吗?
非常感谢
太棒了!
感谢 Chris,已收藏!
一旦你让 YouTube API 正常工作,你显然可以用它做很多额外的操作。我经常用 *Google Analytics* 设置自定义事件跟踪,以便检测视频何时开始以及观看整个视频(或观看视频中的某个特定点)的人数。
当然,你可以做的更多,但这似乎是将 YouTube 视频嵌入他们页面的人们的常见需求。
感谢这篇文章,Chris!总是很高兴让人们思考有时被忽视的服务的可能性!
对我来说不起作用。Chrome 32.0.1700.102 / Mac
再说一次,我们将把“不起作用”的内容保留在上面的帖子中。
一如既往地精彩,Chris。
我将尝试将其与更多代码混合,以在视频出现在视窗中并滚动到它时自动启动,就像 Facebook 的最新功能一样。
再次感谢!
我刚刚在我的网站上详细介绍了 Vimeo API 以及在视频播放、暂停或结束时运行一些 JavaScript 的内容。
http://www.mburnette.com/blog/vimeo-javascript-api-basics
另外,我在 Vimeo CodePen 示例上遇到一个奇怪的错误(Mac 上的 Firefox 26.0)。
http://cl.ly/TdDW
非常感谢这些示例。Vimeo/froogaloop2 在本地运行时存在问题,这无法解释 CodePen 错误。为了运行起来,我像这样两次引用了 id:
<iframe id='vid1' src='url/?api=1&player_id=vid1' etc></iframe>
喜欢这篇文章。只有一个问题,除了播放和暂停功能之外,如何在创建自定义 YouTube 播放器时创建进度条功能。
iOS 仍然没有解决方案……不允许通过脚本首次播放视频。
是的,你必须向苹果反映这个问题。想法是,自动播放视频意味着你在没有真正授权的情况下使用了大量数据。如果网站开始在后台自动播放视频广告,这会给人们的数据计划造成很多问题:(!
播放/暂停按钮通过填充替换默认按钮?
你能扩展一下,以便你可以为视频中的不同时间戳设置不同的按钮吗?
我一直想要一个解决方案来解决我做的视频播客的时间戳,以便观众可以加载节目的特定部分。
太棒了!html5 参数正是我想要的。非常感谢你们。
让大家知道,通过 JavaScript API 播放视频不计入 YouTube 观看次数。你需要使用其他分析资源跟踪观看次数。这对一些客户来说是一个很大的问题,他们只想让他们的 YouTube 观看次数增加。
有人知道我需要做些什么才能让它在 iOS 上也能工作吗?当我点击播放按钮时,我只看到一个黑框……
我假设这与 iOS 如何使用 YouTube 应用打开 YouTube 链接有关。你能否提供一些建议?很棒的帖子,顺便说一下。
谢谢!
嗨,Chris,
它运行得很完美,即使在 YouTube 视频 src 的末尾没有“?enablejsapi=1”。为了尝试更改 Firefox 中 iframe 的 z-index,我用“?wmode=transparent”替换了“?enablejsapi=1”,它在 Chrome 和 Firefox 中也同样有效。我认为这值得一提。
谢谢!
Levi
wmode=transparent 特别是 Flash 设置,因此在这种情况下,它只会影响 YouTube Flash 播放器。在使用 z-index 且 Flash 播放器参与时,它是必要的设置,但是你可能需要保留 jsapi 标志,以防你的用户没有看到 Flash 播放器,而你正在使用 JavaScript API。
因此,你希望你的字符串是 ?enablejsapi=1&wmode=transparent
在 IE9 中也不起作用。有不同结果的人吗?
感谢你的帮助。这太棒了!但是我怎样才能让它在同一个页面上的多个视频中工作呢?!
嗨,大家好!我只是想补充一下我关于 Vimeo 播放/暂停 API 方法的评论。
两件事
首先,不要尝试使用 jQuery 查询元素并传递到 Froogaloop 中。它会崩溃。
其次,如果你在本地尝试,请确保运行本地服务器。我一直将 iframe 的 'src' 添加到 'http:' 上以使视频在本地运行,这让我很困惑。我没有收到任何错误,并且点击事件正确触发,但 API 事件没有被调用。