Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Остановка события (https://javascript.ru/forum/events/59736-ostanovka-sobytiya.html)

AciDWarrioR 24.11.2015 10:18

Остановка события
 
Добрый день! Моя ситуация следующая: Создаю геопортал для компании. На карте присутствуют различные объекты (точки, линии, полигоны), с которыми будут работать операторы. Для них пытаюсь реализовать редактирование объектов. И сейчас пытаюсь сделать функцию Ctr+Z. Более подробно: когда оператор выбирает какой-то объект надо повесить обработчик события, чтобы при перемещении объекта или его точки сохранялся в массив клон этого объекта,а точнее его геометрия, но не по ходу всего перемещения а на конец перемещения, то есть как раз таки на mouseup это можно реализовать. Вот как я пытаюсь это сделать, но дело в том, что когда я отпускаю кнопку мыши у меня происходит зацикливания события mouseup, из за чего один и тот же клон объекта кладется в массив очень много раз и тем самым Ctr+Z не удается реализовать. Помогите кто может. Если что для создания геопортала используется библиотека OpenLayers 3 версии.
Код:
var changeFeature;
		var unchangeFeature = [];
		var currentFeature;
		select.getFeatures().on('add', function(e){
			changeFeature = e.element;
			unchangeFeature.push(e.element.clone());
			e.element.on('change', function(e){
				dirty[e.target.getId()] = true;
				$('#map').mouseup(function(){
					unchangeFeature.push(changeFeature.clone());
					currentFeature = unchangeFeature[unchangeFeature.length-1];
					$('.back img').addClass('access');
					$('#map').stopPropagation();
				});
			});
			$('.back img').click(function(){
				if ($('.back img').hasClass('access')){
					for (i=unchangeFeature.length-1; i>0; i--){
						if (currentFeature == unchangeFeature[i]){
							changeFeature.setGeometry(unchangeFeature[i-1].getGeometry());
							currentFeature = unchangeFeature[i-1];
							break;
						}
					}
				}
			});	
		});
		select.getFeatures().on('remove', function(e){
			f = e.element;
			if (dirty[f.getId()]){
				var conf = confirm("Сохранить изменения?");
				if (conf == true){
					delete dirty[f.getId()];
					featureProperties = f.getProperties();
					delete featureProperties.boundedBy;
					var clone = new ol.Feature(featureProperties);
					clone.setId(f.getId());
					var values_Geom = clone.get('type');
					if (values_Geom === 'Point')
					{
						transactWFSPoint('update',clone);
					}else if(values_Geom === 'Line'){
						transactWFSLine('update', clone);
					} else{
						transactWFSPolygon('update', clone);
					}
					changeFeature = null;
					unchangeFeature = null;
				} else { 
					changeFeature.setGeometry(unchangeFeature[0].getGeometry());
					changeFeature = null;
					unchangeFeature = null;
				}
			}
		});

рони 24.11.2015 10:32

AciDWarrioR,
строка 7 на каждый чих 'change' идёт навешивание $('#map').mouseup, строка 4 ещё умножает количество mouseup
вам как то логику продумать иначе , хотябы
if(!$('#map').data('busy')){$('#map').mouseup(function(){}).data('busy', true)
}
и строка 13 почему не e.stopPropagation();


Часовой пояс GMT +3, время: 01:50.