每次按下键时,我都会使用下面的JavaScript代码触发一个"keypress“声音。最大的问题是,如果键入过快(似乎在前一个剪辑完成之前),发送到要播放的嵌入标记的下一个剪辑有一个未定义的源。
document.onkeydown = function() {
var numberOfSongs = 3
var sound = new Array(numberOfSongs+1)
sound[0]= "key1.mp3"
sound[1]= "key2.mp3"
sound[2]= "key3.mp3"
function randomNumber(){
var randomLooper = -1
while (randomLooper < 0 || randomLooper > numberOfSongs || isNaN(randomLooper)){ randomLooper = parseInt(Math.random()*(numberOfSongs+1))
}
return randomLooper
}
var randomsub = randomNumber()
var soundFile = sound[randomsub]
document.getElementById("audio").innerHTML = '<EMBED src= "' + soundFile + '" hidden=true autostart=true loop=true>';
}
我认为这是很容易解决的,允许一个剪辑播放,或允许一个剪辑中断前一个剪辑,但这只是猜测。
发布于 2016-03-31 13:28:21
获得undefined
的原因之一是,您试图从数组中获得的值之一是undefined
。
数组问题:
此代码:
var numberOfSongs = 3
var sound = new Array(numberOfSongs+1)
sound[0]= "key1.mp3"
sound[1]= "key2.mp3"
sound[2]= "key3.mp3"
正在构建一个如下所示的数组:
"key1.mp3“、"key2.mp3”、"key3.mp3",未定义
随机数问题:
随机数生成器在数组之外生成值对事情没有任何帮助。
就像现在一样,随机数生成器将返回0到3之间的值,但是数组只有3个位置的值,0、1和2。
性能问题:
最后,您将使用每个按键重新声明声音数组和randomNumber函数.这是不必要的,并将抑制性能,特别是当规模上升。
更新代码:
考虑到这一点,你这样的事情可能会奏效:
var sound = [];
sound.push("key1.mp3");
sound.push("key2.mp3");
sound.push("key3.mp3");
function randomNumber(){
return parseInt(Math.random()*(sound.length))
}
document.onkeydown = function() {
var soundFile = sound[randomNumber()]
document.getElementById("audio").innerHTML = '<EMBED src= "' + soundFile + '" hidden=true autostart=true loop=true>';
}
您可以在这个JS中看到一个这样的例子:https://jsfiddle.net/egrgnmqp/2/
添加更多的.mp3s
如果要将其扩展为具有更多声音文件,则还可以动态生成这些文件,而不必键入被推到数组中的每个文件。例如,如果您想要50个声音,这样的东西可以工作:
var sound = [];
for(var i = 1; i <= 50; i++) {
sound.push("key"+i+".mp3");
}
这个JS有一个更新的示例来说明它的工作方式:https://jsfiddle.net/egrgnmqp/3/
干杯:-)我希望这能帮上忙!
https://stackoverflow.com/questions/36319042
复制相似问题