Событие клика в Google Map InfoWindow не перехвачено

С Google Map v2 я хотел бы иметь возможность запускать функцию при нажатии на текст в InfoWindow GMarker.

$(".foo").click(myFunction);

...

marker.openInfoWindowHtml("<span class=\"foo\">myText</span>");

не работает. Почему событие не фиксируется внутри InfoWindow?


person user244129    schedule 07.02.2010    source источник


Ответы (6)


Если вызов привязки события вызывается перед вызовом openInfoWindowHtml, как в вашем примере, диапазон не был в DOM, пока первый вызов искал элементы с классом «foo», поэтому обработчик не был прикреплен.

Вы можете либо переместить этот обработчик событий для вызова после openInfoWindowHtml, либо использовать «живую» привязку события, чтобы jQuery отслеживал DOM для любых новых элементов с данным селектором.

$(".foo").live('click', myFunction);
person Kevin Gorski    schedule 07.02.2010
comment
Спасибо, Кевин, это работает. Мне нужно было поместить событие click на внутреннюю #ссылку jquery mobile, и кажется, что внутренняя страница загружается до того, как событие сработает ?? просто кое-что, о чем нужно знать. - person Michael Dausmann; 04.06.2011

Я не мог заставить это работать, как объяснил Кевин Горски...

с jquery 1.9.1 и maps api v=3.exp работает следующее:

infowindow.setContent('<a href="#" id="test">test</a>');
google.maps.event.addDomListener(infowindow, 'domready', function() {
    $('#test').click(function() {
        alert("Hello World");
    });
});
person steven    schedule 16.05.2013

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

$(".foo").live("click", myFunction);

См. обработчики событий live.

person karim79    schedule 07.02.2010

Попробуй это:

google.maps.event.addListener(infowindow,"**domready**",function() {
    var Cancel = document.getElementById("Cancel");
    var Ok = document.getElementById("Ok");

    google.maps.event.addDomListener(Cancel,"click",function() {
        infowindow.close();
    });

    google.maps.event.addDomListener(Ok,"click",function() {
        infowindow.close();
        console.log(position);
        codeLatLng(position);
    });
});
person user2280969    schedule 15.04.2013

простое решение и работа для меня. использовать событие onclick в диапазоне.

<span class=\"foo\" onclick="test()">myText</span>

function test(){
alert('test OK');
}
person bCliks    schedule 09.07.2014

Самые простые и полностью описывающие решения.

Само infoWindow должно содержать только div-заполнитель с уникальным id:

    <InfoWindow
        marker={this.state.activeMarker}
        visible={this.state.showingInfoWindow}
        onOpen={e => {
          this.onInfoWindowOpen(this.props, e);
        }}
      >
        <div id="xyz" />
      </InfoWindow>

А внутри Mapcontainer вы определяете обратный вызов onInfoWindowOpen, который вставляет один компонент/контейнер с событием onClick и отображает его в заполнитель div:

    onInfoWindowOpen = () => {
        const button = (<button 
        onClick={
            () => {
            this.viewClinic(this.state.selectedPlace.slug)
            }
            }>
            View Details
        </button>);
        ReactDOM.render(React.Children.only(button),document.getElementById("xyz"));
        }


Вот рабочий пример:

https://codesandbox.io/s/k0xrxok983


Еще один полный пример MAP, Marker и InfoWindow:

https://codesandbox.io/s/24m1yrr4mj

Если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарий.

person Farrukh Malik    schedule 03.04.2020