2016-05-22 10 views
1

Ich habe mehrere Audioelemente auf einer Seite, die mit JavaScript basierend auf Benutzerauswahlen mithilfe von Kontrollkästchen erstellt werden. Wenn der Benutzer auf eine Schaltfläche "Abspielen" klickt, möchte ich zufällig ausgewählte Audiotracks mit einer vom Benutzer einstellbaren Verzögerung zwischen den Tracks abspielen, bis sie auf die Schaltfläche "Stop" klicken. Ich habe diesen CodeWiedergabe von Audiotracks nach dem Zufallsprinzip ohne Rekursion

function loopmusic(){ 
    if (!looping){ 
    alert('exiting loopmusic()'); 
    return 0; 
    } 
    var audioElements = document.getElementsByTagName('audio'); 
    var index = Math.floor(Math.random() * audioElements.length); 
    //audioElements[index].volume=0.5;  
    $(audioElements[index]).bind("ended", function(){ 
    audioElements[index].pause() 
    loopmusic()  
    }); 
    setTimeout(audioElements[index].play(), delayms); 
} 

Dieser Code angepasst wurde aus dem, was ich hier gelesen: How to play each audio element on a page (HTML, JQuery, Javascript)

Gerade jetzt der Ereignis-Listener scheint nicht die Art und Weise zu handeln ich erwartet hatte, gibt es keine Verzögerung zwischen den Tracks und mehrere Titel gleichzeitig spielen. Ich hätte gern irgendwelche Hinweise, wie man das beheben kann, und wenn ich es ohne Rekursion tun könnte, wäre das vorzuziehen. Dies kann für einige Zeit laufen und ich möchte vermeiden, dass es eine Menge Speicher verbraucht.

+0

Warum rufen Sie '.pause()' nach dem Track abgeschlossen? Wo sind 'Verzögerungszeichen' definiert? – guest271314

+0

Entschuldigung, ich wollte keine Tonne Code veröffentlichen, ja die globale Variable looping und die globale Variable delayms sind definiert, bevor die Funktion loopmusic() aufgerufen wird. Ich habe .pause() angerufen, weil ich es in einem anderen Posting gesehen habe und dachte, es würde die mehreren Tracks gleichzeitig stoppen, aber ich habe keine Ahnung, was an diesem Punkt vor sich geht, daher sind alle Vorschläge willkommen. – user3315297

+0

Haben Sie 'js' auf dem Post versucht? Das heißt, '' '' bei '.play()' bei 'setTimeout' zu entfernen? was sofort '.play()' aufruft? – guest271314

Antwort

0

Gerade jetzt der Ereignis-Listener scheint nicht die Art und Weise handeln wird ich erwartet, gibt es keine Verzögerung zwischen den Spuren und mehr Spuren gleichzeitig spielen.

Sie rufen .play() anstelle der Referenzierung auf .play; versuchen Sie, () folgenden .play() unter setTimeout Anruf zu entfernen. Außerdem scheint das Aufrufen von .pause() bei ended Ereignis nicht erforderlich zu sein. Nicht sicher, wo delayms definiert ist?

setTimeout(audioElements[index].play, delayms); 
+0

Entschuldigung, ich habe nicht mehr Code hinzugefügt, Delayms ist definiert, bevor die Funktion loopmusic() aufgerufen wird, es liegt zwischen 1000 und 6000. Ich habe diesen Ansatz versucht und die Tracks nicht abgespielt: setTimeout (audioElements [index] .play, Verzögerung) ;; Gibt es auch eine Möglichkeit, Rekursion zu vermeiden? – user3315297

+0

Ja, es gibt eine Möglichkeit, Aktionen ohne Rekursion auszuführen. Sie können '.queue()' verwenden. _ "Ich habe diesen Ansatz versucht und die Tracks spielen nicht:" _ Kannst du eine Demonstration erstellen? – guest271314

+0

Ich habe hier ein Jsfiddle erstellt, aber ich habe keine Online-Tracks, ich werde versuchen, Online-Tracks von einer Sekunde zu finden, so dass dies schnell getestet werden kann. https://jsfiddle.net/mscir/0qst1sLw/6/ – user3315297

Verwandte Themen