मेरे पास एक वेब एप्लिकेशन है जो लंबे समय तक डेटा में गतिशील रूप से लोड होता है। डेटा के भीतर छवियों के लिंक होते हैं जिन्हें ब्राउज़र में तब प्रस्तुत किया जाता है।उचित रूप से ब्राउज़र संसाधनों का निपटान
उदा।
var object = {
Name: ko.observable("Foo"),
Ref: ko.observable("Bar"),
ImageUrl: ko.observable("http://.....")
}
मैं Knockoutjs की स्क्रीन पर डेटा प्रस्तुत करने के लिए बाध्यकारी टेम्पलेट का उपयोग कर रहा हूँ।
<img data-bind="attr: { src: imageUrl }" />
इसलिए हर बार एक अजाक्स कॉल के माध्यम से वस्तु परिवर्तन, Knockoutjs टेम्पलेट डेटा के साथ फिर से प्रदान की गई है, और छवियों बदल जाते हैं।
लंबे समय के बाद, ये छवियां बढ़ती हैं और अधिक मेमोरी खाएंगी। आधुनिक ब्राउज़र बेहतर सामना करना प्रतीत होता है, लेकिन समस्या मुख्य रूप से IE8 के साथ है (हम < IE8 का समर्थन नहीं करते हैं)। यहां तक कि आधुनिक ब्राउज़रों में भी स्मृति इतनी अधिक हो जाएगी कि ब्राउजर फ्रीज हो जाए।
छवि संसाधन निर्माण के उदाहरण के लिए इस स्क्रीन शॉट को देखें।
मैं देखने के लिए अगर एक <img />
टैग का उपयोग करने के बजाय, एक <iframe />
का उपयोग क्या होगा फैसला किया।
तो मेरी कोड अब लग रहा है
<iframe data-bind="attr: { src: imageUrl }"></iframe>
क्या अब क्या होता है की तरह है कि फ्रेम बनाया जाता है, लेकिन जैसे ही imageUrl परिवर्तन के रूप में, फ्रेम बस अद्यतन और अतिरिक्त संसाधनों का निर्माण नहीं करता।
तो अगर मैं ब्राउज़र स्मृति उपयोग नीचे रखना चाहते हैं, मैं इस <iframe />
तकनीक का उपयोग कर सकते हैं, लेकिन मैं इसे पसंद नहीं है। यह मुझे एप्लिकेशन में कई अन्य बदलाव करने के लिए मजबूर करता है, साथ ही मुझे iframes का उपयोग करने की आवश्यकता है!
मैंने यह देखने के लिए अब विभिन्न परीक्षण चलाए हैं कि दोनों तकनीकों का उपयोग करके कितनी मेमोरी का उपयोग किया जाता है, और उसी अवधि में स्मृति 81,000k से 200,000k (<img />
के साथ) 81,000k से 98,000k की तुलना में बढ़ेगी (<iframe />
के साथ)
प्रश्न
वहाँ एक ब्राउज़र के भीतर छवि संसाधनों का प्रबंधन करने के लिए एक बेहतर तरीका है? क्या इस छवि का सही ढंग से निपटान करने का कोई तरीका है? मैंने एक उत्तर के लिए वेब खोजा है, लेकिन अब तक मुझे कुछ भी नहीं मिला है।
संपादित
बहुत बुनियादी स्तर पर। मैंने jQuery विधि remove()
के माध्यम से एक छवि को निकालने का प्रयास किया है, लेकिन छवि संसाधन कभी नहीं हटाया जाता है। एक बहुत ही बुनियादी उदाहरण के लिए यह पहेली देखें।http://jsfiddle.net/ezb9e/
कोड:
एचटीएमएल
<img src="http://www.fillmurray.com/200/300" />
जे एस
$(function(){
setTimeout(function(){
$('img').remove();
$('body').append($('<img />', { attr: { src: 'http://www.fillmurray.com/300/200' }}));
}, 3000);
});
क्या इन हुकों का उपयोग करना संभव हो सकता है: http://knockoutjs.com/documentation/template-binding.html#note_3_using_afterrender_afteradd_and_beforeremove मैन्युअल रूप से डीओएम से छवि को मैन्युअल रूप से हटाने के लिए, नया जोड़ा जाने से पहले? उस समस्या को रोकना चाहिए। – Nik
मैंने पहले ही छवि को हटाने की कोशिश की है, और फिर एक नया जोड़ें, लेकिन छवि संसाधन हमेशा बनाते हैं। एक उदाहरण के लिए यह पहेली देखें। http://jsfiddle.net/ezb9e/ –
क्या आप डेटा रीफ्रेश करते समय छवि यूआरएल हमेशा बदलते हैं, या वे अपेक्षाकृत स्थिर रहते हैं? –