自定义静音/取消静音按钮 Youtube API

39 浏览
0 Comments

自定义静音/取消静音按钮 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对象进行比较。

打印的“player”对象的控制台截图

我尝试将document.getElementById(\"muteButton\").addEventListener移动到不同的位置,包括在onYouTubeIframeAPIReady()内部,但都没有效果。我还尝试将整个javascript代码块移到js文件的结尾和 $(document).ready({内部,只是为了尝试不同的事情。但没有用。

我错过了什么吗?

感谢您阅读到此为止!

更新:

所以我在JSFIddle上胡闹,尝试缩小托管网站的代码,直到它可以像工作的JSFiddle一样工作,但我甚至到达了两个fiddle都相同的程度,但其中一个仍然不起作用。我被难倒了。我甚至将工作的fiddle复制并粘贴到一个新的fiddle中,但新的fiddle也不起作用!我真的不知道发生了什么。

admin 更改状态以发布 2023年5月23日
0
0 Comments

这里的问题在于"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

0