Страница 1 из 1

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

Добавлено: 28 окт 2012, 21:00
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. Как сделать так, чтобы он отличался?
Заранее большое спасибо всем!

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

Добавлено: 29 окт 2012, 13:25
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); 
}

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

Добавлено: 30 окт 2012, 11:43
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 и может быть небольшие разногласия

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

Добавлено: 06 ноя 2012, 17:37
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);
          }