我正在做一个滚筒机项目,我没有通过一项任务。该任务是:
当我按下与每个.drum-pad相关联的触发键时,应该触发其子元素中包含的音频剪辑(例如,按下Q键应该触发包含字符串“Q”的drum-pad,按下W键应该触发包含字符串“W”的drum-pad,等等)。
我的代码到目前为止:
class Drumset extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
this.handleKeyPress = this.handleKeyPress.bind(this);
}
componentDidMount() {
document.addEventListener("keydown", this.handleKeyPress);
}
handleClick = (event) => {
const audio = event.target.children[0];
audio.play();
};
handleKeyPress = (event) => {
if (
event.key === "q" ||
event.key === "w" ||
event.key === "e" ||
event.key === "a" ||
event.key === "s" ||
event.key === "d" ||
event.key === "z" ||
event.key === "x" ||
event.key === "c"
) {
const audio = event.target.children[0];
audio.play;
console.log("key pressed");
}
};
render() {
return (
<div>
<div id="drum-machine" class="containerx box-middle">
<div id="display" onKeyDown={this.handleKeyPress}>
<div class="container">
<div class="row">
<div class="col">
<button
type="button"
class="drum-pad"
id="Heater-1"
onClick={this.handleClick}
>
Q
<audio
class="clip"
id="Q"
src="https://s3.amazonaws.com/freecodecamp/drums/Heater-1.mp3"
type="audio/mpeg"
></audio>
</button>
我的问题是,每当我按下一个键,handleKeyPress()函数工作,但音频不播放(控制台显示打印)。如何播放音频时,我按下相关的按钮?
2条答案
按热度按时间f4t66c6m1#
问题是这样的:在
handleKeyPress
处理程序中,const audio = event.target.children[0];
不以audio
元素为目标。我已经使用
ref
在用户点击handleKeyPress
中提到的任何键时定位音频。同样,每当我们使用onKeyDown
合成事件时,我们必须使用tabIndex={0}
。请尝试以下代码:)7uhlpewt2#
我设法使它通过测试而不使用onKeyDown属性。我认为解决办法是使用keyCode事件而不是handle keyPress方法中的key事件。请看我对这个问题的解决方案。我希望它能有所帮助,并随时提出任何问题。
常量Map键= { 81:“Q”,87:“W”,69:“E”,65:“A”,83:“S”,68:“D”,90:“Z”,88:“X”,67:“C”};
这是我的代码pend.https://codepen.io/0PENJI/pen/oNPNxgK?editors=1111。你可以跟着我跟进解决方案。谢谢。