2016-03-30 10 views
0

Ich verwende den folgenden JavaScript-Code, um jedes Mal, wenn eine Taste gedrückt wird, einen "Tastendruck" auszulösen. Das größte Problem ist, dass wenn Sie zu schnell tippen (es scheint, als ob der vorherige Clip fertig ist), der nächste Clip, der an das Embed-Tag gesendet wird, um abgespielt zu werden, hat eine Quelle von Undefined.Tag-Quelle einbetten Nicht definiert nach Audio

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>'; 
} 

Ich denke, dies leicht, indem eine Klammer befestigt ist, entweder über die vorherigen gespielt werden, oder ein Clip ermöglichen, den vorherigen Clip zu unterbrechen, aber das ist nur Spekulation.

+0

Sie sollten Debounce verwenden, um damit umzugehen. – thangngoc89

+0

Ihre while-Schleife ist wirklich unnötig, Sie können nur eine Zufallszahl zwischen 0 und der Länge des Arrays generieren. –

Antwort

0

Der Grund bist du undefined bekommen ist, weil einer der Werte Sie versuchen, aus dem Array zu bekommen undefined ist.

Array Probleme:

Dieser Code:

var numberOfSongs = 3 
var sound = new Array(numberOfSongs+1) 
sound[0]= "key1.mp3" 
sound[1]= "key2.mp3" 
sound[2]= "key3.mp3" 

ein Array Baut die wie folgt aussieht:,

[ "key1.mp3", "key2.mp3" "key3.mp3", undefined]

 

Random Number Probleme:

Ihr Zufallszahlengenerator ist nicht die Dinge überhaupt durch die Generierung von Werten außerhalb des Arrays zu helfen.

Wie es jetzt ist, Ihr Zufallszahlengenerator wird Rückgabewert zwischen 0 und 3, aber das Array nur Werte in 3 Positionen, 0, 1 und 2.

 

Leistungsprobleme :

Schließlich deklarieren Sie Ihr Sound-Array und die randomNumber-Funktion mit jedem Tastendruck neu. Dies ist unnötig und würde die Leistung beeinträchtigen, insbesondere wenn es nach oben skaliert wird.

 

Aktualisiert Code:

dass Unter Berücksichtigung, Sie so etwas wie dies funktionieren könnte:

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>'; 
} 

Sie ein Beispiel, dass in diesem sehen Fiddle JS: https://jsfiddle.net/egrgnmqp/2/

 

Hinzufügen weitere mp3-Dateien

Wenn Sie diese erweitern werden mehr Sound-Dateien haben, können Sie auch die dynamisch generieren stattdessen wird in das Array aufgesteckt, dass tippen jeweils mit.Wenn Sie zum Beispiel 50 Töne, so etwas wie dies wollte funktionieren könnte:

var sound = []; 
for(var i = 1; i <= 50; i++) { 
    sound.push("key"+i+".mp3"); 
} 

Diese JS Fiddle hat ein aktualisiertes Beispiel dafür, wie das funktionieren würde: https://jsfiddle.net/egrgnmqp/3/

 

Prost :-) Ich hoffe, das hilft!