গুগল ম্যাপস এপিআই v3 এ কেবল একটি ইনফো উইন্ডো খুলুন


85

আমার গুগল ম্যাপে আমার কেবল একটি ইনফো উইন্ডো খোলা থাকা দরকার। আমি একটি নতুন খোলার আগে আমাকে অন্য সমস্ত ইনফো উইন্ডো বন্ধ করতে হবে।

কেউ আমাকে কীভাবে এটি করতে পারে তা দেখাতে পারেন?


আপনি কি চেষ্টা করেছেন?
IgniteCoders

উত্তর:


152

আপনাকে কেবল একটি InfoWindowঅবজেক্ট তৈরি করতে হবে, এটিকে একটি রেফারেন্স রাখতে হবে এবং সমস্ত চিহ্নিতকারীদের জন্য আবার ব্যবহার করতে হবে। গুগল ম্যাপস এপিআই ডক্স থেকে উদ্ধৃতি :

যদি আপনি কেবল একবারে একটি তথ্য উইন্ডো প্রদর্শন করতে চান (যেমন গুগল ম্যাপের আচরণ), আপনার কেবল একটি তথ্য উইন্ডো তৈরি করা দরকার যা আপনি মানচিত্রের ইভেন্টগুলিতে (যেমন ব্যবহারকারী ক্লিক হিসাবে) বিভিন্ন অবস্থান বা চিহ্নিতকারীগুলিতে পুনরায় সাইন করতে পারেন।

সুতরাং, আপনি নিজের InfoWindowমানচিত্র শুরু করার ঠিক পরে অবজেক্টটি তৈরি করতে এবং তারপরে clickআপনার চিহ্নিতকারীদের ইভেন্ট হ্যান্ডলারগুলি নিম্নরূপে পরিচালনা করতে পারেন may ধরা যাক আপনার কাছে চিহ্নিতকারী রয়েছে someMarker:

google.maps.event.addListener(someMarker, 'click', function() {
   infowindow.setContent('Hello World');
   infowindow.open(map, this);
});

তারপরে পদ্ধতিটি InfoWindowকল না করে আপনি যখন কোনও নতুন চিহ্নিতকারীটিতে ক্লিক করেন তখন স্বয়ংক্রিয়ভাবে বন্ধ হওয়া উচিত close()


আমি এটিও করি তবে পরের চিহ্নিতকারীটিতে খোলার জন্য তথ্য উইন্ডোটি +1 সেকেন্ডের মতো লাগে কি স্বাভাবিক? কখনও কখনও এটি মোটেও খুলবে না। আমি ঠিক একই কোডটি ব্যবহার করি
এমজেবি

ড্যানিয়েল, দুর্দান্ত ধারণা !! তার আগে আমি ম্যানুয়ালি সিঙ্ক্রোনাইজ করার চেষ্টা করছিলাম, তবে এটি অদ্ভুত জাভাস্ক্রিপ্ট ত্রুটিগুলি দেখায় (যেমন "সি সি নাল" মেইন.জেএসে বা কিছু (123 এর মধ্যে রেঞ্জের মধ্যে 123))।
ভিক্টর

31

আপনার ইনফিনিডো সুযোগের বাইরে তৈরি করুন যাতে আপনি এটি ভাগ করতে পারেন।

এখানে একটি সহজ উদাহরণ:

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);
  });
}

ধন্যবাদ. "এটি" ব্যবহার করা আমার বেশিরভাগ সমস্যার সমাধান করে। আমি এখনও সেট কনটেন্টের অভ্যন্তরে কীভাবে কাস্টম সামগ্রী ব্যবহার করব তা বুঝতে পারি না। উদাহরণস্বরূপ, আমার চিহ্নিতকরণের লুপে, আমি "i" ভেরিয়েবলটি ব্যবহার করে একটি ডেটাবেস অবজেক্টের সাথে লিঙ্ক করে একটি কনটেন্ট এইচটিএমএল ভেরিয়েবল তৈরি করি। আমি কীভাবে সেই বিষয়বস্তুটি এইচটিএমএল ভেরিয়েবল শ্রোতার কাছে প্রেরণ করতে পারি?
রায়ান 10

আমার ক্ষেত্রে উইন্ডোটি কেবল তখনই খোলা হয় যখন আমি infowindow.open (মানচিত্র, এটি) -এ "এটি" ব্যবহার করি; "চিহ্নিতকারী" এর পরিবর্তে। আপনার সমাধান ভাগ করে নেওয়ার জন্য ধন্যবাদ।
মালিক হ'ল

আমি এটিও করি তবে পরের চিহ্নিতকারীটিতে খোলার জন্য তথ্য উইন্ডোটি +1 সেকেন্ডের মতো লাগে কি স্বাভাবিক? কখনও কখনও এটি মোটেও খুলবে না। আমি ঠিক একই কোডটি ব্যবহার করি
এমজেবি

