2011-11-03 8 views
10

पर एक JQuery यूआई संवाद को नष्ट मैं एक जवाब है, या कोई लाभ नहीं हुआ इस विशेष मुद्दे को भी एक संदर्भ के लिए सब कुछ खत्म हो खोज की है। मैं JQuery UI 1.8.7 और JQuery 1.5.1 का उपयोग कर रहा हूं। मेरे पास एक संवाद है कि मैं न केवल करीब से नष्ट करना चाहता हूं, बल्कि डीओएम से भी करीब हटना चाहता हूं। यह फ़ायरफ़ॉक्स में ठीक काम करता है। हालांकि, जब मैं आईई 7 में एक ही काम करता हूं, तो मुझे ब्राउज़र के लिए मेमोरी उपयोग में 6 एमबी स्पाइक दिखाई देता है, और जब तक मैं ब्राउज़र को पूरी तरह से बंद नहीं करता तब तक यह स्मृति पुनः प्राप्त नहीं होती है। तो मेरा पहला विचार था, मेरे संवाद में कुछ स्मृति रिसाव पैदा कर रहा है। मैं सब कुछ है कि मैं जोड़ने था बाहर छीन लिया, और निम्नलिखित कोड का उपयोग कर एक सरल संवाद बनाया:बड़े पैमाने पर IE7 मेमोरी लीक जब करीब

$('<div id="testMe">hello</div>').dialog({ 
    modal: true, 
    autoOpen: true, 
    close: function() { $(this).dialog('destroy'); } 
}); 

जब मैं इस संवाद खोलने, इसे बंद, और फिर ब्राउज़र को ताज़ा। मैं हमेशा पहले की तुलना में ~ 6 एमबी अधिक स्मृति के साथ समाप्त होता हूं। अगर मैं इस संवाद को खोलता हूं, लेकिन फिर इसे बंद करने से पहले ब्राउज़र को रीफ्रेश करें, तो मुझे कोई मेमोरी स्पाइक दिखाई नहीं देता है। मुझे नहीं पता कि इसका क्या कारण हो सकता है - मुझे सामान्य JQuery UI मेमोरी लीक के बारे में धागे का एक गुच्छा मिला है, लेकिन किसी भी फिक्स ने मेरी स्थिति का समाधान करने के लिए कुछ भी नहीं किया है।

मैं यह भी सोचा कि शायद अपने प्रोजेक्ट में कुछ अन्य कोड रास्ते में हो रही थी। यह मामला नहीं है - अगर मैं इस जेएसएफल्ड उदाहरण का उपयोग कर एक ही काम करता हूं, तो मुझे मेमोरी स्पाइक भी मिलती है! (http://jsfiddle.net/n68Af/1/)। इस बिंदु पर, मुझे नहीं पता कि कहां बारी है या क्या करना है। मुझे इन संवादों को नष्ट करने और उन्हें डीओएम से हटाने की जरूरत है - हमारे पूरे (बहुत बड़े) आवेदन के दौरान संवाद के कुछ उदाहरण पहले से ही हैं, इस तथ्य पर बैंक कि संवाद के बाद डायमंड में अब संवाद नहीं है।

संपादित करें: मोडल ध्वज के मान को बदलने से कोई प्रभाव नहीं पड़ता है। साथ ही, मुझे एहसास हुआ कि मेरा उदाहरण डोम से तत्व को नहीं हटाता है। चाहे मैं ऐसा करता हूं या नहीं, स्मृति रिसाव बनी हुई है। मेरे वास्तविक प्रोजेक्ट में कोड $ (यह) .remove() का उपयोग कर डोम से तत्व को हटा रहा है। मैंने उदाहरण को सरल बना दिया, क्योंकि असली मुद्दा "नष्ट" कॉल है जो कुछ प्रकार के परिपत्र संदर्भ या कुछ ऐसा है जो मैंने 6 एमबी मेमोरी स्पाइक का उल्लेख किया है।

संपादित करें: इस और अधिक देखने के बाद, यह कोई फर्क नहीं पड़ता कि JQuery UI विजेट का उपयोग कर रहा हूं (मैंने संवाद, अपना स्वयं का कस्टम विजेट और बटन) का प्रयास किया है। जब तक मैं तत्व को हटा देता हूं कि विजेट डीओएम से संदर्भित कर रहा है, तो मुझे आईई 7 में विशाल मेमोरी रिसाव दिखाई देता है। मेमोरी रिसाव तब भी होता है जब मैं तत्वों को डीओएम में कहीं और ले जाता हूं। मैंने एक "कचरा बिन" डीआईवी बनाने की कोशिश की, जिसे मैंने पूरी तरह से हटाने के बजाय अपने संवाद की सभी सामग्री को स्थानांतरित कर दिया, और वही स्पाइक हुआ।

किसी भी मदद या दिशा की सराहना की जाएगी। अग्रिम दोस्तों में धन्यवाद!

+0

क्या आप मॉडल = सत्य के बिना परीक्षण कर सकते हैं (क्षमा करें आईई नहीं है) - जैसा कि इस SO प्रश्न में है -> http://stackoverflow.com/questions/2095095/jquery-ui-dialog-memory-leaks – ManseUK

+0

मोडल सेट करना संवाद प्रदर्शित करते समय झूठी प्रारंभिक मेमोरी स्पाइक को हटा देता है। हालांकि, वेब पेज को रीफ्रेश करते समय ~ 6 एमबी की वृद्धि अभी भी है। – Adam

+0

क्या आपने jQuery ट्रैकर पर एक बग दायर किया है? – Randomblue

उत्तर

2
$('<div id="testMe">hello</div>').dialog({ 
    modal: true, 
    autoOpen: true, 
    close: function() { $(this).dialog('destroy').remove(); } 
}); 

यह पूरी तरह से क्यों यह वास्तव में क्या हो रहा है डोम

+0

मेरी मूल पोस्ट में मेरा संपादन देखें। डीओएम से तत्व को हटाने का मुद्दा नहीं है। समस्या यह है कि एक संवाद को नष्ट करते समय आईई 7 को इतनी बड़ी मेमोरी लीक मिल रही है – Adam

0

से संवाद निकाल देंगे, मैं अनिश्चित हूं। आईई शुरू होने के बाद से आईई के पास अजीब बग होने का इतिहास है। आपके लिए जाने का सबसे अच्छा विकल्प, नवीनतम संस्करण में update आपकी jQuery लाइब्रेरी है। यदि यह काम नहीं करता है, तो आप कोशिश कर सकते हैं और create your own dialog जो वास्तव में कठिन नहीं है।

समस्या तथ्य यह है कि डोम से तत्व को हटाने गड़बड़ करने के लिए लगता है में झूठ सकता है। उस स्थिति में, आप संवाद वस्तु और तत्व का पुन: उपयोग कर सकते हैं ताकि आपको .remove() की आवश्यकता न हो।

+0

डाउनवोट क्यों? यदि आप असहमत हैं, तो मुझे उस पर कुछ इनपुट चाहिए। –

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