दिलचस्प पोस्ट
माता पिता के सापेक्ष बच्चे के रूप में तत्व का सूचक प्राप्त करें ब्राउज़र टैब को फोकस होने पर पता लगाएं iPhone: मैं UIImageWriteToSavedPhotosAlbum () के साथ सहेजी गई छवि के फ़ाइल पथ को कैसे प्राप्त करूं? Node.js के साथ एक फ़ाइल कैसे डाउनलोड करें (तीसरे पक्ष के पुस्तकालयों का उपयोग किए बिना)? एक्सलेमेंट नामस्थान (कैसे करें?) टंकिनटर: "पायथन को रुपये के लिए कॉन्फ़िगर नहीं किया जा सकता" java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath () Ljava / lang / String; एक स्थिर स्तंभ वेक्टर के साथ एक मैट्रिक्स में विशिष्ट कॉलम बदलें पीएचपी में फ्लोट की तुलना करें संपत्ति फ़ोल्डर से एक पीडीएफ फाइल पढ़ें iPhone नेविगेशन बार शीर्षक टेक्स्ट का रंग आउटलुक वीबीए – प्रत्येक आधे घंटे में कोड चलाइए GetViewTypeCount और getItemViewType तरीकों ArrayAdapter का त्रुटि बनाओ: लापता विभाजक कोई भी स्रोत के साथ छवि को शामिल करने का मान्य तरीका क्या है?

मानचित्र के नतीजे को नष्ट करने का सही तरीका क्या है?

मैंने हाल ही में एक html5 मोबाइल एप्लिकेशन विकसित किया है। एप्लिकेशन एक एकल पृष्ठ था जहां नेविगेशन हैश परिवर्तन ईवेंट पूरे DOM को बदल दिए थे। ऐप्लिकेशन का एक भाग एपीआई v3 का इस्तेमाल करते हुए एक Google मानचित्र था। नक्शा को डीओएम से हटा दिया जाने से पहले, मैं किसी भी ईवेंट हैंडलर / श्रोताओं को निकालना चाहता हूं और जितना संभव हो उतना मेमोरी को मुक्त कर सकता है क्योंकि उपयोगकर्ता उस खंड में फिर से नहीं लौटा सकता है।

मानचित्र के उदाहरण को नष्ट करने का सबसे अच्छा तरीका क्या है?

वेब के समाधान से एकत्रित समाधान "मानचित्र के नतीजे को नष्ट करने का सही तरीका क्या है?"

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

लेकिन मैं हाल ही में कुछ जानकारी लेकर आया था जो सीधे आपके प्रश्न को संबोधित करते हैं और इसलिए मैं साझा करना चाहता था। मुझे नहीं पता कि आपको इसकी जानकारी है, लेकिन Google मानचित्र एपीआई ऑफिस के दौरान 9 मई 2012 वीडियो , क्रिस ब्रॉडफुट और गूगल के ल्यूक माहे ने स्टैक्सहोवरफ्लो से इस सवाल पर चर्चा की। यदि आप वीडियो प्लेबैक को 12:50 पर सेट करते हैं, तो वह वह अनुभाग होता है जहां वे आपके प्रश्न पर चर्चा करते हैं।

मूल रूप से, वे मानते हैं कि यह एक बग है, लेकिन यह भी जोड़ता है कि वे वास्तव में उपयोग के मामलों का समर्थन नहीं करते हैं, जो लगातार मैप उदाहरणों को बनाने / नष्ट करने में शामिल हैं वे दृढ़ता से मानचित्र के एक उदाहरण बनाने की सिफारिश करते हैं और इस प्रकार के किसी भी परिदृश्य में इसका पुन: उपयोग करते हैं। वे नक्शे को रिक्त करने के बारे में भी बात करते हैं, और घटना श्रोताओं को स्पष्ट रूप से निकालते हैं। आपने घटना श्रोताओं के बारे में चिंता व्यक्त की, मैंने सोचा था कि बस को रिक्त करने के लिए मानचित्र निर्धारित करना पर्याप्त होगा, लेकिन ऐसा लगता है कि आपकी चिंताएं मान्य हैं, क्योंकि वे घटना श्रोताओं को विशेष रूप से उल्लेख करते हैं उन्होंने यह भी डीआईवी को पूरी तरह से हटाने की सिफारिश की है जो नक्शा को अच्छी तरह से रखती है।

किसी भी दर पर, बस इसे पास करना है और यह सुनिश्चित करना है कि यह स्टैक ओवरफ्लो चर्चा में शामिल है और यह आशा करता है कि यह आपको और दूसरों की मदद करे –

आधिकारिक जवाब है कि आप ऐसा नहीं करते हैं। एक एकल पृष्ठ एप्लिकेशन में नक्शा के उदाहरणों का पुन: उपयोग किया जाना चाहिए और तब नष्ट नहीं किया जाना चाहिए, फिर निर्मित किया जाना चाहिए।

कुछ एकल पृष्ठ अनुप्रयोगों के लिए, इसका मतलब यह हो सकता है कि समाधान को फिर से आर्किटेक्ट करना जैसे कि नक्शा बन जाने पर डोम से छिपाया या डिस्कनेक्ट किया जा सकता है, लेकिन इसे कभी भी नष्ट / पुन: निर्मित नहीं किया जाता है।

