2013-08-28 16 views
5

Próbuję zbudować własny odtwarzacz multimediów SoundCloud, korzystając z opcji dostępnych zarówno w SoundManager2, jak i Soundcloud.JavaScript: wywołanie zwrotne zdarzenia Soundmanager2 i SoundCloud

Tu jest mój bieżący kod:

SC.stream('/tracks/' + this.media.mediaId, function(audio){ 
      audio.load({ 
       onload : function(){ 
        var duration = this.duration; 

       }, 
       onfinish : function(){ 
        self.updatePlayButton(); 
        console.log('Finished'); 
       }, 
       onresume : function(){ 
        self.updatePlayButton(); 
        console.log("resumed"); 
       }, 
       onstop : function(){ 
        self.updatePlayButton(); 
        console.log("Stopped"); 
       }, 
       onpause : function() { 
        self.updatePlayButton(); 
        console.log('Paused'); 
       }, 
       whileplaying : function() 
       { 
        console.log(this.position); 
        self.updateScrubber(this.position/(this.duration/100)); 
        self.$timeLeft.text(self.formatTime(this.position/1000)); 
        console.log(totalPercent,'My position'); 
       } 

      }); 
      self.audio = audio.sID; 
      self.registerEvents(); 
     }); 

Gram audio przy użyciu:

soundManager.getSoundById(self.audio).togglePause(); 

spektaklu dźwiękowej i wszystkie wywołania zwrotne są odpowiednio zwolniony. Ale po wywołaniu "onfinish", po ponownym naciśnięciu play ponownie odtwarza dźwięk, ale nie spowoduje to żadnego z tych zdarzeń.

Co zrobiłem źle?

Odpowiedz

4

Według dokumentacji SC.stream() „Opcje” obiekt może być przekazany jako drugi argument:

SC.stream(trackPath, [options], [callback])

Opcje będą związane z samym soundObject, więc nie będzie trzeba zadeklarować je ponownie podczas wywoływania poszczególnych metod, takich jak .load() i .play()

spróbuj wywołanie takiego:

var myOptions = { 
    onload : function() { 
    var duration = this.duration; 
    }, 
    onfinish : function(){ 
    self.updatePlayButton(); 
    console.log('Finished'); 
    }, 
    onresume : function(){ 
    self.updatePlayButton(); 
    console.log("resumed"); 
    }, 
    onstop : function(){ 
    self.updatePlayButton(); 
    console.log("Stopped"); 
    }, 
    onpause : function() { 
    self.updatePlayButton(); 
    console.log('Paused'); 
    }, 
    whileplaying : function() { 
    console.log(this.position); 
    self.updateScrubber(this.position/(this.duration/100)); 
    self.$timeLeft.text(self.formatTime(this.position/1000)); 
    console.log(totalPercent,'My position'); 
    } 
} 

SC.stream('/tracks/' + this.media.mediaId, myOptions, function(audio){ 
    audio.load(); 
    self.audio = audio.sID; 
    self.registerEvents(); 
}); 

Istnieje kilka innych dziwnych wyglądające rzeczy o kodzie, jak nic nie robić ze zmienną duration wewnątrz funkcji onload. Ponadto użycie zmiennej self przy jednoczesnym użyciu this kończy się wyglądem, jakbyś nie był pewien, czy piszesz Python lub JavaScript, ale może to ma dla ciebie sens.

Mam nadzieję, że dołączenie opcji do soundObject w ten sposób rozwiąże Twój natychmiastowy problem w każdym razie. Powodzenia!

+1

Dla jasności wygląda na to, że @ menzo-wijmenga używa względnie powszechnego wzorca 'var self = this'. Kontroler może mieć takie metody, jak 'updatePlayButton' i' updateTimeLeft' podczas uzyskiwania dostępu do atrybutu 'duration' lub' position' opcji audio poprzez wiązanie zdarzeń (np. 'Self' odnosi się do kontrolera, który wywołuje strumień, podczas gdy' this' odnosi się do obiekt audio). – elreimundo

Powiązane problemy