从地图中删除 google.maps.marker.AdvancedMarkerView

问题描述 投票:0回答:1

我有一张地图,它根据搜索填充标记。我正在尝试使用较新的谷歌地图功能

AdvancedMarkerView
,这样我就可以用自定义 HTML 填充它 - 但是,随着我的搜索更新,我想刷新旧标记并在需要时放置新标记......并且我我一生都无法弄清楚如何做吗? https://developers.google.com/maps/documentation/javascript/reference/advanced-markers

下面放置自定义标记。它有效。

const content = document.createElement('div');
content.className = 'marker-title';
content.textContent = item.title;

const marker = new google.maps.marker.AdvancedMarkerView({
  map,
  position: item.position,
  content
});

通常对于标记,就像在旧标记中一样,我已经使用以下代码删除了它们,

markers.forEach((marker) => marker.setMap(null))
但这似乎不适用于高级标记。由于创建高级标记时返回的标记指向该元素,因此我还尝试执行
marker.remove()
,认为 HTML 元素将成为目标,但没有雪茄。

当涉及到高级标记时,我无法在 Google API 文档中找到任何具体示例,对于其他提出相同问题的人来说也是如此。

javascript google-maps google-maps-api-3 google-maps-markers google-maps-advanced-marker-element
1个回答
10
投票

没有

setMap()
或其他方法可以调用
AdvancedMarkerView
来切换其可见性或将其从地图中删除。

虽然不是很清楚,但文档说:

要从地图上删除标记,请将

markerView.map
属性设置为
null

工作示例如下:

async function initMap() {

  const { Map } = await google.maps.importLibrary("maps");
  const { AdvancedMarkerElement } = await google.maps.importLibrary("marker");
  const map = new Map(document.getElementById("map"), {
    center: { lat: 37.39094933041195, lng: -122.02503913145092 },
    zoom: 14,
    mapId: "4504f8b37365c3d0",
  });

  const draggableMarker = new AdvancedMarkerElement({
    map,
    position: { lat: 37.39094933041195, lng: -122.02503913145092 },
    draggable: true,
    title: "This marker is draggable. Click to remove.",
  });
  
  draggableMarker.addListener("click", (event) => {
  
    // Remove AdvancedMarkerElement from Map
    draggableMarker.map = null;
  });
  
  map.addListener("click", (event) => {
  
    // Set AdvancedMarkerView position and add to Map
    draggableMarker.position = event.latLng;
    draggableMarker.map = map;
  });
}

initMap();
#map {
  height: 160px;
}
<div id="map"></div>

<script>
  (g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})({
    key: "AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk",
    v: "weekly",
  });
</script>

© www.soinside.com 2019 - 2024. All rights reserved.