powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Анонимная функция на OnClick()
20 сообщений из 20, страница 1 из 1
Анонимная функция на OnClick()
    #36527296
Dmitry V. Nechaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу не ругать, поиском не нашёл (половина из всех тем звучит как "помогите пожалуйста", и таких там 18 страниц. Бесит!)


В общем есть свой таб контрол. Пара спанов + css. На загрузке страницы вешаю обработчики.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// ставим нажималки на табах
for (var I =  0 ; I < TabControl.tabs.length; I++) {
    TabControl.tabs[I].Tab.innerHTML = '<span>' + TabControl.tabs[I].Caption + '</span>';
    var F = function () { TabClick(this, I); };
    TabControl.tabs[I].Tab.childNodes[ 0 ].onclick = F;
...
function TabClick(TabControl, TabIndex) {
    alert(TabIndex);
    return false;
}

Всё бы замечательно, только вот параметр I в функцию передаётся не как значение, а как указатель на ту переменную, что использовалась в цикле (извиняюсь если не понятно выражаюсь).

Я пробовал написать фунцию обёртку, чтобы засунуть туда значение, передавал I.toString()... у меня ничего не получилось.

Алерт выдаёт или последнюю цифру цикла + 1 на всех табах, или undefined (это я пытался создать массив и передавать его элементы).

Как это сделать???
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36527301
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Брррр, какой синтаксис ... ты откуда пришел в javascript? Delphi? Даже рука не поворачивается использовать эти имена :)
Тебе поможет банальное замыкание:
Код: plaintext
1.
2.
3.
4.
for (var i =  0 ; i < tabControl.tabs.length; i++) {
    tabControl.tabs[i].tab.innerHTML = '<span>' + tabControl.tabs[i].caption + '</span>';
    tabControl.tabs[i].tab.childNodes[ 0 ].onclick = function(){tabClick(this, i)}(i); //c this не очень понятно, но я не вижу всю функцию
...
}
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36527304
Dmitry V. Nechaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruckБрррр, какой синтаксис ... ты откуда пришел в javascript? Delphi?
Там я живу, а тут мимо проходил ;) И у меня тоже есть свой брррр...

IDVsbrucktabControl.tabs[i].tab.childNodes[0].onclick = function(){tabClick(this, i)}(i);

Не фурычит. Она вместо того чтобы повесить событие его тут же вызывает.
В результате на загрузке страницы я вижу по алерту на каждый таб и всё...
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36527308
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
...onclick = function(i){return function(){tabClick(this, i);};}(i);
?
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36527352
EmilRegis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruck, Illion, объясните пожалуйста зачем в конце (i) добавляете? не могу понять
Код: plaintext
1.
2.
...onclick = function(){tabClick(this, i)}(i);
...onclick = function(i){return function(){tabClick(this, i);};}(i);
i ведь и без этого будет видна внутри этой функции..разве нет?
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36527750
Dmitry V. Nechaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
illion,

Как то так - сработало. Спасибо.
Правда я ничего не понял.

В целом как законченное решение (окромя функции которая вызывается, здесь пока затычка) это выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
TabRec = function (Owner, Tab, Caption) {
    this.Owner = Owner;     // <fieldset>
    this.Tab = Tab;         // <li class="tabControlTab">
    this.Caption = Caption; // <span>Caption</span>
}
....
for (var I =  0 ; I < Tabs.length; I++)
            if (Tabs[I].className == 'tabControlTab') {
                var span = Tabs[I].childNodes[ 0 ];
                var Tab = new TabRec(TabControl, Tabs[I], span.innerHTML);
                TabControl.tabs.push(Tab);
            }
...
                TabControl.tabs[I].Tab.innerHTML = '<span>' + TabControl.tabs[I].Caption + '</span>';
                TabControl.tabs[I].Tab.childNodes[ 0 ].onclick = function (I) { return function () { TabClick(TabControl.tabs[I]); }; } (I); 
...
function TabClick(Tab) {
    alert(Tab.Caption);
    return false;
}

Если кто подскажет как сиё оптимизировать (про дельфи стиль уже знаю, не надо) - буду благодарен...
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36527772
Dmitry V. Nechaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл вписать return
Код: plaintext
TabControl.tabs[I].Tab.childNodes[ 0 ].onclick = function (I) { return function () { return TabClick(TabControl.tabs[I]); }; } (I);
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36528152
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry V. Nechaev
Там я живу, а тут мимо проходил ;) И у меня тоже есть свой брррр...

Не фурычит. Она вместо того чтобы повесить событие его тут же вызывает.
В результате на загрузке страницы я вижу по алерту на каждый таб и всё...
Ага, поспешил ... спасибо Татьяне, исправила.

