鼠标单击时的信息窗口仅适用于一个标记

时间:2019-08-02 12:43:07

标签: javascript google-maps charts jsfiddle infowindow

我有一个包含5个标记的地图,鼠标单击时每个标记都需要一个信息窗口,我有一个可以工作的infoWindow。但是,当我为另一个标记的另一个infoWindow添加代码/数据时,它不起作用(即,我单击爱丁堡的标记,并显示一个气泡,但图表不显示,而当我单击该标记时,则什么也没有显示因弗内斯标记)。

链接到JSFIDDLE文件:https://jsfiddle.net/MarnieMaclean/megx2cbo/30/

代码段:我目前有2/5个标记的InfoWindow数据。

google.charts.load('current', {packages: ['corechart']});

 function drawChart(map, marker) {
//set up data
var data = google.visualization.arrayToDataTable([
['Genre', '#'],
['Science Fiction', 55],
['Comedy', 33],
['Thriller', 21],
['Action', 63],
['Romance', 17], 
]);

   //set up any options
var options = {
title: 'Film Genre Preferences'
};

//Create node
 var node = document.createElement('div'),
 infoWindow = new google.maps.InfoWindow(),
 chart = new google.visualization.BarChart(node);

 //chjjeck which marker it is
 if (marker.id == 'c4') {
 chart.draw(data, options);

 }
   infoWindow.setContent(node);
  infoWindow.open(map,marker);
}


   google.charts.load('current', {packages: ['corechart']});
function drawChart(map, marker) {
//set up data
var data = google.visualization.arrayToDataTable([
['Genre', '#'],
['Science Fiction', 41],
['Comedy', 27],
['Thriller', 13],
['Action', 15],
['Romance', 19], 
]);

   //set up any options
var options = {
title: 'Film Genre Preferences'
};

//Create node
 var node = document.createElement('div'),
 infoWindow = new google.maps.InfoWindow(),
 chart = new google.visualization.BarChart(node);

 //chjjeck which marker it is
 if (marker.id == 'c1') {
 chart.draw(data, options);

 }
   infoWindow.setContent(node);
  infoWindow.open(map,marker);
}


// Initialize and add the map
 function initMap() {

  //The location of Inverness
  var inverness = {lat: 57.480819, lng: -4.224250};
  var city1 = {position: inverness};
  // The map, centered at Inverness
  var map = new google.maps.Map(
      document.getElementById('map'), {zoom: 4, center: inverness});
      // The marker positioned at Inverness
var marker1 = new google.maps.Marker({position: inverness, map: map, id: 'c1', title: 'Number Of Cinemas: 2'});

 //The location of Dundee
  var dundee = {lat: 56.467546, lng: -2.969593};
  var city2 = {position: dundee};
  // The marker, positioned at Dundee
  var marker2 = new google.maps.Marker({position: dundee, map: map, id: 'c2', title: 'Number Of Cinemas: 2'});

//The location of Glasgow
  var glasgow = {lat: 55.875362, lng: -4.250252};
  var city3 = {position: glasgow};
  // The marker, positioned at Glasgow
  var marker3 = new google.maps.Marker({position: glasgow, map: map, id: 'c3', title: 'Number Of Cinemas: 11'});

  //The location of Edinburgh
    var edinburgh = {lat: 55.959425, lng: -3.189161};
    var city4 = {position: edinburgh};
    // The marker, positioned at Edinburgh
  var marker4 = new google.maps.Marker({position: edinburgh, map: map, id: 'c4', title: 'Number Of Cinemas: 3'}); 


  //The location of Aberdeen
  var aberdeen = {lat: 57.155988, lng: -2.095139};
  var city5 = {position: aberdeen};
  // The marker, positioned at Aberdeen
  var marker5 = new google.maps.Marker({position: aberdeen, map: map, id: 'c5', title: 'Number Of Cinemas: 3'});
  marker4.addListener('click', function() {
  drawChart(map,this);
  });
  } 

