2012-09-12 8 views
17

मैं वेब ऑडियो एपीआई के साथ शुरू कर रहा हूं और यह सोच रहा हूं कि क्या jQuery डेटा $ .ajax या $ .load फ़ंक्शन का उपयोग करना संभव है जो XML डेटा प्राप्त करने वाले XMLHttpRequest को बनाने के लिए है। $ .ajax या $ .load समर्थन प्रतिक्रिया टाइप करें = arrayBuffer?

संपादित करें:

function loadAudio() { 
    $.ajax({ 
      url: sourceUrl 
     }).done(function(response){ 
      return response; 
     }) 
    } 

लेकिन मैं एक ArrayBuffer वापस जाने के लिए की जरूरत है:

ठीक है, तो यहाँ क्या मैं अब तक राशि है। तो मैं प्रतिक्रिया को एक ArrayBuffer में कैसे परिवर्तित करूं?

+0

आपको इसे आजमाकर देखना चाहिए। – Musa

उत्तर

16

आपके प्रश्न के बारे में, ऐसा लगता है कि jQuery अभी तक इसका समर्थन नहीं करता है। जैसा कि मैंने नीचे सुझाव दिया है, इसका उपयोग करने से पहले, यह जांचने पर विचार करें कि सुविधा उपलब्ध है या नहीं।

एक्सएचटीएमएलआरक्वेट के साथ, आप अपने सर्वर को ट्रिक कर सकते हैं और सर्वर से इच्छित बाइट्स का प्रतिनिधित्व करने वाली बाइनरी स्ट्रिंग प्राप्त कर सकते हैं। यह पूरी तरह से काम करता है।

var xhr = new XMLHttpRequest(); 
xhr.open('GET', '/your/audio/file.wav', true); 

// Here is the hack 
xhr.overrideMimeType('text/plain; charset=x-user-defined'); 

xhr.onreadystatechange = function(event) { 
    if (this.readyState == 4 && this.status == 200) { 
    var binaryString = this.responseText; 

    for (var i = 0, len = binaryString.length; i < len; ++i) { 
     var c = binaryString.charCodeAt(i); 
     var byte = c & 0xff; //it gives you the byte at i 
     //Do your cool stuff... 

    } 
    } 
}; 

xhr.send(); 

यह काम करता है, यह आम है ... लेकिन ... यह अभी भी एक हैक है।

एक्सएचटीएमएल अनुरोध स्तर 2 के साथ, आप प्रतिक्रिया टाइप को 'arraybuffer' के रूप में निर्दिष्ट कर सकते हैं और वास्तव में ArrayBuffer प्राप्त कर सकते हैं। यह बहुत अच्छा है। समस्या यह जांचना है कि आपका ब्राउज़र इस सुविधा का समर्थन करता है या नहीं।

var xhr = new XMLHttpRequest(); 
xhr.open('GET', '/your/audio/file.wav', true); 
xhr.responseType = 'arraybuffer'; 

xhr.onload = function(e) { 
    if (this.status == 200) { 
    //Do your stuff here 
    } 
}; 

xhr.send(); 

आशा है कि मैंने मदद की।

1

मैंने सर्वर से डेटा स्ट्रिंग के रूप में (जो स्ट्रिंग के लिए एन्कोडेड बेस 64 एन्कोड किया गया है) का उपयोग कर AJAX प्राप्त करते हुए और फिर क्लाइंट साइड पर इसे बेस 64 और फिर सरणी बफर में डीकोड किया।

नमूना कोड

function solution1(base64Data) { 

var arrBuffer = base64ToArrayBuffer(base64Data); 

// It is necessary to create a new blob object with mime-type explicitly set 
// otherwise only Chrome works like it should 
var newBlob = new Blob([arrBuffer], { type: "application/pdf" }); 

// IE doesn't allow using a blob object directly as link href 
// instead it is necessary to use msSaveOrOpenBlob 
if (window.navigator && window.navigator.msSaveOrOpenBlob) { 
    window.navigator.msSaveOrOpenBlob(newBlob); 
    return; 
} 

// For other browsers: 
// Create a link pointing to the ObjectURL containing the blob. 
var data = window.URL.createObjectURL(newBlob); 

var link = document.createElement('a'); 
document.body.appendChild(link); //required in FF, optional for Chrome 
link.href = data; 
link.download = "file.pdf"; 
link.click(); 
window.URL.revokeObjectURL(data); 
link.remove(); 

}

function base64ToArrayBuffer(data) { 
var binaryString = window.atob(data); 
var binaryLen = binaryString.length; 
var bytes = new Uint8Array(binaryLen); 
for (var i = 0; i < binaryLen; i++) { 
    var ascii = binaryString.charCodeAt(i); 
    bytes[i] = ascii; 
} 
return bytes; 

};

संबंधित मुद्दे