2013-03-13 83 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