自定义静音/取消静音按钮 Youtube API
自定义静音/取消静音按钮 Youtube API
前言:
我想说我已经尽力避免重复发布问题,即在Google上搜索,阅读许多类似的问题等等。我发现了很多真正有用的东西,这些东西导致了我具体的情况,我有代码可以展示,因此希望我的最终问题清晰而且可回答。
我有一个简单的网站,用纯HTML和Bootstrap构建CSS。主页上有一个内嵌的全屏Youtube视频,展示一些歌手。因此,希望视频有声音,但我也希望有一个静音按钮,而不会给出全部的Youtube视频控制(暂停/播放,质量,字幕等等)。
我已经成功使用Youtube API在JSFiddle上实现了这一点,可以在他们的开发者页面中找到。http://jsfiddle.net/Bvance/8bzxp9c2/
问题:
问题是,使用来自工作的JsFiddle的完全相同的代码在我的网站上,我会收到错误的信息
Uncaught TypeError: player.isMuted is not a function at HTMLDivElement. (main.js:154)
这是我的HTML:
这是我的Javascript:
//Necessary to laod the Youtube API 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() { console.log(player); player = new YT.Player('myPlayer', { events: { 'onReady': onPlayerReady, 'onStateChange': onPlayerStateChange, 'onError': onPlayerError } }); } function onPlayerError(event) { alert(event.data); } function onPlayerReady() { alert("hey Im ready"); //do whatever you want here. Like, player.playVideo(); } function onPlayerStateChange() { alert("my state changed"); } //Setting the event listener to the mute button document.getElementById("muteButton").addEventListener('click', function (event) { console.log(player); if(player.isMuted()) { player.unMute(); } else { player.mute(); } });
这个Javascript只是完整文件的一部分,但它是文件中的第一件事。我使用了一些JQuery,并在这段代码下面有一个$(document).ready{
。我理解将API调用放在其中是行不通的(我已经尝试过)。
我所尝试过的:
在我的调试过程中,在我调用YT.Player()
之前和之后,我一直将player
对象打印到控制台,发现返回对象没有访问到任何其函数。然而,在检查JSFiddle代码时,打印到控制台时确实显示了所有内容。您可以将此与在使用JSFiddle时打印到控制台的player
对象进行比较。
我尝试将document.getElementById(\"muteButton\").addEventListener
移动到不同的位置,包括在onYouTubeIframeAPIReady()
内部,但都没有效果。我还尝试将整个javascript代码块移到js文件的结尾和 $(document).ready({
内部,只是为了尝试不同的事情。但没有用。
我错过了什么吗?
感谢您阅读到此为止!
更新:
所以我在JSFIddle上胡闹,尝试缩小托管网站的代码,直到它可以像工作的JSFiddle一样工作,但我甚至到达了两个fiddle都相同的程度,但其中一个仍然不起作用。我被难倒了。我甚至将工作的fiddle复制并粘贴到一个新的fiddle中,但新的fiddle也不起作用!我真的不知道发生了什么。
这里的问题在于"player.isMuted()"不一定返回布尔值。它可能返回布尔值,也可能不返回。
因此,您应确保您的检查返回布尔值。这种情况下的快速方法是使用双重否定技巧。所以:
尝试更改:
if(player.isMuted()) { player.unMute(); } else { player.mute(); }
为
if(!!player.isMuted()) { player.unMute(); } else { player.mute(); }
这种方式对我有用。
如果您想了解更多关于此解决方案的信息,请查看以下文章:
codereviewvideos.com/blog/example-javascript-double-negative
或
sitepoint.com/javascript-double-negation-trick-trouble
或 Jamie Treworgy 在这个问题的答案中:
stackoverflow.com/questions/10467475/double-negation-in-javascript-what-is-the-purpose