14

আমারও একই সমস্যা ছিল তবে সেরা উত্তরটি এটি পুরোপুরি সমাধান করতে পারেনি, বিবৃতি দেওয়ার জন্য আমার যা করতে হয়েছিল তা এটি আমার বর্তমান চিহ্নিতকারীর সাথে সম্পর্কিত 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);                 
}

4
আপনি কীভাবে কনটেন্ট স্ট্রিংটি পাস করবেন তা আমার জন্য কার্যকর ছিল, থেক্স।
13: 26

5

একটি দেরীতে দেরি হয়ে গেছে, তবে আমি বৈশ্বিক চলক হিসাবে মেক ইনফোইন্ডো দ্বারা কেবল একটি ইনফাইন্ডো খুলতে সক্ষম হয়েছি।

var infowindow = new google.maps.InfoWindow({});

তারপরে তালিকার ভিতরে

infowindow.close();
infowindow = new google.maps.InfoWindow({   
    content: '<h1>'+arrondissement+'</h1>'+ gemeentesFiltered                           
});

infowindow.open(map, this);

4
আমার জন্য দুর্দান্ত কাজ করে :)
lumos

4

গ্লোবারবারটি ঘোষণা করুন 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);
});

0

আপনি যখন কোনও নতুন চিহ্নিতকারীতে ক্লিক ইভেন্টটি পরিচালনা করবেন তখন আপনাকে আপনার পূর্ববর্তী ইনফো উইন্ডো অবজেক্টটির উপর নজর রাখতে হবে এবং এটিতে ঘনিষ্ঠ পদ্ধতিটি কল করতে হবে

এনবি ভাগ করা তথ্য উইন্ডো অবজেক্টে ক্লোজ করা প্রয়োজন হয় না, ভিন্ন চিহ্নিতকারী দিয়ে ওপেন করা কলটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে। বিস্তারিত জানতে ড্যানিয়েলের উত্তর দেখুন ।


আমি জানি এটি একটি পুরানো উত্তর, এবং ভি 3 এপিআই তখন অস্পষ্ট ছিল ... তবে বাস্তবে কোনও close()একক InfoWindowঅবজেক্ট ব্যবহার করা হলে সেই পদ্ধতিটি কল করার দরকার নেই । open()পদ্ধতিটি আবার একই বস্তুতে পুনরায় কল করা হলে এটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে ।
ড্যানিয়েল ভ্যাসালো

@ ড্যানিয়েল-ভাসালো এই নোটটির জন্য ধন্যবাদ :) আমি আপনার উত্তরটিকে সেই অনুযায়ী উন্নত করেছি, এটি আমার মনে হয় সবচেয়ে কার্যকর।
রেড ব্লুথিং

0

মূলত আপনি এমন একটি ফাংশন চান যা একটি 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কারণ আমার সূচনাটি ট্যাব ইভেন্টগুলির দ্বারা দেরি হচ্ছে।

ইনফোবক্সঅ্যাপশনস


0

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

  1. সমস্ত তথ্য উইন্ডো সংরক্ষণ করার জন্য একটি বিশ্বব্যাপী অ্যারে তৈরি করুন

    var infoWindows = [];
    
  2. প্রতিটি নতুন তথ্য উইন্ডো অ্যারেতে সঞ্চয় করুন, ইনফোউন্ডো = নতুন ...

    infoWindows.push(infoWindow);
    
  3. ক্লোজআলআইনফো উইন্ডো ফাংশন তৈরি করুন

    function closeAllInfoWindows() {
        for (var i=0;i<infoWindows.length;i++) {
            infoWindows[i].close();
        }
    }
    
  4. আপনার কোডে, তথ্য উইন্ডো খোলার ঠিক আগে ক্লোজআলআইনফো উইন্ডোজ () এ কল করুন।

শুভেচ্ছা,


এটি কাজ করে তবে খুব ভাল সমাধান নয় কারণ আপনি কেবল অ্যারেতে তথ্য উইন্ডো যুক্ত করে চলেছেন, সুতরাং একই তথ্য উইন্ডোটির অনেকগুলি উপস্থিতি থাকলে অ্যারে থাকার সম্ভাবনা রয়েছে।
ওয়ালি

-1

এটি এইভাবে সমাধান:

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);

-5

গুগল ম্যাপ আপনাকে কেবল একটি তথ্য উইন্ডো খোলা রাখতে দেয়। সুতরাং আপনি যদি একটি নতুন উইন্ডো খুলেন, তবে অন্যটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।


4
এটি ঠিক নয়, আমি আমার মানচিত্রে প্রায় 20 টি ইনফাইন্ডো খুলতে পারি। এটি ভি 3 বিটিডাব্লু
লিও

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