Google Maps Marker Filtering

时间:2016-03-31 01:57:46

标签: javascript jquery google-maps google-maps-api-3

我有以下jsfiddle:

http://jsfiddle.net/inkedraskal/zeLon7cs/2/

当地图加载显示的所有点时,您会注意到,并且过滤本身似乎正常工作。 但是,当您单击过滤器(例如项目)时,它将仅显示项目,但如果再次单击它,则不会重置标记。同样,如果您说点击新闻,然后点击资料,再次点击资料,它就不会显示仅适用于的标记新闻(仍显示适用于新闻资料的标记,而不仅仅是新闻)。

任何提示都将非常感激。

我在点击

上创建列表项过滤标记
<div class="filters">
  <ul>
      <li>
          <a href="#" data-filterby="type" data-filtervalue="project">Projects</a>
      </li>
      <li>
          <a href="#" data-filterby="type" data-filtervalue="news">News</a>
      </li>
      <li>
          <a href="#" data-filterby="type" data-filtervalue="stuff">stuff</a>
      </li>
  </ul>
  <ul>
      <li>
          <a href="#" data-filterby="date" data-filtervalue="201401">Jan</a>
      </li>
      <li>
          <a href="#" data-filterby="date" data-filtervalue="201402">Feb</a>
      </li>
      <li>
          <a href="#" data-filterby="date" data-filtervalue="201403">Mar</a>
      </li>
  </ul>
</div>
<div class="clear"></div>

在我的JS底部你会看到以下内容:

$(document).on('click', '.filters a', function (event) {
     event.preventDefault();
     var $target = $(event.target);
     var type = $target.data('filterby');
     var value = $target.data('filtervalue');
     $(this).toggleClass('active');
     $.each(map.markers, function () {
         if (this.filter[type] && this.filter[type].indexOf(value.toString()) >= 0) {
             if (this.map == null) {
                  this.setMap(map);
             }
         } else {
             this.setMap(null);
         }
     });
});

1 个答案:

答案 0 :(得分:1)

在循环中隐藏/显示每个标记,对于每个单独的标记,您只检查该标记是否具有单击的过滤器值。您需要针对每个活动过滤器检查每个标记。

 $(document).on('click', '.filters a', function(event) {
  event.preventDefault();

  $(this).toggleClass('active');

  // create an array of active filters
  var activeFilters = [];
  $(".filters a.active").each(function() {
    activeFilters.push({
      by: $(this).data("filterby"),
      value: $(this).data("filtervalue").toString()
    });
  });

  if (activeFilters.length === 0) { // if there are no active filters, show all markers
    for (var i = 0; i < map.markers.length; i++) {
      map.markers[i].setMap(map);
    }
  } else {
    for (var i = 0; i < map.markers.length; i++) { // for each marker
      var marker = map.markers[i]; // just to make the next code easier

      var missingActiveFilter = false;
      // check if marker has every active filter
      for (var j = 0; j < activeFilters.length; j++) {
        var filter = activeFilters[j];
        if (filter.by === "type" && marker.filter.type.indexOf(filter.value) === -1 || filter.by === "date" && marker.filter.date.indexOf(filter.value) === -1) {
          missingActiveFilter = true;
          break;
        }
      }

      if (missingActiveFilter) {
        marker.setMap(null);
      } else {
        marker.setMap(map);
      }

    }
  }
});

});

Updated JSFiddle