修正点击按钮 3 时视频不播放的问题

Eve*_*all 6 html javascript css arrays debugging

如何调试和修复这个问题?

我发现代码非常难以调试。

如何在代码中解决这个问题?

我希望代码能够按照演示代码中的方式工作:https ://jsfiddle.net/awwt6u37/

这data-id适用于哪里:

<button class="playSingle2 cover" type="button" data-container="play1" data-id="-Xgi_way56U"></button>
Run Code Online (Sandbox Code Playgroud)

添加下面给出的答案代码后,如何解决代码中当前存在的问题?

演示代码中的行为:https://jsfiddle.net/awwt6u37/

单击<button> #3时,此处会显示正确的视频。

<div class="playButtonContainer with-curtain ">
  <button class="playSingle0 cover" data-container="play1"></button>
  <button class="playSingle1 cover" data-container="play1"></button>
  <button class="playSingle2 cover" data-container="play1" data-id="-Xgi_way56U"></button>
</div>

function findPlayers() {
    const buttons = document.querySelectorAll(".cover");
    const wrapper = document.querySelector(".wrap");
    buttons.forEach(function addToPlayers(button) {
      players.push({
        "cover": button,
        "wrapper": wrapper
      });
    });
  }

for (let i = 0; i < 3; i++) {
    players.add(".playSingle" + i, (playerVarsList[i] || {}));
  }
Run Code Online (Sandbox Code Playgroud)

应该与这里的代码以相同的方式工作,但有 3 个按钮的编写方式不同。https://jsfiddle.net/7xz6gw1b/

这里需要写什么不同的东西?

function findPlayers() {
    const allCovers = document.querySelectorAll(".cover");
    const allWrappers = document.querySelectorAll(".wrap");
    allCovers.forEach(function addToPlayers(cover, index) {
      players.push({
        "cover": cover,
        "wrapper": (index < allWrappers.length) ? allWrappers[index] : allWrappers[allWrappers.length - 1]
      });
    });
  }

//to add the player to all the play buttons
  let totalPlayButtons = document.querySelectorAll('[data-container="play1"]').length;

  //looping over all the play buttons and adding player to that
  for (let i = 0; i < totalPlayButtons; i++) {
    players.add(".playSingle" + i, (playerVarsList[i % (Object.keys(playerVarsList).length)] || {}));
  }
Run Code Online (Sandbox Code Playgroud)

在演示代码中,单击没有给出播放列表的<button> #3 ,而是从其播放列表中播放视频data-id=""

在此输入图像描述

要重现该问题:

这是我现在正在处理的带有3 个按钮的代码: https ://jsfiddle.net/3htaxrse/

当我点击<button> #3时

在此输入图像描述

我看到了 #1的视频

0: {
      playerVars: {
        playlist: "0dgNc5S8cLI,mnfmQe8Mv1g,-Xgi_way56U,CHahce95B1g"
      }
    }, // Button 1
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

相反,这是应该观看的视频。data-id="-Xgi_way56U"

在此输入图像描述

<div class="playButtonContainer with-curtain ">
  <button class="playSingle0 cover" data-container="play1"></button>
  <button class="playSingle1 cover" data-container="play1"></button>
  <button class="playSingle2 cover" data-container="play1" data-id="-Xgi_way56U"></button>
</div>
Run Code Online (Sandbox Code Playgroud)

这就是我正在处理的代码中试图解决的问题。

如何调整我正在编写的带有3 个按钮的代码,以便播放正确的视频?https://jsfiddle.net/7xz6gw1b/

有没有办法查看演示代码是如何编写的,以便能够对其他代码进行适当的更改?

https://jsfiddle.net/7xz6gw1b/

因为在演示代码中它应该按预期工作。

演示代码: https: //jsfiddle.net/awwt6u37/

查看演示代码有帮助吗?

因为它在那里工作。

尝试修复:

替换这一行:

players.add(".playSingle" + i, (playerVarsList[i % (Object.keys(playerVarsList).length)] || {}));
Run Code Online (Sandbox Code Playgroud)

有了这一行:

players.add(".playSingle" + i, (playerVarsList[i] || {}));
Run Code Online (Sandbox Code Playgroud)

不工作。

我刚刚尝试过。

当我这样做时,它会破坏按钮 3:https ://jsfiddle.net/vpjrsb9z/

单击按钮 3 时根本不显示视频。

也许几乎已经修复了?

第一个视频不再被选择,这很好。

在此输入图像描述

Nin*_*rry 0

发生问题的原因是在您的源代码中,有多个带有“video”类的 div。该代码使用带有“video”类的 div 将视频 ID 从按钮传输到实际的视频播放器。

因为课程视频有多个 div,所以这是行不通的。

一种解决方法是删除第一个类为“play2”的 div 块以及该 div 中包含的所有内容。但是,您可能希望能够在同一页面上设置视频播放器的多个独立实例,因此我们需要修复代码,以便使用具有“Video”类的正确 div。

为此,更改按钮的单击事件处理程序的实现。

从:

const myVideo = document.querySelector('.video');

document.querySelectorAll('button.cover').forEach(function(button) {
  button.addEventListener('click', function(event) {
    myVideo.dataset.id = event.currentTarget.dataset.id;
  });
});
Run Code Online (Sandbox Code Playgroud)

到:

document.querySelectorAll('button.cover').forEach(function(button) {
  button.addEventListener('click', function(event) {
    let container=event.currentTarget.dataset.container;
    let myVideo = document.querySelector('.' + container + ' .video');
    myVideo.dataset.id = event.currentTarget.dataset.id;
  });
});
Run Code Online (Sandbox Code Playgroud)

我们首先从被单击的按钮中获取“容器”。然后我们搜索具有“video”类的 div,该 div 位于具有该容器类的另一个 div 内。

请注意,您不再需要全局myvideo变量。


还将代码更改onYouTubeIframeAPIReady为原始状态:

//to add the player to all the play buttons
let totalPlayButtons = document.querySelectorAll('[data-container="play1"]').length;

//looping over all the play buttons and adding player to that
for (let i = 0; i < totalPlayButtons; i++) {
        players.add(".playSingle" + i, (playerVarsList[i] || {}));
}
players.add(".playInitial", {});
Run Code Online (Sandbox Code Playgroud)

另外,您的退出按钮逻辑存在错误,但这超出了这个问题的范围。如果您在那里遇到问题,请询问另一个问题。

  • 我的退出按钮逻辑有什么错误?我应该如何提出问题? (2认同)
  • 为了能够提出这个问题,我需要知道/理解它出了什么问题。 (2认同)
  • 如何修复我现在收到的代码中的此错误?https://jsfiddle.net/ju5Lqbws/ Uncaught TypeError:无法读取未定义的属性(读取“包装器”)” (2认同)
  • 这里有一些需要调整的地方: //将播放器添加到所有播放按钮 let totalPlayButtons = document.querySelectorAll('[data-container="play1"]').length; //循环所有播放按钮并将播放器添加到其中 for (let i = 0; i &lt; totalPlayButtons; i++) {players.add(".playSingle" + i, (playerVarsList[i] || {})); } (2认同)
  • 发生错误的原因是您在源代码中添加了 `&lt;button class="playInitial cover spinner" type="button" data-container="play1" data-id="EK3h0IADYrQ"&gt;`。这会增加“totalPlayButtons”。更改“totalPlayButtons”的计算方式,以便仅计算实际的播放按钮,而不计算初始播放按钮。 (2认同)