Могу ли я получить элемент, нажатый на элемент расширенного маркера Google Maps?

(РЕДАКТИРОВАНИЕ) - Я создал работоспособный образец кода в соответствии с запросом Пример кода jsfiddle

Я переключился на расширенные маркеры Google Maps, и внутри каждого маркера, если пользователь нажимает на него, он расширяется и отображает сведения о занятиях йогой. Если пользователь еще раз нажмет на развернутый маркер, он перенаправит его на страницу мероприятия класса, где он сможет зарегистрироваться.

Это отлично работает!

Но теперь мне нужно отображать несколько событий класса в одном маркере на случай, если в студии йоги пройдет несколько мероприятий в одном месте. (фото в самом низу).

Проблема. Я не могу встроить ссылку маршрутизатора или событие щелчка во внутренний HTML-код, который устанавливается на содержимое маркера (я пробовал), поэтому мне нужен другой способ определить, какое событие было выбрано пользователем внутри маркера, а затем направить его кстати, я просто не знаю, как это сделать?

Вопрос. Я подумал, что может быть способ щелкнуть элемент в обратном вызове AdvancedMarkerElement? Если бы я мог получить элемент HTML, по которому щелкнули внутри маркера, я мог бы получить идентификатор или что-то, имеющее отношение к событию, а затем соответствующим образом маршрутизировать его, иначе я не понимаю, как это сделать.

Вот что я делаю до сих пор.

for (const eventMarker of eventMarkers) {

  const AdvancedMarkerElement = new google.maps.marker.AdvancedMarkerElement({
    map,
    // this check determines if there is 1 event or multiple at a single location (lat/lng) on the 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;
  }
}

// build marker for a single event at specific lat/lng
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;
}

// build marker for multiple events at a specific lat/lng
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 + ' Events'}</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" (click) = "routeToEvent(${marker.id})">
          <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;
}

События на карте

Одно событие внутри маркера после его щелчка (развернутого)

Несколько событий внутри маркера после его щелчка (развернутого)

Какой смысл создавать нерабочий фрагмент кода? Вы должны предоставить минимально воспроизводимый пример, позволяющий воспроизвести проблему.

MrUpsidown 18.04.2024 10:13

пожалуйста, отредактируйте свой вопрос и включите минимальный воспроизводимый пример и проголосуйте за повторное открытие, чтобы этот вопрос/ответ можно было сохранить, поскольку я считаю, что он может быть полезен другим.

MrUpsidown 19.04.2024 10:40

@MrUpsidown Я добавил образец рабочего кода по вашему запросу.

chuckd 19.04.2024 19:22
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
3
299
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете получить доступ к любым данным, которые вам нужны, в обработчике событий click.

Например, вы можете создать HTML-контент ваших событий следующим образом:

<div class = "event" data-event-id = "1">
  Beginner Bikram
</div>

<div class = "event" data-event-id = "2">
  Beginner Ashtanga
</div>

Здесь я использую data-event-id = "1" и data-event-id = "2" для обозначения двух событий.

Теперь в обработчике событий click вы можете получить идентификатор события щелчка:

AdvancedMarkerElement.addListener("click", (e) => {
  console.info(e.domEvent.target.dataset.eventId) // logs "1" or "2"
});

e.domEvent.target — HTML-элемент, по которому был сделан щелчок. dataset.eventId — это значение data-event-id.

Если ваш HTML содержит дочерние элементы, вы также можете добавить data-event-id к дочерним элементам или использовать JS, чтобы найти родительский элемент, который имеет идентификатор события при нажатии на дочерний элемент.

Другие вопросы по теме