Тезка, эта синтенция называется замыканием. Мы вызываем анонимную функцию с параметром, который становится внутренней переменной, которая живет до тех пор, пока живет событие.

В твоем варианте очень стремная конструкция, так как вызов внешней функции из замыкания, в которой происходят свои процессы и существуют свои переменные, чреват утечкой памяти. Это очень и очень реальная угроза. В этом случае, естественно, надо очень хорошо следить за переменными и внутренними функциями, или делать двойное замыкание (давненько его не использовал, боюсь ошибиться и буду выглядеть ну совсем некомпетентным) - это избавит от угрозы утечки.

P.S. А синтаксис для js ну совсем ужасающ ... все-таки есть какие-то писанные и неписанные законы. А паскалевский (делфовский) стиль, пришедший из Фортрана, совсем не подходит. Он близок к сишному, а еще больше к джавовскому.

P.P.S. Мы все где-то живем, а тут "мимо проходим" - такова уж специфика языка и его применения. Я, к примеру, из Java (начинал еще на Turbo Pascal 5 и 5.5 (?), потом Borland Pascal и TurboVision, помню первый выпуск Delphi, сидел на нем, если память не изменяет, до четверки), есть люди с ASP'а, есть Сишники, в большинстве Перловцы и ПэХаПэшники. Кстати, крайне редко кто так код большими буквами уродует :)
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36528659
Dmitry V. Nechaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruck,

А что значит "следить за переменными"
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36528750
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry V. Nechaev
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
TabRec = function (Owner, Tab, Caption) {
    this.Owner = Owner;     // <fieldset>
    this.Tab = Tab;         // <li class="tabControlTab">
    this.Caption = Caption; // <span>Caption</span>
}
....
var func = function(tabClick, tab) {
  return function() {
    tabClick(tab);
  };
};
for (var I =  0 ; I < Tabs.length; I++)
            if (Tabs[I].className == 'tabControlTab') {
                var span = Tabs[I].childNodes[ 0 ];
                var Tab = new TabRec(TabControl, Tabs[I], span.innerHTML);
                TabControl.tabs.push(Tab);
            }
...
                TabControl.tabs[I].Tab.innerHTML = '<span>' + TabControl.tabs[I].Caption + '</span>';
                TabControl.tabs[I].Tab.childNodes[ 0 ].onclick = func(tabClick, TabControl.tabs[I]); 
...
function TabClick(Tab) {
    alert(Tab.Caption);
    return false;
}

Пожалейте браузер, вынесите функцию из цикла.
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36528907
Dmitry V. Nechaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

Какую, из какого?
Извините, но я не понимаю. Я не сильно разбираюсь в JS, и не понимаю подводных камней этого скрипта.
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36528976
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry V. Nechaev,

я уже всё написал. :) Просто посмотрите различия.
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36529252
Dmitry V. Nechaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymDmitry V. Nechaev,

я уже всё написал. :) Просто посмотрите различия.

А, точно, понял!

Ваш вариант мне симпотичен, спасибо!
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36529825
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruck
Ага, поспешил ... спасибо Татьяне, исправила.

[задумалась...] Дмитрий, а ты с какой Татьяной говорил? Если со мной, то я Ирина ;-) . Родители хотели Машей обозвать, но дед не дал, спасибо ему.
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36530008
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вспомнился унекдот...

Двое в постели после секеса... Мужик довольно:
- Я фигею, Клава!
- Но я не Клава!!!
- А я все равно фигею...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36531283
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
illion[задумалась...] Дмитрий, а ты с какой Татьяной говорил? Если со мной, то я Ирина ;-) . Родители хотели Машей обозвать, но дед не дал, спасибо ему.
Падаю ниц ... стыдно.
Солнышко, извини меня, плиз, попутал ... 100 лет не общались, вот и наложились какие-то параллели. Кстати, мою супругу зовут Ирина ... так что претензий к имени, как понимаешь, быть не может (а первую жену звали Татьяной).
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36531311
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruck,

прям оговорка по Фрейду. :)
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36531329
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymIDVsbruck,

прям оговорка по Фрейду. :)
+1000
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36531351
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У-у-у, злопыхатели! Уже напостили ...
...
Рейтинг: 0 / 0
Анонимная функция на OnClick()
    #36532342
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruck,
ну а чего ты хотел от них, такой повод дал шикарный!
П.С. насчет имени - это мелочи, не страшно. Даже забавно получилось, мало кто равнодушным остался, прям как бабки с семечками на лавочке у подъезда :-)
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Анонимная функция на OnClick()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]