2016-08-22 16 views
0

我正在研究HTML5音板,但我碰到了一點障礙...Javascript對象函數調用不會工作

我試圖讓一個停止函數在所有的立即發出聲音。不幸的是,當我從buttonpress調用此函數時,該對象似乎沒有停止功能。對於實際的聲音元素的代碼如下:

// Container to keep all sounds in one place. This is a Dictionary within a dictionary to be able to search by catagory. 
var sounds = {}; 

// Counter to keep track of unique ID's 
var lastID = 0; 


// Base class for initializing Any class 
var Base = function(methods){ 
    var base = function() {  
     this.initialize.apply(this, arguments);   
    }; 

    for (var property in methods) { 
     base.prototype[property] = methods[property]; 
    } 

    if (!base.prototype.initialize) base.prototype.initialize = function(){};  

    return base;  
}; 

//Complete class for the Sound object. Generates its own DIV's and HTML5 tags to play stuff. 
var Sound = Base({ 
    // Init all the variables. 
    initialize: function(name, file, target='Sounds') { 
     this.name = name; 
     this.file = file 
     this.button = null; 
     this.audioelement; 
     this.id = lastID + 1; 
     this.target = target; 
     lastID ++; 


     // Check if the catagory is there, if not: create it with a placeholder object 
     var catagory = sounds[this.target]; 
     if(catagory == null){ 
      sounds[this.target] = {99:null}; 

     } 
     sounds[this.target][this.id] = this; 

     // Call init function 
     this.init(); 
    }, 

    play : function() { 
     obj = this 
     if(obj.audioelement.paused == true){ 
      obj.audioelement.play();  
     }else{ 
      obj.audioelement.pause(); 
      obj.audioelement.fastSeek(0); 
     } 

    }, 
    stop : function(){ 
     obj = this; 
     obj.audioelement.pause(); 
    }, 
    init : function(){ 

     // Statement for JS class based shenanigans. 
     obj = this 

     // Create a button and add some text to it 
     obj.button = document.createElement("BUTTON"); 
     obj.button.appendChild(document.createTextNode(obj.name)); 

     // Set ID's and names to keep track of this button 
     obj.button.id = obj.id; 
     obj.button.name = obj.target; 

     // Get or create parent element. Used for catagory based display 
     var el = getOrCreateElement(obj.target) 
     el.appendChild(obj.button); 

     // Create audio element and set appropriate settings 
     obj.audioelement = document.createElement("AUDIO"); 
     obj.audioelement.src = obj.file; 
     obj.audioelement.name 
     obj.button.appendChild(obj.audioelement); 

     // Add function to play/pause to button 
     obj.button.onclick = buttonClicked; 

}); 
function buttonClicked(){ 
    // Fetch sound from dicionary container using the name and id from the button [SET AT SOUND.INIT()] 
    var sound = sounds[this.name][this.id]; 
    // Call the play function in [SOUND] 
    sound.play(); 
} 

而對於STOPALL功能:

function stopAll(){ 
    // Scroll through the entire dictionary 
    for (var key in sounds){ 
     for (var id in sounds[key]){ 
      // Check if the sound is not a placeholder 
      if(id == 99){ 
       continue; 
      } 
      // Call stop function with fetched object. 
      var sound = sounds[key][id]; 
      sound.stop(); 
     } 
    } 
} 

奇怪的是的是的播放功能似乎工作,但不停止功能。它說物體沒有這個特定的功能......

任何想法都將被appriciated!

WM

+0

如果您需要一些幫助,您應該發佈您用於播放/停止的代碼。 – loretoparisi

+0

實際功能都在那裏。唯一缺少的是調用函數本身的邏輯。我將添加那些功能 –

+0

您是否有任何錯誤信息? – inf3rno

回答

0

for (var x in object)環比的不僅僅是方法,包括對基礎對象的原型的人多了一些性質。

如果您在該內部循環中您將會看到多餘的那個。

嘗試增加這裏面你內心的循環:

if (typeof id !== 'function') { 
    continue; 
} 

編輯:這不完全正確的,但我不是在一個位置,看看它應該是什麼現在。它幾乎在那裏,從記憶中!繼續玩吧。

+0

只有在非ES5環境中才有這種情況,所以在非常老的瀏覽器中。 – inf3rno

+1

打賭你不能猜測我上次做JS工作;) – jedifans

+0

嗯,也許7年前。 :d – inf3rno