Proof of infoWindow working for one marker

What happens after I've added code for a 2nd infoWindow

Click on the marker, no infoWindow

1 个答案:

答案 0 :(得分:0)

您的数据无处不在,请不要使用位置名称创建无用的变量。
您已经了解JS中的数据结构!使用它们。

const locations = [{
    id: 'c1',
    name: 'inverness',
    title: 'Number Of Cinemas: 2',
    lat: 57.480819,
    lng: -4.224250,
    chart: [
      ['Genre', '#'],
      ['Science Fiction', 55],
      ['Comedy', 33],
      ['Thriller', 21],
      ['Action', 63],
      ['Romance', 17],
    ]
  },
  // Etc.....
]

比,为了得到想要的-一切都变得简单得多。只需循环数据:

locations.forEach(loc => initMarker(loc, map, infowindow));

示例:

const locations = [{
    id: 'c1',
    name: 'Inverness',
    title: 'Number Of Cinemas: 2',
    lat: 57.480819,
    lng: -4.224250,
    chart: [
      ['Genre', '#'],
      ['Science Fiction', 55],
      ['Comedy', 33],
      ['Thriller', 21],
      ['Action', 63],
      ['Romance', 17],
    ]
  },
  {
    id: 'c2',
    name: 'Dundee',
    title: 'Number Of Cinemas: 2',
    lat: 56.467546,
    lng: -2.969593,
    chart: [
      ['Genre', '#'],
      ['Science Fiction', 41],
      ['Comedy', 27],
      ['Thriller', 13],
      ['Action', 15],
      ['Romance', 19],
    ]
  },
  {
    id: 'c3',
    name: 'Glasgow',
    title: 'Number Of Cinemas: 11',
    lat: 55.875362,
    lng: -4.250252,
    chart: [
      ['Genre', '#'],
      ['Science Fiction', 10],
      ['Comedy', 45],
      ['Thriller', 63],
      ['Action', 15],
      ['Romance', 7],
    ]
  },
  {
    id: 'c4',
    name: 'Edinburgh',
    title: 'Number Of Cinemas: 3',
    lat: 55.959425,
    lng: -3.189161,
    chart: [
      ['Genre', '#'],
      ['Science Fiction', 23],
      ['Comedy', 61],
      ['Thriller', 7],
      ['Action', 66],
      ['Romance', 46],
    ]
  },
  {
    id: 'c5',
    name: 'Aberdeen',
    title: 'Number Of Cinemas: 3',
    lat: 57.155988,
    lng: -2.095139,
    chart: [
      ['Genre', '#'],
      ['Science Fiction', 36],
      ['Comedy', 9],
      ['Thriller', 13],
      ['Action', 56],
      ['Romance', 34],
    ]
  },
];

function infowindowContent(loc) {
  var EL_infowindow = document.createElement('div');
  var options = {
    title: `${loc.name} Film Genre Preferences`
  };
  var chart = new google.visualization.BarChart(EL_infowindow);
  var data = google.visualization.arrayToDataTable(loc.chart);
  chart.draw(data, options);
  EL_infowindow.id = 'infowindow';
  return EL_infowindow;
}

function initMarker(loc, map, infowindow) {
  var marker = new google.maps.Marker({
    position: new google.maps.LatLng(loc.lat, loc.lng),
    map: map
  });
  google.maps.event.addListener(marker, 'click', function() {
    infowindow.close(); // Close previously opened infowindow
    infowindow.setContent(infowindowContent(loc));
    infowindow.open(map, marker);
  });
}

// Initialize and add the map
function initMap() {
  google.charts.load('current', {
    packages: ['corechart']
  });
  var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 6,
    center: new google.maps.LatLng(locations[0].lat, locations[0].lng)
  });
  var infowindow = new google.maps.InfoWindow(); // One instance
  locations.forEach(loc => initMarker(loc, map, infowindow));
}
#map {
  height: 400px;
  width: 100%;
}
<div id="map"></div>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initMap"></script>