মানচিত্রের ইনস্ট্যান্স নষ্ট করার সঠিক উপায় কী?


92

আমি সম্প্রতি একটি এইচটিএমএল 5 মোবাইল অ্যাপ্লিকেশন তৈরি করেছি। অ্যাপ্লিকেশনটি একটি একক পৃষ্ঠা ছিল যেখানে নেভিগেশন হ্যাশ পরিবর্তন ইভেন্টগুলি পুরো ডিওএম প্রতিস্থাপন করেছিল। অ্যাপ্লিকেশনটির একটি বিভাগ ছিল API v3 ব্যবহার করে গুগল ম্যাপ। ডিওএম থেকে মানচিত্র ডিভটি সরানোর আগে, আমি যে কোনও ইভেন্ট হ্যান্ডলার / শ্রোতাদের সরিয়ে দিতে এবং যতটা সম্ভব মেমরি মুক্ত করতে চাই যত তাড়াতাড়ি ব্যবহারকারী সেই বিভাগে ফিরে না আসতে পারে।

মানচিত্রের উদাহরণটি ধ্বংস করার সর্বোত্তম উপায় কী?


সংশ্লিষ্ট প্রশ্ন (2014): stackoverflow.com/questions/21142483/...
kashiraja

একটি মানচিত্রে সমস্ত ইভেন্ট শ্রোতাদের অপসারণের চেষ্টা করার কোড, গুগল মানচিত্র বাগ 35821412
কাশীরাজা

উত্তর:


49

আমি এই প্রশ্নের উপর একটি দ্বিতীয় উত্তর যুক্ত করছি, কারণ আমি আমার আগের উত্তরটি সম্পর্কে ফলো-আপ মন্তব্যের মাধ্যমে আমাদের পিছনে পিছনে সরাতে চাই না।

তবে আমি সম্প্রতি এমন কিছু তথ্য পেয়েছি যা সরাসরি আপনার প্রশ্নের সমাধান করে এবং তাই আমি ভাগ করে নিতে চাই। আপনি এটি সম্পর্কে অবগত আছেন কিনা তা আমি জানি না তবে গুগল ম্যাপস এপিআই অফিস আওয়ার্স 9 ই মে 2012 এর ভিডিওর সময় গুগলের ক্রিস ব্রডফুট এবং লুক ম্যাকে স্ট্যাকওভারফ্লো থেকে এই প্রশ্নটি নিয়ে আলোচনা করেছেন । আপনি যদি ভিডিওটি প্লেব্যাক 12:50 এ সেট করেন তবে এটি সেই অংশ যেখানে তারা আপনার প্রশ্নটি নিয়ে আলোচনা করবে।

মূলত, তারা স্বীকার করে যে এটি একটি বাগ, তবে তারা আরও যোগ করেন যে তারা ক্রমবর্ধমান মানচিত্রের দৃষ্টান্তগুলি তৈরি / ধ্বংস করার সাথে জড়িত এমন ব্যবহারের ক্ষেত্রে সমর্থন করে না। তারা দৃ strongly়ভাবে মানচিত্রের একটি একক উদাহরণ তৈরি করার এবং এ জাতীয় কোনও দৃশ্যে এটিকে পুনরায় ব্যবহার করার পরামর্শ দেয়। তারা মানচিত্রটি বাতিল করতে স্থির করার বিষয়ে এবং ইভেন্ট শ্রোতাদের সুস্পষ্টভাবে অপসারণের বিষয়েও কথা বলে। আপনি ইভেন্ট শ্রোতাদের সম্পর্কে উদ্বেগ প্রকাশ করেছেন, আমি ভেবেছিলাম যে মানচিত্রটি বাতিল করতে কেবল যথেষ্ট হবে, তবে মনে হচ্ছে আপনার উদ্বেগগুলি বৈধ, কারণ তারা ইভেন্ট শ্রোতাদের বিশেষভাবে উল্লেখ করেছে। তারা মানচিত্রটিকেও ধারণ করে এমন ডিআইভি সম্পূর্ণরূপে অপসারণের প্রস্তাব দিয়েছিল।

যে কোনও হারে, কেবল এটি পাস করতে চেয়েছিল এবং এটি স্ট্যাকওভারফ্লো আলোচনায় অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করতে চেয়েছিল এবং আশা করি এটি আপনাকে এবং অন্যদের সহায়তা করে-


4
ধন্যবাদ - আমি তাদের অফিস সময়ে প্রশ্নটি মোকাবেলা করতে বলেছিলাম কিন্তু ভিডিওটি চেক করার কোনও সুযোগ এখনও পেলাম না।
চাদ কিলিংসওয়ার্থ

