Клуб API Карт

отключить drag

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

Подскажите пожалуйста, не соображу никак

есть некий placemark и я хочу при некоторых условиях отключать возможность его перемещения

Пишу

placemark.events.add("beforedrag", function(e){
if(условия запрета){
this.options.set("draggable", false);
}

},placemark);

но при таком варианте хоть немного, но перемещается

в документации прочитала, что надо как-то добавить preventDefault, но не соображу, куда и как. Как нужно переписать код?

6 комментариев
Sergey Konstantinov
28 января 2016, 04:21

На mousedown повесьте обработку.

Хм, а может быть отключать draggable не в тот момент, когда пользователь пытается перетаскивать, а по наступлению условия запрета?

Ну, другой вариант - расставлять запреты еще на момент добавления объекта на карту, просто я хотела избежать ненужной работы и проверять, можно ли пользователю таскать конкретно этот объект именно тогда, когда он захочет это сделать. В принципе совет с mousedown решает проблему, хотя немного не так, как мне хочется, ну ладно.

Взялась за проверку изменения геометии (для линий и полигонов), оказалось, что драг вызывает для них постоянное событие geometrychange на протяжении всего перетаскивания (в принципе логично, но неудобно, потому как я хочу сохранять изменения в положения и геометрии в БД и множественные пересохранения при перетаскивании меня не устраивают). Для разделения этих двух процессов (драг объекта целиком и изменение вершин) я решила попробовать отслеживать state ->drag

Тут всплыл другой вопрос  - каков синтаксис обращения к состоянию геообъекта (state), конкретно - перетаскивается ли он?

m.events.add("geometrychange", function(result){
alert(this.state('drag'));
},m);

не срабатывает вообще, вешая изменение геометрии

alert(this.state.get('drag'));  - выдает undefined

Это не "избежать ненужной работы", а строго наоборот.

В Вашем варианте проверка "можно ли таскать" выполняется каждый раз, когда пользователь ткнул мышкой.

Проверка же при добавлении выполнится один раз.

 

С алертами во время событий есть проблема: продолжается ли перетаскивание во время выполнения алерта? Фокус-то с карты уходит в окно сообщения...

Надежнее сделать на странице временный , и вместо alert(this.state.get('drag')); использовать $("#debug").val(this.state.get('drag'));

 

О! спасибо! не догадалась. Получается, что пытаясь отладить проблему, я ее усугубляю. Учту на будущее

Если я правильно понял ситуацию, то Вам не нужен обработчик событий маркера. Вам нужно устанавливать эту опцию непосредственно в момент запрета (то есть скорее всего на событии какого то другого  объекта)


someobject.events.add("someevent", function(e){

   if (условия запрета) {

      placemark .options.set("draggable", false);
   }

}) ;