Добавление событий на маркеры в OpenLayers

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
AGENTxXx
Интересующийся
Сообщения: 15
Зарегистрирован: 28 фев 2012, 13:10
Репутация: 0

Добавление событий на маркеры в OpenLayers

Сообщение AGENTxXx »

Добрый день!
Бьюсь над проблемой и ни как не могу найти решение:
Есть координаты маркеров и доп. инфа, которая должна отображаться в момент клика по маркеру, но в моем случае доп инфа отображается только о последнем маркере, на всех маркерах. Т.е. например в цикле я создаю маркер и вешаю событие на функцию, но как я понимаю, событие "пропишется" только тогда, когда произойдет вызов его и получается так, что в функцию заносятся данные, которые были последние в цикле. Вот цикл из функции:

Код: Выделить всё

for (i = 0; i<response.data.length; ++i)
		{
			var size = new OpenLayers.Size(21, 25);//размер картинки для маркера
			var offset = new OpenLayers.Pixel(-(size.w / 2), -size.h); //смещение картинки для маркера
			var icon = new OpenLayers.Icon(base_url + response.data[i].task_icon, size, offset);//картинка для маркера
			var position = response.data[i].task_tooltip.split(" ");
			var task = clone(response.data[i]);
			var marker = new OpenLayers.Marker(new OpenLayers.LonLat(position[0],position[1]).transform(new OpenLayers.Projection('EPSG:900913'), map.getProjectionObject()),icon);
			
			marker.events.register('mousedown', marker, function(evt) {
			
			alert(i);
			});
			markers.addMarker(marker); 
		}
В моем случае alert всегда выводит 4. Как сделать так, чтобы он отличался?
Заранее большое спасибо всем!
Аватара пользователя
selfchief
Интересующийся
Сообщения: 23
Зарегистрирован: 17 янв 2012, 13:38
Репутация: 0
Откуда: Rostov-on-Don
Контактная информация:

Re: Добавление событий на маркеры в OpenLayers

Сообщение selfchief »

скорее всего ошибка из-за того, что переменная i установлена как глобальная, попробуй в инициализации цикла перед i добавить var, т.е. инициализация цикла будет выглядеть так:

Код: Выделить всё

for (var i = 0; i<response.data.length; ++i) {...}
если не поможет, то попробуй сделать так:

Код: Выделить всё

for (var i = 0; i<response.data.length; ++i) {
         var myNumber = i;
...
         marker.events.register('mousedown', marker, function(evt) {
         alert(myNumber);
         });
         markers.addMarker(marker); 
}
Изображение — Дорогу осилит идущий — Изображение
AGENTxXx
Интересующийся
Сообщения: 15
Зарегистрирован: 28 фев 2012, 13:10
Репутация: 0

Re: Добавление событий на маркеры в OpenLayers

Сообщение AGENTxXx »

Нет, это не работает, по той же причине (код в событии выполняется только тогда, когда это событие вызывается). Но все же решение нашел. Например такое:

Код: Выделить всё

                        marker.events.id = metka;
			var markerClick = function(evt) {
			var task = response.data[this.events.id];
				questInstraction(task.task_title, task.task_question, task.task_picture);
			OpenLayers.Event.stop(evt);
			}
			metka++;
			marker.events.register('mousedown', marker, markerClick);
			markers.addMarker(marker);
metka - глоб. числовая переменная, questInstraction - функция с параметрами.
Все нормально работает. Правда может в будущем OpenLayers будет использовать(или уже использует) events.id и может быть небольшие разногласия
Аватара пользователя
selfchief
Интересующийся
Сообщения: 23
Зарегистрирован: 17 янв 2012, 13:38
Репутация: 0
Откуда: Rostov-on-Don
Контактная информация:

Re: Добавление событий на маркеры в OpenLayers

Сообщение selfchief »

создайте функцию createMarker
которая будет создавать маркер и навешивать на него события, должно заработать.
Код должен будет выглядить так:

Код: Выделить всё

    var createMarker = function(loc, icon, eventData) {
             var marker = new OpenLayers.Marker(loc,icon);
             
             marker.events.register('mousedown', marker, function(evt) {
             
             alert(eventData);
             });
             return marker;
    };
    for (i = 0; i<response.data.length; ++i)
          {
             var size = new OpenLayers.Size(21, 25);//размер картинки для маркера
             var offset = new OpenLayers.Pixel(-(size.w / 2), -size.h); //смещение картинки для маркера
             var icon = new OpenLayers.Icon(base_url + response.data[i].task_icon, size, offset);//картинка для маркера
             var position = response.data[i].task_tooltip.split(" ");
             var task = clone(response.data[i]);
             var loc = new OpenLayers.LonLat(position[0],position[1]).transform(new OpenLayers.Projection('EPSG:900913'), map.getProjectionObject());
             var marker = createMarker(loc,icon, i);
             markers.addMarker(marker);
          }
Изображение — Дорогу осилит идущий — Изображение
Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: Semrush [Bot] и 1 гость