Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.07.2010, 15:48
Аватар для mycoding
NodeJS developer - ушел
Отправить личное сообщение для mycoding Посмотреть профиль Найти все сообщения от mycoding
 
Регистрация: 06.01.2010
Сообщений: 1,022

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

Делаю на SVG карту. И необходимо для большого количества городов выполнить следующее.
for(var i=0;i<city.length;i++){
			city[i].svg = R.circle(city[i].x,city[i].y,3).attr({fill: "270-#f2c01f-#fe9400",stroke:"270-#f2c01f-#fe9400"});
			city[i].svg.mouseover(function(e,i){
				city[i].svg.animate({r:10},1000);
				city[i].svgText.show();
			});
			city[i].svg.mouseout(function(e){
				city[i].svg.animate({r:3},1000);
				city[i].svgText.hide();
			});
			city[i].svgText = R.text(int(city[i].x)+20, int(city[i].y)-20, city[0].name).attr(attr_font).hide();
		}

В
city[i].svg.mouseover(function(e,i){
    city[i].svg.animate({r:10},1000);
    city[i].svgText.show();
});

У
city[i].svg.animate({r:10},1000);
    city[i].svgText.show();

У i значение максимума при прохождении цикла.
Пробовал как с статье написано про замыкания сделать, но
там случай когда
divs[i].onclick = function(x) {
            return function() { alert(x) }
        }(i);

А здесь функция передается как аргумент.
Уже столькими способами пробовал.
Ни думал, что когда-нибудь столкнусь с необходимостью использовать замыкания.
Ответить с цитированием
  #2 (permalink)  
Старый 28.07.2010, 17:48
Аватар для mycoding
NodeJS developer - ушел
Отправить личное сообщение для mycoding Посмотреть профиль Найти все сообщения от mycoding
 
Регистрация: 06.01.2010
Сообщений: 1,022

Разобрался вот так надо.
city[i].svg.mouseover((function(i){
      return function(e){
		city[i].svg.animate({r:10},1000);
		city[i].svgText.show();
      }				
)(i));			
city[i].svg.mouseout((function(i){
	return function(e){				
		city[i].svg.animate({r:3},1000);
		city[i].svgText.hide();
	}
})(i));
Ответить с цитированием
  #3 (permalink)  
Старый 29.07.2010, 11:32
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

либо можно просто вынести обработчики в отдельные функции/методы:
for(var i=0;i<city.length;i++){
    city[i].svg = R.circle(city[i].x,city[i].y,3).attr({fill: "270-#f2c01f-#fe9400",stroke:"270-#f2c01f-#fe9400"});
    city[i].svg.mouseover( mouseover(city[i]) );

function mouseover( city ){
    return function(){
        city.svg.animate({r:10},1000);
        city.svgText.show();
    };
}

или даже так, если написать функцию pass:
for(var i=0;i<city.length;i++){
    city[i].svg = R.circle(city[i].x,city[i].y,3).attr({fill: "270-#f2c01f-#fe9400",stroke:"270-#f2c01f-#fe9400"});
    city[i].svg.mouseover( mouseover.pass(city[i]) );

function mouseover( city ){
    city.svg.animate({r:10},1000);
    city.svgText.show();
}
Ответить с цитированием
  #4 (permalink)  
Старый 29.07.2010, 16:35
Аватар для mycoding
NodeJS developer - ушел
Отправить личное сообщение для mycoding Посмотреть профиль Найти все сообщения от mycoding
 
Регистрация: 06.01.2010
Сообщений: 1,022

Спасибо за совет.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
хитросплетения Global,контекст,this,Reference kefi Общие вопросы Javascript 109 20.11.2009 23:34