2013-03-13 62 views
0

我想要動態地將一個HTML輸入範圍滑塊值獲取到snareDrum變量的sliderVal參數槽。將HTML輸入範圍值獲取到NEW objects參數

document.getElementById('slider').addEventListener('change', function() { 
var sliderVal = document.getElementById("slider").value; 

// Event handler code....I tried a bunch of different things 


}); 


// Don't know how to get it to the sliderVal argument. 

var snareDrum = new audioApiKey("snareDrum","snare.mp3",false, sliderVal); 









// Abstracted Web Audio playback Block 


var context = new webkitAudioContext(); 
function audioApiKey(domNode,fileDirectory,loopOnOff,playBackSpeed) { 
    this.domNode = domNode; 
    this.fileDirectory = fileDirectory; 
    this.playBackSpeed = playBackSpeed; 
    var bufferFunctionName = bufferFunctionName; 
    var incomingBuffer; 
    var savedBuffer; 
    var xhr; 

     bufferFunctionName = function() {   
     var source = context.createBufferSource(); 
     source.buffer = savedBuffer; 
     source.loop = loopOnOff; 
     source.playbackRate.value = playBackSpeed; 
     source.connect(context.destination); 
     source.noteOn(0); // Play sound immediately 
     }; 
    var xhr = new XMLHttpRequest(); 
    xhr.open('get',fileDirectory, true); 
    xhr.responseType = 'arraybuffer'; 
    xhr.onload = function() { 
    context.decodeAudioData(xhr.response, 
     function(incomingBuffer) { 
     savedBuffer = incomingBuffer; 
     var note = document.getElementById(domNode); 
     note.addEventListener("click", bufferFunctionName , false); 
     } 
    ); 
    }; 
xhr.send(); 
}; 

下面是工作的代碼,但它是通過修改audioApiKeybufferFunctionName

var snareDrumPitchSlider = document.getElementById("snareDrumPitchSlider"); 
var snareDrum = new audioApiKey("snareDrum","snare.mp3",false,"snareDrumPitchSlider"); 


// Abstracted Web Audio playback Block 

var context = new webkitAudioContext(); 

function audioApiKey(domNode,fileDirectory,loopOnOff,pitchSlider) { 
    this.domNode = domNode; 
    this.fileDirectory = fileDirectory; 
    this.pitchSlider = pitchSlider; 
    var bufferFunctionName = bufferFunctionName; 
    var incomingBuffer; 
    var savedBuffer; 
    var xhr; 

     bufferFunctionName = function() {   
     var source = context.createBufferSource(); 
     source.buffer = savedBuffer; 
     source.loop = loopOnOff; 
     var speed = document.getElementById(pitchSlider).value; // Added 
     source.playbackRate.value = speed; 
     source.connect(context.destination); 
     source.noteOn(0); // Play sound immediately 

     }; 

    var xhr = new XMLHttpRequest(); 
    xhr.open('get',fileDirectory, true); 
    xhr.responseType = 'arraybuffer'; 
    xhr.onload = function() { 
    context.decodeAudioData(xhr.response, 
     function(incomingBuffer) { 
     savedBuffer = incomingBuffer; 
     var note = document.getElementById(domNode); 
     note.addEventListener("click", bufferFunctionName , false); 



     } 

    ); 
    }; 
xhr.send(); 
}; 
+1

您將jQuery與javascript混淆了。你只能在jQuery對象上執行jQuery方法。 – 2013-03-13 14:47:52

+0

對不起,修改。 – William 2013-03-13 14:48:46

+0

這就是爲什麼很多時候人們有變量是jquery對象以'$'開始,即'var $ obj = $()'',這樣你就不會忘記什麼是jQuery對象,什麼不是 – Chad 2013-03-13 14:49:28

回答

2

這是一個範圍的問題,由它的外觀完成。嘗試移動監聽器外部的sliderVal聲明,如下所示:

var sliderVal; //feel free to set it to a default 
document.getElementById('slider').addEventListener('change', function() { 
    sliderVal = document.getElementById("slider").value; 
    // Event handler code.... 
}); 


// sliderVal should now be accessible 
var snareDrum = new audioApiKey("snareDrum","snare.mp3",false, sliderVal); 
+0

如果那應該算出它沒有的盒子。在移動輸入範圍滑塊時,在事件處理程序之後放置console.log(sliderVal)不會輸出滑塊值流。 – William 2013-03-13 17:54:41

+0

這是一個範圍問題。我只是希望我不必深入抽象的區塊來補救它。 – William 2013-03-13 18:07:32

+0

如果將console.log放入監聽器中,則每次更改值時都應記錄它。除非您明確地在處理程序中執行函數調用,否則當值更改時,將不會運行處理程序外的代碼。通過你的代碼的外觀,我假設你想每次移動滑塊時更新sliderVal,然後每當新的小軍鼓聲音播放時使用該值,是否正確?如果是這樣,這個代碼應該做的伎倆。 – 2013-03-14 08:18:05