【问题标题】:jQuery problem referencing id - Using Howler.js引用 id 的 jQuery 问题 - 使用 Howler.js
【发布时间】:2020-02-22 13:22:23
【问题描述】:

我有一个迷宫我正在努力排序:

我有这个带有 12 个锚标记的网格

for (let i = 1; i <= 12; i++) {
  $("#minuetti").append(
    `<div class="col-6 col-md-3"> <a id="minuetto${i}" class="btn btn-primary btn-lg mb-1 minuetto">Minuetto ${i}</a></div>`
  );
}

每一个都将使用 Howler.js 播放不同的 mp3 文件。

$(".minuetto").on("click", function() {
  let id = this.id;
  let minuettoPath = `assets/music/${id}.mp3`;
  let cell = new Howl({
    src: [minuettoPath],
    onplay: function() {
      $(`#${id}`).text("Stop");
      $(".minuetto").addClass("disabled");
      $(`#${id}`).removeClass("disabled");
      $(`#${id}`).removeClass("minuetto");
      $(`#${id}`).on("click", function() {
        cell.stop();
      });
    },
    onend: function() {
      $(".minuetto").removeClass("disabled");
      $(`#${id}`).text(`Minuetto ${id.slice(8)}`);
      $(`#${id}`).addClass("minuetto");
      this.unload();
    }
  });
  cell.play();
});

我的问题:

我正在尝试更改单击按钮的文本并使其保持启用状态。 我将禁用所有剩余的 (11) 按钮,直到 mp3 文件结束。 但是当我点击启用的按钮(播放的那个)而不是停止我的 mp3 时,它会重新启动。 我在这里的 jQuery 做错了什么?我引用我的 id 并调用函数来执行 cell.stop() 但由于某种原因 jQuery 再次运行播放,即使我从播放按钮中删除了 minuetto 类。 我真的很困惑。请帮忙?

【问题讨论】:

  • PS:永远不要在循环中追加或构造 DOM。连接字符串或数组并在循环之后追加一次。
  • 非常感谢@RokoC.Buljan,我会调查的。但这不会解决我与 jQuery 和 Howler 的斗争。无论如何,你所说的很有趣,我对此很陌生,很想知道如何用适当的方法来达到同样的效果。 :)

标签: javascript jquery howler.js


【解决方案1】:
  • 只使用const sound = new Howl({src: mp3.path});
  • 使用 jQuery 的 Object Element 构造函数 $({}) 创建一个元素
  • 分配所需的事件,例如 click()play()stop(),您可以在需要时 trigger 并执行所需的操作
  • 使用 Howler 的 sound.playing() 来确定需要哪个触发器回调

// Use an array of objects instead, otherwise if one day
// you decide to remove a numeric song you'll have to replace it with another.
// This also allows you to change the order of songs:
const mp3list = [
  {name:'Enter Sandman', path:'https://upload.wikimedia.org/wikipedia/en/3/39/Metallica_-_Enter_Sandman.ogg'},
  {name:'Back in Black', path:'http://upload.wikimedia.org/wikipedia/en/4/45/ACDC_-_Back_In_Black-sample.ogg',},
  {name:'U2 - One', path:'https://upload.wikimedia.org/wikipedia/en/5/5e/U2_One.ogg',},
];

let $allMP3 = [];

const $newMP3 = mp3 => {

  // HOWL
  const sound = new Howl({src: mp3.path});

  // $ ELEMENT
  return $('<div>', {
    class: 'minuetto',
    text: mp3.name,
    on: {
      click() {
        $allMP3.forEach($el => $el.not(this).trigger('stop'));
        $(this).trigger(sound.playing() ? 'stop' : 'play');
      },
      play() {
        $(this).text("Stop");
        sound.play();
      },
      stop() {
        $(this).text(mp3.name);
        sound.stop();
      }
    }
  });
};

$allMP3 = mp3list.map($newMP3); // Populate array of $ elements
$("#minuetti").append($allMP3); // Append once!
<div id="minuetti"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/howler/2.1.3/howler.min.js"></script>
<script src="https://code.jquery.com/jquery-3.1.0.js"></script>

【讨论】:

  • 哦,这真是太棒了!我意识到我离想出这样的事情还有多远!!非常感谢!您的回答打开了一个充满可能性的世界,但我现在的问题比答案更多:) 第一个(也是愚蠢的)问题:如何使用每个按钮在其各自的列中填充 DOM?第二:这是我正在进行的项目。我认为(在你回答之后)我做错了! :(你有机会帮助我吗?太棒了!回购:github.com/GBrachetta/Musical-Dice 直播:gbrachetta.github.io/Musical-Dice(12 个按钮还没有)
  • @GuillermoBrachetta 好的,让我看看你得到的代码
  • 这是最新的,试图将所有 12 个完整的片段全部预览。最终我打算让用户从其中选择随机化:github.com/GBrachetta/Musical-Dice/tree/develop
  • 我打算使用这样的东西让用户创建要随机化的字母字符串:let letters = []; $("input").change(function() { let selected = $(this).val(); if ($(this).is(":checked")) { letters.push(selected); } else { letters.splice($.inArray(selected, letters), 1); } let choice = letters.join(""); console.log(choice: ${choice}); // console.log(letters: ${letters.sort()} ); let sorted = letters.sort().join(""); // Gives me a string with chosen letters ordered alphabetically console.log(sorted: ${sorted}); });
  • 我还注意到,在调用 randomise() 几次之后,网格中单个单元格的声音会完全失真......
猜你喜欢
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多