Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.10.2013, 13:32
Аспирант
Отправить личное сообщение для HJ90 Посмотреть профиль Найти все сообщения от HJ90
 
Регистрация: 24.07.2012
Сообщений: 37

Замыкание в цикле
Здравствуйте!
Скажите пожалуйста правильный ли такой код?
Cломал уже голову c этим замыканием )
Код рабочий, но пока ничего лучшего не получилось.

Мне нужно чтобы в function(){alert(i)} записывалось текущее значение "i"

for(var i=0; i < 2; i++){
	func(i);
	function func(i){
		placemark[i].events.add('click', function(){alert(i)} );
	}
}

Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 01.10.2013, 14:02
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

HJ90,

for (var i = 0; 2 > i; i++)(function (a) {
    placemark[a].events.add("click", function () {
        alert(a)
    })
})(i);
Ответить с цитированием
  #3 (permalink)  
Старый 01.10.2013, 14:28
Аспирант
Отправить личное сообщение для HJ90 Посмотреть профиль Найти все сообщения от HJ90
 
Регистрация: 24.07.2012
Сообщений: 37

рони, спасибо!
Но здесь тоже 2 раза создается анонимная функция.
Это плохо если нужно перебирать большой цикл...
Или я не прав?
Ответить с цитированием
  #4 (permalink)  
Старый 01.10.2013, 14:37
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Сообщение от HJ90
Но здесь тоже 2 раза создается анонимная функция.
Это плохо если нужно перебирать большой цикл...
а что такое "placemark"? объект на яндекс-карте?
тогда создание отдельной функции для него - капля в море, нет смысла заморачиваться.
Ответить с цитированием
  #5 (permalink)  
Старый 01.10.2013, 14:49
Аспирант
Отправить личное сообщение для HJ90 Посмотреть профиль Найти все сообщения от HJ90
 
Регистрация: 24.07.2012
Сообщений: 37

Сообщение от Яростный Меч Посмотреть сообщение
а что такое "placemark"? объект на яндекс-карте?
тогда создание отдельной функции для него - капля в море, нет смысла заморачиваться.

Да, это метка на яндекс карте.
Обычно будет создаваться 10-20 меток,
Но возможна ситуация когда будет и 1000.
Ответить с цитированием
  #6 (permalink)  
Старый 01.10.2013, 14:55
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

попробуй такой вариант, вдруг прокатит:

function pmClick() {
    alert(this.value_i);
}
for(var i=0; i < 2; i++){
    placemark[i].value_i = i;
    placemark[i].events.add('click', pmClick );
}


т.е. к каждой метке прикрепить значение i, потом в хендлере получить его как-то через this
Ответить с цитированием
  #7 (permalink)  
Старый 01.10.2013, 15:14
Аспирант
Отправить личное сообщение для HJ90 Посмотреть профиль Найти все сообщения от HJ90
 
Регистрация: 24.07.2012
Сообщений: 37

Яростный Меч, не работает пример...
Я вот тоже так хотел.
Но внутри function уже не видно локальную "i"
Оно берет значение со scope, а там i = 1
Ответить с цитированием
  #8 (permalink)  
Старый 01.10.2013, 15:36
Аспирант
Отправить личное сообщение для HJ90 Посмотреть профиль Найти все сообщения от HJ90
 
Регистрация: 24.07.2012
Сообщений: 37

На хабре есть такой пример.
Только у меня он почему-то не работает.
http://habrahabr.ru/post/137318/

function addEvents2(divs) {
    var f=function f(){alert(this.$i)};
    for(var i=0; i<divs.length; i++) {	
        divs[i].innerHTML = i;
        divs[i].$i=i;
        divs[i].onclick = f;
    }
}
Ответить с цитированием
  #9 (permalink)  
Старый 01.10.2013, 16:05
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

HJ90,

внутри обработчика должен быть способ достать тот элемент, на котором случился клик.

вот, покури http://api.yandex.ru/maps/doc/jsapi/...pts/events.xml
скорее всего, e.get('target') - оно самое
e - объект, который передается первым параметром в хендлер.
Ответить с цитированием
  #10 (permalink)  
Старый 01.10.2013, 16:48
Аспирант
Отправить личное сообщение для HJ90 Посмотреть профиль Найти все сообщения от HJ90
 
Регистрация: 24.07.2012
Сообщений: 37

Яростный Меч
Да нет, это не то)
e.get ('target') вернет ссылку на метку по которой кликнули
а мне здесь нужно создать массив меток и присвоить им эвенты
Но всеравно спасибо!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подвисание при $.ajax() в цикле amt779 jQuery 6 15.05.2013 11:55
рандомная прокрутка в цикле alerzo Javascript под браузер 2 15.04.2013 12:01
замыкание в пост запросе mcavalon AJAX и COMET 33 23.02.2012 18:51
popup окно в PHP цикле ryobi522 Общие вопросы Javascript 5 10.02.2012 02:18
вопр. замыкание Shaci jQuery 6 05.03.2010 12:21