जाहिरा तौर पर आप नक्शा उदाहरणों को वास्तव में नष्ट नहीं कर सकते हैं, इस समस्या को कम करने का एक तरीका यदि

  • आपको वेबसाइट पर एक साथ कई नक्शे दिखाने की आवश्यकता है
  • नक्शे की संख्या उपयोगकर्ता इंटरैक्शन के साथ बदल सकती है
  • नक्शे को अन्य घटकों के साथ छिपी और पुन: दिखाया जाना चाहिए (यानी वे डोम में एक निश्चित स्थिति में प्रकट नहीं होते हैं)

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

var mapInstancesPool = { pool: [], used: 0, getInstance: function(options){ if(mapInstancesPool.used >= mapInstancesPool.pool.length){ mapInstancesPool.used++; mapInstancesPool.pool.push (mapInstancesPool.createNewInstance(options)); } else { mapInstancesPool.used++; } return mapInstancesPool.pool[mapInstancesPool.used-1]; }, reset: function(){ mapInstancesPool.used = 0; }, createNewInstance: function(options){ var div = $("<div></div>").addClass("myDivClassHereForStyling"); var map = new google.maps.Map(div[0], options); return { map: map, div: div } } } 

आप इसे शुरूआती नक्शा विकल्प (google.maps.Map के कन्स्ट्रक्टर के द्वितीय तर्क के अनुसार) पास करते हैं, और यह मैप का उदाहरण देता है (जिस पर आप google.maps.Map से संबंधित कार्यों को कॉल कर सकते हैं), और कंटेनर, जो आप "myDivClassHereForStyling" क्लास का उपयोग कर शैली कर सकते हैं, और आप डीओएम से जोड़ सकते हैं। यदि आपको सिस्टम रीसेट करने की आवश्यकता है, तो आप mapInstancesPool.reset () का उपयोग कर सकते हैं। यह काउंटर को 0 से रीसेट कर देगा, जबकि पूल में सभी मौजूदा उदाहरणों को पुनः उपयोग के लिए रखा जाएगा। मेरे आवेदन में मुझे एक बार में सभी मानचित्रों को निकालने और एक नया मानचित्र सेट बनाने की जरूरत है, इसलिए किसी विशेष मानचित्र आवृत्ति को रीसायकल करने के लिए कोई फ़ंक्शन नहीं है: आपका माइलेज अलग-अलग हो सकता है स्क्रीन से नक्शे को निकालने के लिए, मैं jQuery के डिटेच का उपयोग करता हूं, जो मैप के कंटेनर को नष्ट नहीं करता है।

इस प्रणाली का उपयोग करके, और उपयोग कर

 google.maps.event.clearInstanceListeners(window); google.maps.event.clearInstanceListeners(document); 

और चल रहा है

 google.maps.event.clearInstanceListeners(divReference[0]); divReference.detach() 

(जहां डिवेंफरेन्ज डिवेल की jQuery ऑब्जेक्ट है, इन्वेंटन्स पूल से लौटाता है) हर डिवाय पर मैं निकाल रहा हूं, मैं क्रोम के मेमोरी उपयोग को अधिक या कम स्थिर रखने में कामयाब रहा, क्योंकि हर बार जब मैं मैले को हटाता हूं और नए जोड़ता हूं।

मै नक्शे की सामग्री की सामग्री को हटाने और मैप के संदर्भ धारण करने वाले वेरिएबल पर हटाए जाने का सुझाव दे सकता था, और शायद किसी भी घटना श्रोताओं को स्पष्ट रूप से delete

हालांकि, एक स्वीकृत बग है , और यह काम नहीं कर सकता

जैसे कि Google एपीआई v3 के लिए बंदूक () प्रदान नहीं करता है html में आईफ़्रेम का बेहतर इस्तेमाल करता है और map.html इस iframe के स्रोत के रूप में असाइन करता है। उपयोग करने के बाद src को शून्य के रूप में बनाएं यह निश्चित रूप से मानचित्र द्वारा भस्म स्मृति को मुक्त करेगा

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

मुझे लगता है कि आप addEventListener बारे में बात कर रहे हैं। जब आप DOM तत्वों को निकालते हैं, तो कुछ ब्राउज़र इन घटनाओं को रिसाव करते हैं और उन्हें हटा नहीं देते हैं। ऐसा क्यों है कि एक तत्व को हटाते समय jQuery कई चीजें करता है:

  • यह घटनाओं को हटा देता है जब यह removeEventListener का उपयोग कर सकता है इसका मतलब यह है कि यह इस तत्व पर जोड़े गए घटना श्रोताओं के साथ एक सरणी रखता है।
  • यह addEventListener उपलब्ध नहीं है जब यह DOM तत्व पर delete का उपयोग कर घटनाओं ( onclick , onblur , आदि) के बारे में विशेषताओं को हटा देता है (फिर भी, इसमें एक सरणी है जहां यह घटनाओं को संग्रहीत करता है)।
  • यह आईई 6/7/8 मेमोरी लीक से बचने के लिए तत्व को सेट करता है।
  • यह तब तत्व हटाता है