আমার গুগল ম্যাপে আমার কেবল একটি ইনফো উইন্ডো খোলা থাকা দরকার। আমি একটি নতুন খোলার আগে আমাকে অন্য সমস্ত ইনফো উইন্ডো বন্ধ করতে হবে।
কেউ আমাকে কীভাবে এটি করতে পারে তা দেখাতে পারেন?
উত্তর:
আপনাকে কেবল একটি InfoWindow
অবজেক্ট তৈরি করতে হবে, এটিকে একটি রেফারেন্স রাখতে হবে এবং সমস্ত চিহ্নিতকারীদের জন্য আবার ব্যবহার করতে হবে। গুগল ম্যাপস এপিআই ডক্স থেকে উদ্ধৃতি :
যদি আপনি কেবল একবারে একটি তথ্য উইন্ডো প্রদর্শন করতে চান (যেমন গুগল ম্যাপের আচরণ), আপনার কেবল একটি তথ্য উইন্ডো তৈরি করা দরকার যা আপনি মানচিত্রের ইভেন্টগুলিতে (যেমন ব্যবহারকারী ক্লিক হিসাবে) বিভিন্ন অবস্থান বা চিহ্নিতকারীগুলিতে পুনরায় সাইন করতে পারেন।
সুতরাং, আপনি নিজের InfoWindow
মানচিত্র শুরু করার ঠিক পরে অবজেক্টটি তৈরি করতে এবং তারপরে click
আপনার চিহ্নিতকারীদের ইভেন্ট হ্যান্ডলারগুলি নিম্নরূপে পরিচালনা করতে পারেন may ধরা যাক আপনার কাছে চিহ্নিতকারী রয়েছে someMarker
:
google.maps.event.addListener(someMarker, 'click', function() {
infowindow.setContent('Hello World');
infowindow.open(map, this);
});
তারপরে পদ্ধতিটি InfoWindow
কল না করে আপনি যখন কোনও নতুন চিহ্নিতকারীটিতে ক্লিক করেন তখন স্বয়ংক্রিয়ভাবে বন্ধ হওয়া উচিত close()
।
আপনার ইনফিনিডো সুযোগের বাইরে তৈরি করুন যাতে আপনি এটি ভাগ করতে পারেন।
এখানে একটি সহজ উদাহরণ:
var markers = [AnArrayOfMarkers];
var infowindow = new google.maps.InfoWindow();
for (var i = 0, marker; marker = markers[i]; i++) {
google.maps.event.addListener(marker, 'click', function(e) {
infowindow.setContent('Marker position: ' + this.getPosition());
infowindow.open(map, this);
});
}
আমারও একই সমস্যা ছিল তবে সেরা উত্তরটি এটি পুরোপুরি সমাধান করতে পারেনি, বিবৃতি দেওয়ার জন্য আমার যা করতে হয়েছিল তা এটি আমার বর্তমান চিহ্নিতকারীর সাথে সম্পর্কিত using হতে পারে এটি কাউকে সাহায্য করে।
for(var i = 0; i < markers.length; i++){
name = markers[i].getAttribute("name");
address = markers[i].getAttribute("address");
point = new google.maps.LatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));
contentString = '<div style="font-family: Lucida Grande, Arial, sans-serif;>'+'<div><b>'+ name +'</b></div>'+'<div>'+ address +'</div>';
marker = new google.maps.Marker({
map: map,
position: point,
title: name+" "+address,
buborek: contentString
});
google.maps.event.addListener(marker, 'click', function(){
infowindow.setContent(this.buborek);
infowindow.open(map,this);
});
marker.setMap(map);
}
একটি দেরীতে দেরি হয়ে গেছে, তবে আমি বৈশ্বিক চলক হিসাবে মেক ইনফোইন্ডো দ্বারা কেবল একটি ইনফাইন্ডো খুলতে সক্ষম হয়েছি।
var infowindow = new google.maps.InfoWindow({});
তারপরে তালিকার ভিতরে
infowindow.close();
infowindow = new google.maps.InfoWindow({
content: '<h1>'+arrondissement+'</h1>'+ gemeentesFiltered
});
infowindow.open(map, this);
গ্লোবারবারটি ঘোষণা করুন var selectedInfoWindow;
এবং খোলা তথ্য উইন্ডোটি ধরে রাখতে এটি ব্যবহার করুন:
var infoWindow = new google.maps.InfoWindow({
content: content
});
// Open the infowindow on marker click
google.maps.event.addListener(marker, "click", function() {
//Check if there some info window selected and if is opened then close it
if (selectedInfoWindow != null && selectedInfoWindow.getMap() != null) {
selectedInfoWindow.close();
//If the clicked window is the selected window, deselect it and return
if (selectedInfoWindow == infoWindow) {
selectedInfoWindow = null;
return;
}
}
//If arrive here, that mean you should open the new info window
//because is different from the selected
selectedInfoWindow = infoWindow;
selectedInfoWindow.open(map, marker);
});
আপনি যখন কোনও নতুন চিহ্নিতকারীতে ক্লিক ইভেন্টটি পরিচালনা করবেন তখন আপনাকে আপনার পূর্ববর্তী ইনফো উইন্ডো অবজেক্টটির উপর নজর রাখতে হবে এবং এটিতে ঘনিষ্ঠ পদ্ধতিটি কল করতে হবে ।
এনবি ভাগ করা তথ্য উইন্ডো অবজেক্টে ক্লোজ করা প্রয়োজন হয় না, ভিন্ন চিহ্নিতকারী দিয়ে ওপেন করা কলটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে। বিস্তারিত জানতে ড্যানিয়েলের উত্তর দেখুন ।
close()
একক InfoWindow
অবজেক্ট ব্যবহার করা হলে সেই পদ্ধতিটি কল করার দরকার নেই । open()
পদ্ধতিটি আবার একই বস্তুতে পুনরায় কল করা হলে এটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে ।
মূলত আপনি এমন একটি ফাংশন চান যা একটি new InfoBox()
=> অনক্লিক ইভেন্টের প্রতিনিধিত্ব করে। আপনার চিহ্নিতকারী তৈরি করার সময় (একটি লুপে) ব্যবহার করুনbindInfoBox(xhr, map, marker);
// @param(project): xhr : data for infoBox template
// @param(map): object : google.maps.map
// @param(marker): object : google.maps.marker
bindInfoBox: (function () {
var options = $.extend({}, cfg.infoBoxOptions, { pixelOffset: new google.maps.Size(-450, -30) }),
infoBox = new window.InfoBox(options);
return function (project, map, marker) {
var tpl = renderTemplate(project, cfg.infoBoxTpl); // similar to Mustache, Handlebars
google.maps.event.addListener(marker, 'click', function () {
infoBox.setContent(tpl);
infoBox.open(map, marker);
});
};
}())
var infoBox
অ্যাসিঙ্ক্রোনাসভাবে বরাদ্দ করা হয় এবং স্মৃতিতে রাখা হয়। যতবার আপনি কল করবেন bindInfoBox()
তার পরিবর্তে ফাংশন কল করা হবে। infoBoxOptions
একবারে পাস করতেও সহজ !
আমার উদাহরণে আমাকে একটি অতিরিক্ত প্যারাম যুক্ত করতে হয়েছিল map
কারণ আমার সূচনাটি ট্যাব ইভেন্টগুলির দ্বারা দেরি হচ্ছে।
এখানে এমন একটি সমাধান রয়েছে যা এটির পুনঃব্যবহারের জন্য কেবল একটি ইনফো উইন্ডো তৈরি করতে হবে না। আপনি অনেক তথ্য উইন্ডো তৈরি করা চালিয়ে যেতে পারেন, আপনার প্রয়োজন কেবলমাত্র একটি ক্লোজআল ইনফো উইন্ডোস ফাংশন তৈরি করা এবং নতুন ইনফাইন্ডো খোলার আগে এটিকে কল করা। সুতরাং, আপনার কোড বজায় রেখে, আপনার কেবল প্রয়োজন:
সমস্ত তথ্য উইন্ডো সংরক্ষণ করার জন্য একটি বিশ্বব্যাপী অ্যারে তৈরি করুন
var infoWindows = [];
প্রতিটি নতুন তথ্য উইন্ডো অ্যারেতে সঞ্চয় করুন, ইনফোউন্ডো = নতুন ...
infoWindows.push(infoWindow);
ক্লোজআলআইনফো উইন্ডো ফাংশন তৈরি করুন
function closeAllInfoWindows() {
for (var i=0;i<infoWindows.length;i++) {
infoWindows[i].close();
}
}
আপনার কোডে, তথ্য উইন্ডো খোলার ঠিক আগে ক্লোজআলআইনফো উইন্ডোজ () এ কল করুন।
শুভেচ্ছা,
এটি এইভাবে সমাধান:
function window(content){
google.maps.event.addListener(marker,'click', (function(){
infowindow.close();
infowindow = new google.maps.InfoWindow({
content: content
});
infowindow.open(map, this);
}))
}
window(contentHtml);
গুগল ম্যাপ আপনাকে কেবল একটি তথ্য উইন্ডো খোলা রাখতে দেয়। সুতরাং আপনি যদি একটি নতুন উইন্ডো খুলেন, তবে অন্যটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।