Вернуть поведение карты по умолчанию в dblclick Open Layer - PullRequest
0 голосов
/ 26 марта 2019

После нажатия на кнопку я перезаписываю поведение по умолчанию map.on('dblclick'), которое является увеличением.

Я хотел бы получить это поведение в другой части кода.

Как я могу это сделать?

РЕДАКТИРОВАТЬ: Для лучшего объяснения. У меня есть кнопка, которая, когда я нажимаю, переопределяет поведение на карте dblclick

$('#RemoveArea').on('click', function(){
    map.getInteractions().pop()
    map.on('dblclick', function(evt) {
        evt.preventDefault();
        evt.map.forEachFeatureAtPixel(evt.pixel, function(feature,layer){ 
            featureId = feature.getId()
            areaFeature = feature.getGeometry().getArea()/ 10000;
            totalSelectedArea -= parseFloat(areaFeature.toFixed(2));
        })
    }); 
})

Как при нажатии на другой btn снова заставить карту вести себя так же, как и раньше, это увеличение карты

  $('#OtherBtn').on('click', function(){
     //...     
  })

Возможно ли это?

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Вы можете отключить взаимодействие при создании карты

var map = new ol.Map({
  layers [myLayer],
  target: 'map',
  interactions: ol.interaction.defaults({doubleClickZoom: false}),
  view: new ol.View({
    center: [x, y],
    zoom: z
  })
});

Чтобы включить или отключить взаимодействие, вам нужно присвоить его переменной, а не создавать по умолчанию:

var dcz = new ol.interaction.DoubleClickZoom();

var map = new ol.Map({
  layers [myLayer],
  target: 'map',
  interactions: ol.interaction.defaults({doubleClickZoom: false}).extend([dcz]),
  view: new ol.View({
    center: [x, y],
    zoom: z
  })
});

для выключения и включения:

dcz.setActive(false);

dcz.setActive(true);

  var layer = new ol.layer.Tile({
    source: new ol.source.OSM()
  });

  var dcz = new ol.interaction.DoubleClickZoom();

  var map1 = new ol.Map({
    target: 'map',
    layers: [layer],
    interactions: ol.interaction.defaults({doubleClickZoom: false}).extend([dcz]),
    view: new ol.View({
      center: [0, 0],
      zoom: 1
    })
  });

  function dczOnOff() {
      dcz.setActive(document.getElementsByName('dcz')[1].checked);
  }
html, body {
    margin: 0;
    padding: 0;
    width: 100%;
    height: 100%;
}
.map {
    width: 100%;
    height: 80%;
}
<link href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" rel="stylesheet" />
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
<div id="map" class="map"></div>
<div style="padding-left: 50px;">
<input type="radio" name="dcz" value="0" size="16" onchange="dczOnOff()"> DCZ OFF</br>
<input type="radio" name="dcz" value="1" size="16" onchange="dczOnOff()" checked> DCZ ON</br>

Либо постоянно поддерживайте прослушиватель двойного щелчка, и пусть он проверяет, были ли ваши кнопки включены или выключены при двойном щелчке:

map.on('dblclick', function(evt) {
    if (!dcz.getActive()) {
        evt.map.forEachFeatureAtPixel(evt.pixel, function(feature,layer){ 
            featureId = feature.getId()
            areaFeature = feature.getGeometry().getArea()/ 10000;
            totalSelectedArea -= parseFloat(areaFeature.toFixed(2));
        })
    }
}); 

$('#RemoveArea').on('click', function(){
    dcz.setActive(false);
})

$('#OtherBtn').on('click', function(){
    dcz.setActive(true);
})

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

$('#RemoveArea').on('click', function(){
    key = map.on('dblclick', function(evt) {
        evt.preventDefault();
        evt.map.forEachFeatureAtPixel(evt.pixel, function(feature,layer){ 
            featureId = feature.getId()
            areaFeature = feature.getGeometry().getArea()/ 10000;
            totalSelectedArea -= parseFloat(areaFeature.toFixed(2));
        })
    }); 
})

$('#OtherBtn').on('click', function(){
    ol.Observable.unByKey(key)     
})
0 голосов
/ 27 марта 2019

Таким образом, я не нашел способа восстановить zoom на dblclick, но я могу предотвратить поведение, которое я переопределял ранее. Итак, после нажатия в OtherBtn

Я добавил это

                map.on('dblclick', function(evt){                        
                    evt.preventDefault();
                })

Итак, как я уже сказал, он не увеличивает, но и не делает ничего другого.

РЕДАКТИРОВАТЬ: Я нашел функцию, в которой un, и она противоположна on. Так что в OtherBtn я установил

map.un('dblclick', doubleClickCallback);

где doubleClickCallback - это просто функция со всеми вещами, которые я делал после dblclick, и возвращается к поведению глухих

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...