Клуб API Карт

Как повесить обработчик на событие начала перетаскивания карты?

Пост в архиве.

Добрый день.

Существует ли способ однозначно определить событие начала перетаскивания карты мышкой по типу dragstart для геообъектов?

Из документации удалось соорудить следующее:

ymap.events.add( 'actionbegin', function( e ){
    var isFirstCallback = true;
    e.get( 'action' ).events.add( 'tick', function( tick_e ){
        if ( isFirstCallback ) {
            // условие, что зум не поменялся (cachedZoom задается выше по коду)
            if ( tick_e.originalEvent.tick.zoom === cachedZoom ) {
                // вот тут все действия, которые выполняются при начале перетаскивания карты
            }
            isFirstCallback = false;
        }
    } );
} );

 но, по-моему, это фейспалм =)

Подскажите, пожалуйста, более оптимальный способ. Спасибо!

4 комментария
Sergey Konstantinov
28 января 2016, 01:01
Ну, это (почти) правильный вариант (вместо ymaps должна быть инстанция карты, и actiontick можно слушать на ней). А чем он вас не устраивает и зачем вы хотите отличать drag от других перемещений карты?

> вместо ymaps должна быть инстанция карты
Да, конечно, в боевом коде она там и есть, это я тут некорректно пример составил

> actiontick можно слушать на ней
Этого не знал, попробую обязательно)

Собственно, не устраивала эта вложенность слушателей (а вдруг обработчик 'tick'-событий не очищается сборщиком из памяти, откуда мне знать=) их же там вагон накопится на каждый actionbegin).

А отличать drag от других перемещений карты не нужно, вы правы, нужно отличать только от zoom'a.

Спасибо за ответ!

Sergey Konstantinov
28 января 2016, 01:01
Ну, можно так переписать
map.events
  .add('actionbegin', function () { firstTick = true; })
  .add('actiontick', function () {
    if (firstTick) {
      // ...
      firstTick = false;
    }
  });

Спасибо, так и написал.

А почему событие actionend триггерится, даже когда я еще не закончил перетаскивание карты (не отпустил кнопку мыши), а просто прекратил движение мышью?