Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Передать в функцию click значение из for (https://javascript.ru/forum/misc/42633-peredat-v-funkciyu-click-znachenie-iz.html)

flyfrog 03.11.2013 22:52

Передать в функцию click значение из for
 
День добрый коллеги.
Вопрос из области для новичков, но ответ так и не смог найти.
Есть код (выдраный из контекста), еще я использую raphael.js


var sin_2 =0;
var paper_all = new Array(); 

function drawZ (){
paper.clear();
var all  = id_ar.length-1;
sin_2+=0.007;
for(i=0;i<=all;i++){
var sin = sin_2 + (0.7*i);
var x = Math.sin(sin)*radius+center.x;
var y = Math.cos(sin)*radius+center.y;
paper_all[i] = new Object;
paper_all[i].p = paper.text(x,y,number_ar[i]); 
paper_all[i].p.attr("font-size", "30");
paper_all[i].id  = i;
paper_all[i].p.click(function() {
//hand(id_ar[i]);
alert(paper_all[i].id ); // вот так не работет
});
}//for
}//end drawZ

Задача передать в alert значение i на момент инкреминации (счетчик цикла), если написать типа
alert(i);

то будет i на момент окончание цикла (i=0;i<9;i++) тоесть 9
Как сделать счелкаешь на элементы и будет 1 на первом, 2 на втором и т.д.? Я уже второй раз сталкиваюсь, да и если что то другое вы видите можно лучше написать я только за.

BETEPAH 03.11.2013 23:20

Цитата:

Сообщение от flyfrog
ответ так и не смог найти.

http://javascript.ru/basic/closure

flyfrog 03.11.2013 23:36

А можно для меня разжевать - на моем примере? Там ни где нет ситуации когда функция генерит и навешивает обработчики по for. Для одного элемента = вызова и у меня работает.

Deff 03.11.2013 23:48

Наверно прозрачней всего заполнить атрибут data= на теге
Хотя можно конечно к объекту добавить новое свойство

flyfrog 04.11.2013 00:15

Data???? Это от куда взялось (у меня там нет тэгов). Пожалуста мысли оформляйте в код, то есть подставил работает не работает. А так это просто рассуждения.

BETEPAH 04.11.2013 00:27

Цитата:

Сообщение от flyfrog
А можно для меня разжевать - на моем примере? Там ни где нет ситуации когда функция генерит и навешивает обработчики по for. Для одного элемента = вызова и у меня работает.

Разжевываю. По ссылке есть подраздел: "Пример ошибочного использования" - типичный ваш случай. Сравните:
Цитата:

Сообщение от flyfrog
Задача передать в alert значение i на момент инкреминации (счетчик цикла), если написать типа alert(i); то будет i на момент окончание цикла (i=0;i<9;i++) тоесть 9

Цитата:

Такой глюк возник из-за того, что все функции div[i].onclick получают значение i из одного на всех [[scope]] внешней функции. А это значение ([[scope]].i) на момент активации onclick-обработчика равно 10 (цикл завершился как только i==10).
Цитата:

Сообщение от flyfrog
Пожалуста мысли оформляйте в код

Пожалуйста, оформляйте благодарность в wmz - будет вам готовый код

рони 04.11.2013 00:32

flyfrog,
тут же всё разжёвано Пример ошибочного использования

var sin_2 =0,
    paper_all = new Array();

function drawZ (){
paper.clear();
var all  = id_ar.length;
sin_2+=0.007;
for(i=0;i<all;i++){
var sin = sin_2 + (0.7*i);
var x = Math.sin(sin)*radius+center.x;
var y = Math.cos(sin)*radius+center.y;
paper_all[i] = new Object;
paper_all[i].p = paper.text(x,y,number_ar[i]);
paper_all[i].p.attr("font-size", "30");
paper_all[i].id  = i;
paper_all[i].p.click((function(a) {
return function ()
{
  alert(paper_all[a].id );
}

})(i));
}
}

рони 04.11.2013 00:34

BETEPAH,
:-? чёто я с кодом поспешил сорри

flyfrog 04.11.2013 00:35

Спасибо. Хоть вы и сказали что я знал и ни капли не помогли спасибо. Решение данного "глюка" у меня есть но оно не красивое (для изящнего js) я думал другие уже придумали как это решается - красиво.

BETEPAH 04.11.2013 00:51

рони,
:cray:


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