You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Google Maps高级标记中获取内部点击元素实现路由?

Google Maps Advanced Marker 多活动标记路由问题

编辑补充:已创建可运行代码示例

我已切换使用Google Maps Advanced Marker,用户点击标记时,标记会展开并显示瑜伽课程详情;再次点击展开后的标记,会跳转至课程活动报名页面,该功能运行正常。

但现在需要在单个标记中展示同一瑜伽场馆的多个即将举办的活动(效果见文末截图)。

问题

无法在标记内容的innerHTML中嵌入routerlink或点击事件(已尝试),因此需要另一种方式确定用户选中的标记内活动并实现路由,但目前不知如何操作。

疑问

是否可以在AdvancedMarkerElement的回调中获取被点击的元素?若能获取标记内被点击的HTML元素,即可通过元素上的ID等活动相关信息实现对应路由,否则暂无解决思路。

目前实现代码

for (const eventMarker of eventMarkers) {

  const AdvancedMarkerElement = new google.maps.marker.AdvancedMarkerElement({
    map,
    // 判断单个经纬度位置下是单活动还是多活动
    content: eventMarker.length === 1 ? this.buildContent(eventMarker) : this.buildContentMultiple(eventMarker),
    position: {
      lat: eventMarker[0].yogaband.latitude,
      lng: eventMarker[0].yogaband.longitude
    }
  });

  AdvancedMarkerElement.addListener("click", () => {
    this.toggleHighlight(AdvancedMarkerElement, id);
  });


}

toggleHighlight(markerView, id) {
  if (markerView.content.classList.contains("highlight")) {
    markerView.content.classList.remove("highlight");
    this.router.navigate(['/events/' + id]);
  } else {
    this.removeHighlight();
    for (const advMarker of this.advancedMarkerElementArray) {
      advMarker.zIndex = 0;
    }
    markerView.content.classList.add("highlight");
    markerView.zIndex = 1;
  }
}

// 构建单活动标记内容
buildContent(eMarker) {
  const content = document.createElement("div");
  content.setAttribute("id", "marker-yogaband-" + eMarker[0].yogaband.name);
  content.classList.add("property");
  content.innerHTML = `
      <div class="icon">
          <div class="title">${eMarker[0].yogaStyle}</div>
          <div class="image"><img style="max-width: 100px; border-radius: 0.275rem" src="${eMarker[0].yogaband.photoUrl}"></div>
      </div>
      <div class="details" style="height: 66px;">
          <div class="text-secondary" style="font-weight: 450 !important; line-height: 1em; font-size: .9rem !important;">
            <span>${formatDate(eMarker[0].date,'M/d/y','en-US')}</span>
          </div>
          <div class="mb-1" style="font-size: 1.25rem!important; font-weight: 450 !important;">
            <span>${eMarker[0].yogaLevel + ' ' + eMarker[0].yogaStyle}</span>
          </div>
          <div class="features">
            <div>
              <i aria-hidden="true" class="fa fa-clock fa-lg feature"></i>
              <span>${formatDate(eMarker[0].date,'h:mm a','en-US')}</span>
            </div>
            <div>
              <i aria-hidden="true" class="fa fa-hourglass-start fa-lg feature"></i>
              <span class="float-end">${eMarker[0].eventLength + ' min'}</span>
            </div>
            <div>
              <i aria-hidden="true" class="fa fa-person fa-lg feature"></i>
              <span>${eMarker[0].maxSize === 0 ? eMarker[0].registrantCount : eMarker[0].registrantCount + '/' + eMarker[0].maxSize}</span>
            </div>
          </div>
      </div>
      `;
  return content;
}

// 构建多活动标记内容
buildContentMultiple(eMarker) {
  const content = document.createElement("div");
  content.setAttribute("id", "marker-yogaband-" + eMarker[0].yogaband.name);
  content.classList.add("property");
  content.classList.add("auto-height");

  let html = `
      <div class="icon">
          <div class="title">${eMarker.length + ' 场活动'}</div>
          <div class="image"><img style="max-width: 100px; border-radius: 0.275rem" src="${eMarker[0].yogaband.photoUrl}"></div>
      </div>
      <div class="details">`;
  let count = 0;
  for (const marker of eMarker) {
    count >= 1 ? html += `<hr>` : '';
    const multMarker =
      `<div class="multi-marker-container">
          <div class="text-secondary" style="font-weight: 450 !important; line-height: 1em; font-size: .9rem !important;">
            <span>${formatDate(marker.date,'M/d/y','en-US')}</span>
          </div>
          <div class="mb-1" style="font-size: 1.25rem!important; font-weight: 450 !important;">
            <span>${marker.yogaLevel + ' ' + marker.yogaStyle}</span>
          </div>
          <div class="features">
            <div>
              <i aria-hidden="true" class="fa fa-clock fa-lg feature"></i>
              <span>${formatDate(marker.date,'h:mm a','en-US')}</span>
            </div>
            <div>
              <i aria-hidden="true" class="fa fa-hourglass-start fa-lg feature"></i>
              <span class="float-end">${marker.eventLength + ' min'}</span>
            </div>
            <div>
              <i aria-hidden="true" class="fa fa-person fa-lg feature"></i>
              <span>${marker.maxSize === 0 ? marker.registrantCount : marker.registrantCount + '/' + marker.maxSize}</span>
            </div>
          </div>
        </div>`;
    html += multMarker;
    count++;
  }

  html += `</div>`;
  content.innerHTML = html;
  return content;
}

效果截图

  • 地图上的活动
    活动标记截图

  • 点击后展开的单活动标记
    单活动展开截图

  • 点击后展开的多活动标记
    多活动展开截图

内容的提问来源于stack exchange,提问作者chuckd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:45:09