javascript - 使用复选框过滤谷歌地图标记

标签 javascript jquery google-maps

我正在尝试根据 this V3 example 从复选框中过滤我的谷歌地图标记.我的复选框 html 是:

<form action="#">
  Attractions: <input type="checkbox" id="attractionbox" onclick="boxclick(this,'attraction')" /> &nbsp;&nbsp;
  Food and Drink: <input type="checkbox" id="foodbox" onclick="boxclick(this,'food')" /> &nbsp;&nbsp;
  Hotels: <input type="checkbox" id="hotelbox" onclick="boxclick(this,'hotel')" /> &nbsp;&nbsp;
  Towns/Cities: <input type="checkbox" id="citybox" onclick="boxclick(this,'city')" /><br />
</form>

我的 javascript 在下面。我似乎无法让过滤器工作 - 目前所有标记都出现在 map 上,无论复选框的状态如何。我猜我只是把我的一些变量放在了错误的地方,但到目前为止我还没能解决这个问题!任何帮助将不胜感激。

var map;
var infowindow;
var image = [];
var gmarkers = [];

  image['attraction'] = 'http://google-maps-icons.googlecode.com/files/beach.png'; 
  image['food'] = 'http://google-maps-icons.googlecode.com/files/restaurant.png';
  image['hotel'] = 'http://google-maps-icons.googlecode.com/files/hotel.png';
  image['city'] = 'http://google-maps-icons.googlecode.com/files/smallcity.png';

function mapInit(){
    var centerCoord = new google.maps.LatLng(18.23, -66.39); 
    var mapOptions = {
        zoom: 1,
        center: centerCoord,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    map = new google.maps.Map(document.getElementById("map"), mapOptions);

    google.maps.event.addListener(map, 'click', function() {
      infowindow.close();
    });

    jQuery.getJSON("/places", function(json) {
      if (json.length > 0) {
        for (i=0; i<json.length; i++) {
          var place = json[i];
          var category = json[i].tag;
          addLocation(place,category);
        }
      }
    });

    function addLocation(place,category) {
      var marker = new google.maps.Marker({
        position: new google.maps.LatLng(place.lat, place.lng),
        map: map,
        title: place.name,
        icon: image[place.tag]
      });

      marker.mycategory = category;
      gmarkers.push(marker);

      google.maps.event.addListener(marker, 'click', function() {
        if (infowindow) infowindow.close();
        infowindow = new google.maps.InfoWindow({
          content: "<h3>"+ place.name +"</h3><p>" + place.tag +"</p><a href='/places/"+place.id+"'>Show more!</a>"
        });
        infowindow.open(map, marker);
      });
    }

    function show(category) {
      for (var i=0; i<gmarkers.length; i++) {
        if (gmarkers[i].mycategory == category) {
          gmarkers[i].setVisible(true);
        }
      }
      document.getElementById(category+"box").checked = true;
    }

    function hide(category) {
      for (var i=0; i<gmarkers.length; i++) {
        if (gmarkers[i].mycategory == category) {
          gmarkers[i].setVisible(false);
        }
      }
      document.getElementById(category+"box").checked = false;
      infowindow.close();
    }

    function boxclick(box,category) {
      if (box.checked) {
        show(category);
      } else {
        hide(category);
      }
    }
}

jQuery(document).ready(function(){
    mapInit();
});

最佳答案

您的问题是 boxclick() 函数包含在 mapInit() 函数的范围内,因此 boxclick()无法从 mapInit() 外部访问。您应该从 HTML 输入字段中删除 onclick 事件,然后在 mapInit() 函数中定义事件处理程序,如下所示:

function mapInit() {

  // ...

  $('#attractionbox').click(function () {
    boxclick(this, 'attraction');
  }); 
}

关于javascript - 使用复选框过滤谷歌地图标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3324573/

相关文章:

javascript - javascript 中的 jquery 不工作

javascript - Jquery 获取没有父级的列表值

javascript - 如何在 D3 map 上添加线条箭头(标记)?

javascript - php 在发布时在变量末尾丢失了+(加号)

javascript - Web 应用程序中的地理位置欺骗保护

javascript - Backbone Marionette 相关模型

python - 无法导入名称 GoogleMaps

javascript - 如何为背景网格行添加自定义删除选项

javascript - 单击时使用 jQuery 更改图像不起作用

web-services - 如何在经度和纬度之外获得道路的标记速度限制