আচ্ছা আপনি কেবল পূর্ববর্তী উত্তরটি আপডেট করে উল্লেখ করতে পারেন যে এটি একটি আপডেট ...
টিজে

4
বেশ দুর্দান্ত .. এটি 2018 এবং এখনও এটি করার কোনও উপায় বলে মনে হয় না।
জেপি সিলভাশি

28

সরকারী উত্তর আপনি না। একক পৃষ্ঠার অ্যাপ্লিকেশনটিতে মানচিত্রের দৃষ্টান্তগুলি পুনরায় ব্যবহার করা উচিত এবং ধ্বংস না করে পুনরায় তৈরি করা উচিত।

কিছু একক পৃষ্ঠার অ্যাপ্লিকেশনগুলির জন্য, এর অর্থ সমাধানটি পুনঃআরকিটেক্ট করার অর্থ হতে পারে যে একবার কোনও মানচিত্র তৈরি হয়ে গেলে এটি ডিওএম থেকে লুকানো বা সংযোগ বিচ্ছিন্ন হয়ে যেতে পারে, তবে এটি কখনও ধ্বংস / পুনরায় তৈরি করা হয় না।


এটি খুব খারাপ - আমার বহু ভাষা একক পৃষ্ঠার অ্যাপ্লিকেশন রয়েছে এবং আমি নির্বাচিত ভাষায় গুগল ম্যাপ প্রদর্শন করতে চাই।
আর্টুস্কা

দেখে মনে হচ্ছে এটি সংস্করণ 3.38.1 হিসাবে ঠিক করা হয়েছে (যদিও আমি স্বতন্ত্রভাবে যাচাই করি নি)।
ক্রেস্ট

15

যেহেতু আপাতদৃষ্টিতে আপনি মানচিত্রের দৃষ্টান্তগুলি সত্যই ধ্বংস করতে পারবেন না, যদি এই সমস্যাটি হ্রাস করার উপায়

  • আপনার ওয়েবসাইটে একবারে কয়েকটি মানচিত্র দেখাতে হবে
  • ব্যবহারকারীর মিথস্ক্রিয়ার সাথে মানচিত্রের সংখ্যা পরিবর্তন হতে পারে
  • অন্যান্য উপাদানগুলির সাথে মানচিত্রগুলি লুকিয়ে রাখা এবং পুনরায় দেখানো দরকার (উদাহরণস্বরূপ তারা ডিওমে একটি স্থিত অবস্থানে উপস্থিত হবে না)

