将addEventListener添加到所有按钮

艾伦

好吧,这就是问题,我已经使用属性“ data-key”以这种方式将音频与按键进行匹配:

const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
const key = document.querySelector(`.key[data-key="${e.keyCode}"]`);

现在,我想做同样的事情,但是点击底部。我已经尝试过,就像您可以在JavaScript片段的末尾看到的那样,为所有按钮添加了一个循环,但是看起来很尴尬,只能运行一个音频。

function playSound(e) {
  const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`);
  const key = document.querySelector(`.key[data-key="${e.keyCode}"]`);
  if (!audio) return; // this stop the function from running all together.
  audio.currentTime = 0; // this rewind the audio to the start
  audio.play(key);
  key.classList.add("playing");
}

function removeTransition(e) {
  if (e.propertyName !== "transform") return; // skip it if it's not a transform
  this.classList.remove("playing");
}
const keys = document.querySelectorAll(".key");
keys.forEach((key) => key.addEventListener("transitionend", removeTransition));
document.addEventListener("keydown", playSound);

for (var i = 0; i < document.querySelectorAll(".beat").length; i++) {
  document.querySelectorAll(".beat")[i].addEventListener("click", function () {
    var clickAudio = new Audio(
      "https://sampleswap.org/samples-ghost/DRUMS%20(FULL%20KITS)/DRUM%20MACHINES/808%20Basic/22[kb]conga1.aif.mp3"
    );
    clickAudio.play();
  });
}
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="style.css" />
    <link
      href="https://fonts.googleapis.com/css2?family=Righteous&display=swap"
      rel="stylesheet"
    />
    <link
      href="https://fonts.googleapis.com/css2?family=Wallpoet&display=swap"
      rel="stylesheet"
    />

    <title>BEATS MACHINE</title>
  </head>
  <body>
    <div class="container-808">
      <div class="name-and-display-container">
        <div class="display">
          <span class="beats-controler">120.BPM</span>
        </div>
        <div class="name">
          <h1>Rhythm Designer</h1>
          <h3>RD-808</h3>
        </div>
      </div>
      <div class="keys-container">
        <button data-key="81" class="key beat first-row">
          <kbd>Q</kbd><span class="sound">CONGA</span>
        </button>
        <button data-key="87" class="key beat first-row">
          <kbd>W</kbd><span class="sound">HI HAT</span>
        </button>
        <button data-key="69" class="key beat first-row">
          <kbd>E</kbd><span class="sound">HAND CLAP</span>
        </button>
        <button data-key="82" class="key beat second-row">
          <kbd>R</kbd><span class="sound">HIGH TOM</span>
        </button>
        <button data-key="84" class="key beat second-row">
          <kbd>T</kbd><span class="sound">OPEN HIGH HAT</span>
        </button>
        <button data-key="89" class="key beat second-row">
          <kbd>Y</kbd><span class="sound">SNARE</span>
        </button>
        <button data-key="85" class="key beat third-row">
          <kbd>U</kbd><span class="sound">LOW CONGA</span>
        </button>
        <button data-key="73" class="key beat third-row">
          <kbd>I</kbd><span class="sound">CRASH</span>
        </button>
        <button data-key="79" class="key beat third-row">
          <kbd>O</kbd><span class="sound">TAMB</span>
        </button>

        <audio
          data-key="81"
          src="https://sampleswap.org/samples-ghost/DRUMS%20(FULL%20KITS)/DRUM%20MACHINES/808%20Basic/22[kb]conga1.aif.mp3"
        ></audio>

        <audio
          data-key="87"
          src="https://sampleswap.org/samples-ghost/DRUMS%20(FULL%20KITS)/DRUM%20MACHINES/808%20Basic/4[kb]cl_hihat.aif.mp3"
        ></audio>

        <audio
          data-key="69"
          src="https://sampleswap.org/samples-ghost/DRUMS%20(FULL%20KITS)/DRUM%20MACHINES/808%20Basic/31[kb]handclap.aif.mp3"
        ></audio>

        <audio
          data-key="82"
          src="https://sampleswap.org/samples-ghost/DRUMS%20(FULL%20KITS)/DRUM%20MACHINES/808%20Basic/17[kb]hightom.aif.mp3"
        ></audio>

        <audio
          data-key="84"
          src="https://sampleswap.org/samples-ghost/DRUMS%20(FULL%20KITS)/DRUM%20MACHINES/808%20Basic/51[kb]open_hh.aif.mp3"
        ></audio>

        <audio
          data-key="89"
          src="https://sampleswap.org/samples-ghost/DRUMS%20(FULL%20KITS)/DRUM%20MACHINES/808%20Basic/8[kb]snare.aif.mp3"
        ></audio>

        <audio
          data-key="85"
          src="https://sampleswap.org/samples-ghost/DRUMS%20(FULL%20KITS)/DRUM%20MACHINES/80s%20Drum%20Machine/16[kb]80s-LOWCONGA.aif.mp3"
        ></audio>

        <audio
          data-key="73"
          src="https://sampleswap.org/samples-ghost/DRUMS%20(FULL%20KITS)/DRUM%20MACHINES/80s%20Drum%20Machine/83[kb]80s-CRASH1.aif.mp3"
        ></audio>

        <audio
          data-key="79"
          src="https://sampleswap.org/samples-ghost/DRUMS%20(FULL%20KITS)/DRUM%20MACHINES/80s%20Drum%20Machine/20[kb]80s-TAMB1.aif.mp3"
        ></audio>
      </div>
    </div>
    <script src="index.js"></script>
  </body>
</html>

罗科·C·布尔扬
  • 在您的特定情况下,我们不是机器,我们是程序员,而是使用useEvent.key或更确切地说,因为您想国际化键盘-使用Event.code-顺便说一句,我在QWERTZ键盘上,所以下面是应该适用于我的键盘,也适合您的键盘。
  • 预加载您的声音一旦我开始在键盘上打字或单击按钮后,您就不想加载声音!
  • 以与播放声音相同的功能处理按钮样式!
  • 不要肿HTML-使用JS!
  • path用您的声音路径创建一个字符串。
  • 创建一个sounds包含最少已知数据对象,就像一个库一样-每个键实际上都是一个键盘Event.code
  • 使用音频onended事件从按钮中删除“正在播放”的CSS类

const path = "https://sampleswap.org/samples-ghost/DRUMS%20(FULL%20KITS)/DRUM%20MACHINES/";
const sounds = {
  "KeyQ": {src:"808%20Basic/22[kb]conga1.aif.mp3", name:"CONGA"},
  "KeyW": {src:"808%20Basic/4[kb]cl_hihat.aif.mp3", name:"HI HAT"},
  "KeyE": {src:"808%20Basic/31[kb]handclap.aif.mp3", name:"HAND CLAP"},
  "KeyR": {src:"808%20Basic/17[kb]hightom.aif.mp3", name:"HIGH TOM"},
  "KeyT": {src:"808%20Basic/51[kb]open_hh.aif.mp3", name:"OPEN HIGH HAT"},
  "KeyY": {src:"808%20Basic/8[kb]snare.aif.mp3", name:"SNARE"},
  "KeyU": {src:"80s%20Drum%20Machine/16[kb]80s-LOWCONGA.aif.mp3", name:"LOW CONGA"},
  "KeyI": {src:"80s%20Drum%20Machine/83[kb]80s-CRASH1.aif.mp3", name:"CRASH"},
  "KeyO": {src:"80s%20Drum%20Machine/20[kb]80s-TAMB1.aif.mp3", name:"TAMB"},
};

const ELNew = (sel, attr) => Object.assign(document.createElement(sel), attr || {});
const EL_keys = document.querySelector(".keys-container");
const keyBtn = (k) => ELNew("button", {
  classList: "key beat",
  type: "button",
  innerHTML: `<kbd>${k.replace("Key","")}</kbd><span class="sound">${sounds[k].name}</span>`,
  onmousedown: () => playSound(k)
});

// PRELOAD ALL SOUNDS. You dont' want loading delays, right?!
// Also... CREATE KEY BUTTONS as well.
Object.keys(sounds).forEach(k => {
  const soundObj = sounds[k];
  soundObj.audio = new Audio();
  soundObj.audio.src = path + soundObj.src;
  soundObj.audio.preload = true;
  soundObj.audio.load();
  soundObj.button = keyBtn(k); // Create button
  EL_keys.append(soundObj.button); // Append button
});

function playSound(k) {
  if (!(k in sounds)) return;
  const obj = sounds[k];
  obj.audio.currentTime = 0; // this rewind the audio to the start
  obj.audio.play();
  // Animate button:
  obj.button.classList.add("playing");
  obj.audio.addEventListener("ended", () => obj.button.classList.remove("playing"), {once: true});
}

document.addEventListener("keydown", (ev) => playSound(ev.code));
.key kbd { display: inline-block; text-transform: uppercase; padding: 0.5em; margin-right: 5px; }
.key { transition: 0.5s; }
.key.playing { box-shadow: 0 0 100px #0bf, inset 0 0 2em #0bf; }
<div class="keys-container"></div>

TODO:在加载声音时(请参阅:“ PRELOAD ALL SOUNDS”),您可以创建一个加载条。通过阅读此链接有一个想法

PRO-TIP:由于浏览器仅允许在用户单击诸如单击之后播放声音,因此请创建一个按钮,即:“ Load App”,通过单击该按钮可以播放无声(静音)音频。这样一来,您就可以避免浏览器受到预加载和播放其他声音的限制。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法将jQuery UI按钮样式添加到所有按钮Codeigniter

来自分类Dev

无法将jQuery UI按钮样式添加到所有按钮Codeigniter

来自分类Dev

将按钮添加到Android的复制/粘贴栏中的所有应用程序

来自分类Dev

无法将删除按钮添加到表中的所有行

来自分类Dev

Javascript,将事件监听器添加到所有按钮

来自分类Dev

将addeventlistener添加到节点列表

来自分类Dev

将类添加到除按钮,按钮和使用jQuery重置以外的所有输入类型中

来自分类Dev

将父div添加到有跨度的按钮组

来自分类Dev

将按钮添加到具有缩放功能的ScrollView

来自分类Dev

将foo添加到所有fprintf()

来自分类Dev

将所有Glyphicons添加到Bootstrap 3

来自分类Dev

将Change-Id添加到所有提交

来自分类Dev

将整数添加到元组中的所有值

来自分类Dev

将所有vue组件添加到窗口数组

来自分类Dev

kustomize:将imagePullSecrets添加到所有部署

来自分类Dev

将目标添加到所有UIButtons的touchUpInside事件

来自分类Dev

将所有Person对象添加到组合框

来自分类Dev

Magento:将脚本添加到所有页脚页面

来自分类Dev

将Change-Id添加到所有提交

来自分类Dev

将foo添加到所有fprintf()

来自分类Dev

将.svn文件添加到所有文件

来自分类Dev

将所有目录内容添加到jar

来自分类Dev

XSLT:将属性添加到rootnode的所有后代

来自分类Dev

将点击事件添加到所有选定的元素

来自分类Dev

如果条件将所有项目添加到数组

来自分类Dev

将所有行的结果添加到数组中

来自分类Dev

SQL 查询 - 将记录添加到所有类别

来自分类Dev

将事件添加到表单中的所有标签

来自分类Dev

将按钮添加到框架

Related 相关文章

热门标签

归档