0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GoogleMapのMarkerにclickイベントを設定したら、2回呼ばれるので調整

Posted at

GoogleMapにカスタムのMarkerを設置して、
そのMarkerにクリックイベントを設定したら、どうやら2回クリックイベントが呼ばれている

書いたコード

const marker = new google.maps.Marker({
    position: {lat: 35.6894 , lng: 139.6917 },
    icon: `${basePath}img/marker.png`,
    map: map,
});

marker.addListener('click', () => {
    console.log('MarkerClick');
});

こうかくと、何故かコンソールには
MarkerClick が2回表示される

なぜ2回呼ばれているのか

marker.addListener('click', ({ domEvent }) => {
    console.log('MarkerClick', domEvent);
});

こうすると、コンソール表示は
domEventが、TouchEventMouseEvent が表示されていました
これが原因のようです:sweat_smile:

もしかして…

動作確認環境よって違う?
TouchEventMouseEvent が表示されていたのは、chromeの開発ツールでモバイル表示
chromeの開発ツールPC表示の場合だと PointerEvent のみでした

  • iPhone8 iOS15.3.1 safariだとTouchEventのみ
  • iPhoneX iOS16.5 safariだとTouchEventMouseEvent
  • Android9 chromeだとTouchEventMouseEvent

と端末によっても、ちょっと挙動が違いました・・・
やっかいですね・・・

ちなみに

イベントタイプは以下のようでした

domEvent type
TouchEvent touchend
MouseEvent click
PointerEvent click

書き換えたコード

:whale: ヒントになった公式ドキュメントのページ
https://developers.google.com/maps/documentation/javascript/advanced-markers/overview?hl=ja#make_markers_respond_to_click_and_keyboard_events

なるほど、高度なマーカーのクリックイベント操作ですわ :rolling_eyes:

marker.addListener('click', ({ domEvent }) => {
    if (
        isDesktop && domEvent.type == 'click' ||
        !isDesktop && domEvent.type == 'touchend'
    ) {
        console.log('MarkerClick');
    }
});

これで1回しか呼ばれなくなりました
isDesktop でデスクトップなのかタッチデバイスか判定しています

まとめ

特に2回呼ばれていても変な挙動をするようなことは書いていなかったけど
のちのちバグに繋がりそうなので、1回にするべる奮闘したけれど、
今まで得にバグってないので、やらなくても良かったかも?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?