মানচিত্রের উদাহরণগুলির একটি পুল রাখছে। পুলটি ব্যবহারের উদাহরণগুলির ট্র্যাক রাখে, এবং যখন এটি একটি নতুন উদাহরণের জন্য অনুরোধ করা হয়, এটি উপলব্ধ মানচিত্রের উদাহরণগুলির মধ্যে কোনওটি নিখরচায় কিনা তা পরীক্ষা করে: এটি যদি থাকে তবে এটি একটি বিদ্যমানটিকে ফিরিয়ে দেবে, যদি তা না হয় তবে এটি তৈরি করবে নতুন মানচিত্রের উদাহরণ এবং সেটিকে পুলটিতে যুক্ত করে এটি ফিরিয়ে দিন। এইভাবে আপনার কেবলমাত্র পর্দায় একসাথে প্রদর্শিত সর্বাধিক মানচিত্রের সমান সর্বাধিক সংখ্যার উদাহরণ থাকবে। আমি এই কোডটি ব্যবহার করছি (এটিতে 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" ক্লাসটি ব্যবহার করে স্টাইল করতে পারেন এবং আপনি ডোনমিকভাবে DOM এ যুক্ত করতে পারেন। আপনার যদি সিস্টেমটি পুনরায় সেট করতে হয় তবে আপনি মানচিত্রপুল.সেট () ব্যবহার করতে পারেন। এটি পুনরায় ব্যবহারের জন্য পুলটিতে বিদ্যমান সমস্ত দৃষ্টিকোণ রাখার সময়, কাউন্টারটিকে 0 এ রিসেট করবে। আমার অ্যাপ্লিকেশনটিতে আমাকে একবারে সমস্ত মানচিত্র সরিয়ে নতুন মানচিত্রের সেট তৈরি করতে হবে, সুতরাং নির্দিষ্ট মানচিত্রের পুনরায় ব্যবহার করার কোনও কার্যকারিতা নেই: আপনার মাইলেজটি ভিন্ন হতে পারে। স্ক্রীন থেকে মানচিত্রগুলি সরাতে, আমি jQuery এর বিচ্ছিন্নতা ব্যবহার করি, যা মানচিত্রের ধারকটিকে ধ্বংস করে না।

এই সিস্টেমটি ব্যবহার করে এবং ব্যবহার করে

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

এবং চলমান

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

(যেখানে ডিভরিফারেন্স হ'ল ডিভের jQuery অবজেক্টটি ইনস্ট্যান্স পুল থেকে প্রত্যাবর্তিত হয়েছে) প্রতিটি ডিভি আমি যে অপসারণ করছি আমি ক্রোমের মেমরির ব্যবহার কমবেশি স্থিতিশীল রাখতে সক্ষম হয়েছি, প্রতিবার আমি যখন মানচিত্রগুলি মুছি এবং নতুন যুক্ত করি তখন তার বিপরীতে আমি ক্রমবর্ধমান।


আপনি আমার জীবন বাঁচিয়েছেন! থ্যাঙ্কস;)
ফিলিপ দেশিদেরত

খুশি হলাম সাহায্যের !!
পাওলো মায়নি

5

আমি মানচিত্রের ডিভের বিষয়বস্তু মুছে ফেলার এবং মানচিত্রের deleteরেফারেন্স ধারণ করে চলকটি ব্যবহার করার এবং সম্ভবত deleteকোনও ইভেন্ট শ্রোতাদের স্পষ্টতই ইঙ্গিত করার পরামর্শ দিয়েছি ।

নেই একজন স্বীকৃত বাগ , যদিও, এবং এই কাজ নাও করতে পারে।


এটি একটি ভাল আলোচনা। কল করার ফলে deleteঅনেক কিছু যুক্ত হবে বলে আমি মনে করি না ( স্ট্যাকওভারফ্লো.com/q/742623/1314132 দেখুন ) তবে এটি সত্যিই আঘাত করতে পারে না। শেষ পর্যন্ত, এই প্রশ্নটিতে নেমে আসে: কোনও কিছুর সাথে রেফারেন্স আছে? হ্যাঁ, এটি আবর্জনা সংগ্রহ করা হবে না।
শন মিকি

4
@ সানমিকি: এটি যেখানে বাগ প্রাসঙ্গিক হয়ে ওঠে। সংস্করণ 2 GUnload()এপিআইয়ের সমস্ত অভ্যন্তরীণ উল্লেখ মুছে ফেলতে হবে।
অ্যান্ড্রু লেচ

আমি এই পৃষ্ঠাটি ক্রোমে পরীক্ষা করে দেখছি : people.missouristate.edu/chadkillingsworth/mapsexferences/… এখন পর্যন্ত মানচিত্রটি সরানোর পরে মেমরির ব্যবহার কেবল কিছুটা কমেছে , তবে মানচিত্রটি ইনস্ট্যান্ট করার আগে স্তরের কাছাকাছি কোথাও নেই।
চাদ কিলিংসওয়ার্থ

নিবন্ধন করুন তবে তাদের যদি কোনও বাগ থাকে যা স্মৃতি ফাঁস করে দেয়, এটি ঠিক না হওয়া পর্যন্ত আমরা অনেক কিছুই করতে পারি না। আমি বোঝাতে চাইছি, যদি সমস্ত মানচিত্রের অবজেক্টগুলিকে অ্যাক্সেসযোগ্য করে তোলা কাজ করে না তবে deleteসত্যিকার অর্থে এটি কোনও ঠিক নয়। তারা বড়, যাতে রেফারেন্স অনধিগম্য কাজ হিসেবে এটি করা উচিত অথবা একটি নতুন ফাংশন যা আপনার জন্য বর্ণনা কার্যকারিতা উপলব্ধ যোগ উপার্জন ঠিক করতে GUnload()
শান মিকি

4
চ্যাড / অ্যান্ড্রু: হ্যাঁ, আমি এই সমস্যাটি পুনরুত্পাদন করেছি, দুর্ভাগ্যক্রমে deleteএবং মুছে ফেলা innerHTMLসম্পূর্ণরূপে স্পষ্ট স্মৃতি নয়। দুর্ভাগ্যক্রমে এটি কোনও উচ্চ অগ্রাধিকারের ত্রুটি নয়।
ক্রিস ব্রডফুট

2

যেহেতু গুগল এইপিএমএইচআইএমএলে আইপিআরএমে আরও ভাল ব্যবহারের জন্য গানলোড () সরবরাহ করে না এবং এই আইফ্রেমে উত্স হিসাবে map.html নির্ধারণ করে। ব্যবহারের পরে nrc হিসাবে src তৈরি করুন। এটি অবশ্যই মানচিত্রে গ্রাস করা স্মৃতি মুক্ত করবে।


4
Iframe এর প্রতিটি উদাহরণে মানচিত্র এপিআই পুনরায় লোড করতে হবে যা আদর্শ নয়।
চাদ কিলিংসওয়ার্থ

1

আপনি যখন মুছে ফেলেন div, এটি প্রদর্শন প্যানেলটি সরিয়ে দেয় এবং মানচিত্রটি অদৃশ্য হয়ে যাবে। মানচিত্রের দৃষ্টান্তটি সরাতে, কেবল নিশ্চিত হয়ে নিন যে মানচিত্রে আপনার উল্লেখটি সেট করা আছে nullএবং মানচিত্রের অন্যান্য অংশে কোনও রেফারেন্স সেট করা আছে null। সেই সময়ে, জাভাস্ক্রিপ্টের আবর্জনা সংগ্রহ পরিষ্কার করার যত্ন নেবে, যেমন বর্ণিত হয়েছে: জাভাস্ক্রিপ্টে আবর্জনা সংগ্রহ কীভাবে কাজ করে?


4
আমি নিশ্চিত নই যে মানচিত্রের পরিবর্তনশীলটি নালায় সেট করা সমস্ত ইভেন্ট শ্রোতার যথাযথভাবে সরিয়ে ফেলবে।
চাদ কিলিংসওয়ার্থ

4
এটি কেবল মানচিত্র সেট করতে nullহবে তা নয়, অন্য যে কোনও কিছুতে উল্লেখ রয়েছে। সুতরাং মার্কার রেফারেন্স সেট করা হয় যদি null, এটি তৈরি অনধিগম্য , সেখানে ঘটনা শ্রোতা পৌঁছাতে কোনও উপায় নেই। এটি এখনও মানচিত্রের সাথে সংযুক্ত থাকতে পারে, তবে মানচিত্রটি পৌঁছানো যায় না, সুতরাং এটি স্মৃতিচারণের একটি বড় কান্ড যা মূলত এতিম হয়ে গেছে। এটি একটি সেট হিসাবে একই Array.length = 0; যদি সদস্যদের অন্য কোনও উল্লেখ না থাকে তবে তারা কেবল অনাথ মেমরির একটি দল গঠন করেন যা আবর্জনা সংগ্রহের জন্য যোগ্য।
শান মিকি 17

0

আমি আপনার সম্পর্কে কথা বলছি addEventListener। আপনি যখন ডোম উপাদানগুলি সরান, কিছু ব্রাউজার এই ইভেন্টগুলি ফাঁস করে এবং সেগুলি সরাবে না। এজন্য কোনও উপাদান অপসারণ করার সময় jQuery বিভিন্ন কাজ করে:

  • এটি যখন ব্যবহার করতে পারে তখন ইভেন্টগুলি সরিয়ে দেয় removeEventListener। তার মানে এটি ইভেন্টের শ্রোতাদের সাথে এটি যুক্ত করে একটি অ্যারে রাখছে এটি এই উপাদানটিতে যুক্ত হয়েছে।
  • এটি ডিওএম উপাদান ব্যবহার করে ইভেন্টগুলি ( onclick, onblurইত্যাদি) সম্পর্কিত বৈশিষ্ট্যগুলি মুছে ফেলে deleteযখন addEventListenerউপলভ্য হয় না (এখনও, এটির একটি অ্যারে রয়েছে যেখানে এটি ইভেন্টগুলি যুক্ত করে সংরক্ষণ করে)।
  • nullআইই 6/7/8 মেমরি ফাঁস এড়ানোর জন্য এটি উপাদানটি সেট করে ।
  • এটি তখন উপাদানটি সরিয়ে দেয়।

আমি মূলত অভ্যন্তরীণ Google মানচিত্রের এপিআই ইভেন্টগুলি উল্লেখ করছি। তারা যোগ করা যেতে পারে / মুছে / এ নথিভুক্ত এপিআই ঘটনা পদ্ধতি ব্যবহার করে আলোড়ন সৃষ্টি developers.google.com/maps/documentation/javascript/... । ব্রাউজার addEventListener কার্যকারিতা অনুরূপ হলেও সেখানে (যেমন, "bounds_changed" মানচিত্র কাস্টম ঘটনা নির্দিষ্ট সংখ্যক হয় যেমন মানচিত্র "পুনরায় আকার দেওয়ার 'অনুষ্ঠান হিসেবে ব্রাউজার ঘটনার মধ্যে সেই ইভেন্ট হ্যান্ডলার হুক কিছু।
চাদ Killingsworth

তারপরে ইভেন্টগুলির একটি অ্যারে যুক্ত রাখুন এবং ইভেন্টের ধরণের উপর নির্ভর করে ম্যানুয়ালি ব্যবহার করে removeEventListenerবা সরান delete
ফ্লোরিয়ান মার্জাইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.