2010-02-25 22 views
5

मैं एक वेब एप्लिकेशन लिख रहा हूं जिसमें वेबपृष्ठ पर छवियों की एक उचित संख्या बनाने (और हटाने) का निरंतर चक्र शामिल है। प्रत्येक छवि सर्वर द्वारा गतिशील रूप से जेनरेट की जाती है।मैं एक निरस्त AJAX अनुरोध से बाइनरी छवि डेटा कैसे वापस कर सकता हूं और परिणाम को HTML/DOM छवि के स्रोत पर सेट कर सकता हूं?

var img = document.createElement("img"); 
img.src = "http://mydomain.com/myImageServer?param=blah"; 

कुछ मामलों में, इनमें से कुछ छवियां डाउनलोड करने से पहले उनकी उपयोगिता को पार करती हैं। उस बिंदु पर, मैं उन्हें डोम से हटा देता हूं।

समस्या यह है कि ब्राउजर उन छवियों को डाउनलोड करने के लिए भी जारी है उन्हें DOM से हटा दिए जाने के बाद। इससे एक बाधा उत्पन्न होती है, क्योंकि मेरे पास नई छवियां डाउनलोड होने की प्रतीक्षा कर रही हैं, लेकिन उन्हें पुरानी अनियंत्रित छवियों को पहले डाउनलोड करने के लिए इंतजार करना होगा।

मैं उन अनियंत्रित छवि डाउनलोड को रोकना चाहता हूं।

// Code sample uses jQuery, but jQuery is not a necessity 

var img = document.createElement("img"); 

var xhr = $.ajax({ 
     url: "http://mydomain.com/myImageServer?param=blah", 
     context: img, 
     success: ImageLoadedCallback 
    }); 

function ImageLoadedCallback(data) 
{ 
    this.src = data; 
} 

function DoSomethingElse() 
{ 
    if (condition) 
     xhr.abort(); 
} 

लेकिन समस्या यह है कि यह है: स्पष्ट समाधान लगता AJAX (के बाद से AJAX अनुरोध निरस्त किया जा सकता है) के माध्यम से द्विआधारी छवि डेटा का अनुरोध, और img.src स्थापित करने के लिए डाउनलोड पूरा होने के एक बार होने के लिए लाइन जिस तरह से मैंने आशा की थी, वह काम नहीं करता:

this.src = data; 

मैंने उच्च और निम्न खोज की है। AJAX के माध्यम से भेजे गए बाइनरी छवि डेटा में छवि स्रोत सेट करने का कोई तरीका नहीं है?

उत्तर

3

इसे प्राप्त करने के लिए आपको data को data: URI में बेस-एन्कोड करना होगा। लेकिन यह आईई 6-7 में काम नहीं करेगा, और वहां पर सीमाएं हैं कि आप वहां कितना डेटा डाल सकते हैं, खासकर आईई 8 पर। यह उन ब्राउज़रों के अनुकूलन के रूप में करने योग्य हो सकता है जहां यह समर्थित है, लेकिन मैं इस पर भरोसा नहीं करता।

एक और संभावित तरीका XMLHttpRequest का उपयोग छवि को प्रीलोड करने के लिए करना है, फिर केवल प्रतिक्रिया को छोड़ दें और एक ही पते पर इंगित करने के लिए Image के src सेट करें। छवि को ब्राउज़र के कैश से लोड किया जाना चाहिए। हालांकि, इस मामले में जहां आप छवियों को गतिशील रूप से उत्पन्न कर रहे हैं, आपको यह सुनिश्चित करने के लिए कि आपके पास कैच करने योग्य है, आपको अपने कैशिंग हेडर पर कुछ ध्यान देना होगा।

2

उदाहरण का प्रयास करें

this.src="data:image/png;base64,XXX"

... जहां XXX अपने बाइनरी डेटा है, base64 एनकोडेड। यदि आवश्यक हो तो सामग्री-प्रकार समायोजित करें। हालांकि, मैं इसके लिए व्यापक ब्राउज़र समर्थन के बारे में आशावादी नहीं रहूंगा।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। दुर्भाग्य से, मुझे काफी व्यापक ब्राउज़र समर्थन की आवश्यकता है - और मुझे यकीन नहीं है कि बेस 64-एन्कोडिंग काम करेगी; मुझे इन छवियों को जितना संभव हो उतना छोटा होना चाहिए। – Michael

0

आपको का उपयोग करने में सक्षम होना चाहिए, जैसा कि पहले के प्रश्न में पहचाना गया था the solution। ध्यान दें कि यह पुराने ब्राउज़र के साथ काम नहीं करेगा।

+0

दिलचस्प। दुर्भाग्य से मुझे आईई 6 और फ़ायरफ़ॉक्स 2 के रूप में पुराने ब्राउज़र के लिए समर्थन की आवश्यकता है। क्या आपका समाधान उन लोगों का समर्थन करता है? – Michael

+0

नहीं। इस उत्तर को देखें (http://stackoverflow.com/questions/1765342/which-browsers-support-data-uris-and-since-which-version/1766942#1766942)। यह भी ध्यान रखें कि आईई 8 का समर्थन सीमित है। –

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

  • कोई संबंधित समस्या नहीं^_^