【问题标题】:Showing locations on map and list在地图和列表上显示位置
【发布时间】:2018-06-10 17:03:57
【问题描述】:

我在数据库表中插入了一些坐标和一些关于它们的数据。我想在列表中显示信息并将位置显示为地图上的标记。

如何将列表项与地图上的相应标记相关联。就像当我将鼠标悬停在列表中的一行上时,在地图上显示该项目位置的标记会反弹或改变颜色,反之亦然;我的意思是将鼠标悬停在标记上,突出显示描述该标记的行。

我想到了类似Homestay 的搜索结果

目前我正在使用同步融合地图和中继器来生成列表,但如果你能建议我一个更好的选择,我可以改变它

【问题讨论】:

    标签: javascript jquery asp.net


    【解决方案1】:

    我不熟悉同步融合,但从概念上讲,我认为您想要做的是在标记和列表项之间创建关系。

    这是一个非常通用的解决方案,您可以(希望)对其进行修改以适应您正在做的事情:

    const locations = Array.from(document.querySelectorAll('.map-location'));
    
    /**
     * Gets the location ID from the DOM element's data-location-id
     * this is how we have chosen to associate markers with details
     */
    function getElemLocationID(elem) {
      return elem.getAttribute('data-location-id');
    }
    
    /**
     * Returns an array containing a marker and details element,
     * based on their shared locationID
     */
    function getLocationElementsFromID(locationID, locations) {
      const linkedLocationElements = locations.filter((location) => {
        let compareID = getElemLocationID(location);
        return compareID === locationID;
      });
    
      return linkedLocationElements;
    }
    
    function handleMouseOver(elements) {
      elements.map((elem) => elem.classList.add('highlighted'));
    }
    
    function handleMouseOut(elements) {
      elements.map((elem) => elem.classList.remove('highlighted'));
    }
    
    /**
     * Sets up the mouse events on the map-location elements
     */
    function linkListToMarkers(locations) {
      locations.map((location) => {
        location.addEventListener('mouseover', (e) => {
          const locationID = getElemLocationID(e.currentTarget);
          const locationElements = getLocationElementsFromID(locationID, locations);
          handleMouseOver(locationElements);
        });
        location.addEventListener('mouseout', (e) => {
          const locationID = getElemLocationID(e.currentTarget);
          const locationElements = getLocationElementsFromID(locationID, locations);
          handleMouseOut(locationElements);
        });
      });
    }
    
    linkListToMarkers(locations);
    .marker {
      display: inline-block;
      border: 3px solid #cccccc;
    }
    
    .marker.highlighted {
      border: 3px solid magenta;
    }
    
    .details {
      cursor: pointer;
      margin: 0 0 8px;
    }
    
    .details.highlighted {
      color: magenta;
    }
    <img src="http://i.stack.imgur.com/rU427.png" data-location-id="location-1" class="map-location marker" />
    <img src="http://i.stack.imgur.com/rU427.png" data-location-id="location-2" class="map-location marker" />
    <img src="http://i.stack.imgur.com/rU427.png" data-location-id="location-3" class="map-location marker" />
    <img src="http://i.stack.imgur.com/rU427.png" data-location-id="location-4" class="map-location marker" />
    
    <ul>
      <li data-location-id="location-1" class="map-location details">Location 1</li>
      <li data-location-id="location-2" class="map-location details">Location 2</li>
      <li data-location-id="location-3" class="map-location details">Location 3</li>
      <li data-location-id="location-4" class="map-location details">Location 4</li>
    </ul>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 2015-05-16
      相关资源
      最近更新 更多