我正在使用下面的JavaScript代码触发"按键"每按一次键就发出声音。 最大的问题是如果输入太快(似乎在上一个剪辑完成之前),发送到要播放的嵌入标签的下一个剪辑有一个未定义的源。
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>';
}
我认为这很容易通过允许剪辑在前一个剪辑上播放,或允许剪辑中断前一个剪辑来解决,但这只是推测。
答案 0 :(得分:0)
您获得object MyObj {
var objs = Set(
MyObj("MyObj1", anotherObjList),
MyObj("MyObj1", anotherObjList),
)
def findAll =
objs.flatMap(_.anotherObjList) // if Set as return type is okay
def findAll: List[Int] =
objs.flatMap(_.anotherObjList)(collection.breakOut) // if elements are of type Int and you want to get a List at the end, not a Set
}
的原因是因为您尝试从数组获取的其中一个值是 undefined
。
数组问题:
此代码:
undefined
构建一个类似于:
的数组[“key1.mp3”,“key2.mp3”,“key3.mp3”,undefined]
随机数问题:
你的随机数生成器通过在数组之外生成值来完全没有帮助。
就像现在一样,你的随机数生成器将返回0到3之间的值,但你的数组只有3个位置的值,0,1和2。
效果问题:
最后,您将使用每个按键重新声明声音数组和randomNumber函数。这是不必要的,会抑制性能,尤其是在向上缩放时。
更新代码:
考虑到这一点,你可以这样做:
var numberOfSongs = 3
var sound = new Array(numberOfSongs+1)
sound[0]= "key1.mp3"
sound[1]= "key2.mp3"
sound[2]= "key3.mp3"
你可以在这个JS小提琴中看到一个例子:https://jsfiddle.net/egrgnmqp/2/
添加更多.mp3s
如果您要扩展它以获得更多声音文件,您还可以动态生成这些文件,而不必输入每个被推入阵列的文件。例如,如果你想要50个声音,这样的东西可以起作用:
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/3/
干杯:-)我希望有所帮助!