2013-06-08 7 views
6

मैं एक एसवीजी-आधारित विज़ुअलाइज़ेशन का निर्माण कर रहा हूं जो (आंशिक रूप से) त्वरित उत्तराधिकार में कई छवियों को दिखाने पर निर्भर करता है। छवियों को नेटवर्क से पर्याप्त तेज़ी से नहीं लाया जा सकता है, इसलिए उन्हें प्रीलोड किया जाना चाहिए।एसवीजी छवि टैग प्रीलोड करने का सबसे अच्छा तरीका?

मेरे समझ के साथ कि एसवीजी ठीक से image टैग कैश नहीं है, कम से कम प्रमुख ब्राउज़रों में है। तो जावास्क्रिप्ट प्रीबलोडिंग librairies और तकनीकें (उदाहरण के लिए this SO question) काम नहीं करेगा। (मैं स्तरित एचटीएमएल img टैग का उपयोग का सहारा सकता है, लेकिन क्योंकि अपने आवेदन की बारीकियों की, मैं जितना संभव हो उतना शुद्ध एसवीजी पर कायम करना चाहते हैं)

मैं दो विकल्प देखेंगे:

  • एन्कोडिंग बेस 64 के रूप में PNG छवि डेटा, तारों के रूप में स्मृति में भंडारण और तार का उपयोग कर iteratively data:image/png;base64 का उपयोग कर image टैग को भरने के लिए।
  • display: none या visibility: hidden करने के लिए सभी के साथ एक दूसरे के ऊपर है, लेकिन एक सेट पर कई एसवीजी समूहों Layering और iteratively उपयुक्त समूह दिखाते समय। हालांकि, मेरा मानना ​​है कि कार्यक्रमिक रूप से यह पता लगाना संभव नहीं होगा कि सभी छवियों ने प्रीलोडिंग समाप्त कर दी है।

छवि डेटा पहले से लोड करने के लिए सबसे अच्छा तरीका क्या है? शायद मैं एक आसान विकल्प याद किया है।

+0

करता है अपने विज़ सभी * एसवीजी * जा करने के लिए है? यदि नहीं, तो आप छवियों को HTML के रूप में प्रीलोड करने में सक्षम हो सकते हैं, फिर उन्हें दृश्य पर ओवरले कर सकते हैं ... यदि आप उन्हें पूरी तरह से एकीकृत करने की आवश्यकता है, तो यह काम नहीं करेगा, उदाहरण के लिए, उदा। क्लिप पथ लागू करने के लिए। – nrabinowitz

+0

हां, जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, अगर मैं सभी एसवीजी थे तो मैं बहुत पसंद करूंगा। (अन्यथा, मुझे दो एसवीजी परतों में अपने विज़ को विभाजित करने की आवश्यकता होगी ताकि छवि परत उनके बीच स्तरित हो) –

उत्तर

1

मैं परिचित नहीं वेब ब्राउज़र के अंतर्निहित यांत्रिकी के साथ जानना चाहते हैं कि इस svg साथ image टैग काम करेंगे हूँ, लेकिन मैं सफलता नई छवि के साथ छवियों कैशिंग() था:

//download low quality images 
    var imageArray = [] 
    for (var i = 0; i < 600; i++){ 
     imageArray[i] = new Image(); 
     imageArray[i].src = moviePath + (i + 1) + '.jpg.t'; 
     imageArray[i].onload = function(){ 
      var i = this.src.split(movieName + '/')[1].split(".")[0]; 
      d3.select("#bar" + i).style("stroke", 'rgb(' + colors[i].rgb + ')'); 
     } 
    } 

एक दिखाने के लिए छवि, मैंने बस प्रदर्शित छवि का स्रोत पहले से लोड किया था और ब्राउजर इसे अपने कैश से लोड करता है।

source में बाद में एक और छोटी सी चाल का उपयोग किया जाता है - पहले एक निम्न गुणवत्ता वाली छवि दिखाएं और एक छोटी छवि को लोड करने के बाद केवल एक छोटी छवि को लोड करने के बाद एक और छवि का चयन किया जा रहा है। फिर, उच्च गुणवत्ता वाली छवि लोड होने के बाद, इसे केवल तभी दिखाएं जब एक ही छवि अभी भी चुनी गई हो।

कोई विचार करता है, तो इन सर्वोत्तम प्रथाओं या कुछ भी है, लेकिन it worked reasonably well हैं।

+0

मेरा मानना ​​है कि यह सही दृष्टिकोण है जिसका मैंने उल्लेख किया है, मेरे प्रश्न में काम नहीं करेगा। मेरी समझ यह है कि प्रमुख ब्राउज़र * एसवीजी 'छवि को कैश से पुनर्प्राप्त नहीं करते हैं (एसवीजी में बिटमैप समर्थन कुछ हद तक विचार किया जाता है)। जब तक आप विवाद नहीं कर लेते, मुझे नहीं लगता कि यह दृष्टिकोण एसवीजी के लिए काम करता है। –

+1

UAs (और मुझे केवल वास्तव में फ़ायरफ़ॉक्स का विस्तृत ज्ञान है) (एक्सएमएल) डेटा कैश करें लेकिन एसवीजी छवियों का बिटमैप प्रतिनिधित्व नहीं। मुझे लगता है कि अगर buffered-rendering विशेषता सेट है तो ओपेरा बिटमैप को कैश करेगा। इसलिए उपर्युक्त उत्तर सामान्य रूप से काम करना चाहिए। –

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