Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

addEventListener(attachEvent) && Parameters (Ex_Soft)
Author Message
Ex_Soft
Участник форума



Joined: 28 Apr 2005
Posts: 138
Карма: -4
   поощрить/наказать


PostPosted: Mon Jun 05, 2006 7:36 pm (написано за 1 минуту 9 секунд)
   Post subject: addEventListener(attachEvent) && Parameters
Reply with quote

Мо фигню сморозил - сильно не пинайте ;)
Я так понял, что инициализация обработчика посредством
1. < ... onsmthevent="SmthFunc(Param1, Param2, ..., ParamN)" ... >
и
2. addEventListener(attachEvent)
это как "... Карл Маркс и Фридрих Энгельс - не муж и жена, а совершенно разных четыре человека..." ;)
По сему - вопрос - как можно во втором случае родить обработчик с параметрами?

Вариант
Code (JavaScript): скопировать код в буфер обмена
...addEventListener("load","function(){FunctionBody}",false);
как бы известен, но:
1. Не совсем понятно как при вызове обработчика туды передать параметры. Я так догадываюсь - прийдется заюзать, не дай Бог, глобальные переменные.
2. Я так понимаю ежели N-ым элементам присваивается один и тот же обработчик, то каждый раз он будет рожаться (в смысле его тело - тут, каж-ся, где-то пробегала тема на предмет functuion() (в контексте нормального определения в коде) vs "function(){FunctionBody}"), что с точки зрения оптимизации не ЭстЪ гут...
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Jun 06, 2006 6:26 am (спустя 10 часов 50 минут; написано за 1 минуту 20 секунд)
   Post subject:
Reply with quote

Ex_Soft
На первый взгляд, Вы знаете ответы на свои вопросы. С другой стороны, что-то Вы не договариваете, и это жутко интересно. А это не продолжение темы attachEvent present? (forum.dklab.ru/js/other/AttacheventPresent.html)? Та тема для меня оказалась весьма полезной. А эту тему не могли бы Вы раскрыть подробней?
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Tue Jun 06, 2006 12:00 pm (спустя 5 часов 33 минуты; написано за 3 минуты 10 секунд)
   Post subject:
Reply with quote

Ex_Soft
Давайте вернёмся к задаче. Изначально - что требовалось сделать?
Ex_Soft wrote:
function(){FunctionBody}
функция будет создана только один раз - при добавлении её в очередь обработчиков.
Ex_Soft wrote:
Не совсем понятно как при вызове обработчика туды передать параметры
Никак. В обработчик передаётся 1 параметр - объект Event.
И приведённый Вами пример с инлайн-обработчиком идентичен
Code (any language): скопировать код в буфер обмена
function (e){SmthFunc(Param1, Param2, ..., ParamN)}
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Jun 06, 2006 12:54 pm (спустя 54 минуты; написано за 51 секунду)
   Post subject:
Reply with quote

WingedFox
Quote:
Никак. В обработчик передаётся 1 параметр - объект Event.
Разве нельзя передать параметры в качестве аргументов?
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Tue Jun 06, 2006 1:00 pm (спустя 6 минут; написано за 15 секунд)
   Post subject:
Reply with quote

AKS
а кто эти аргументы будет передавать в обработчик?
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Jun 06, 2006 1:06 pm (спустя 5 минут; написано за 50 секунд)
   Post subject:
Reply with quote

WingedFox
Ну, к примеру, автор темы хотел бы попробовать это сделать.
Quote:
...как при вызове обработчика туды передать параметры.
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Tue Jun 06, 2006 1:13 pm (спустя 6 минут; написано за 1 минуту 20 секунд)
   Post subject:
Reply with quote

Вот я и спрашиваю - кто эти параметры будет передавать функции?

Вопрос аналогичен: как в код вызывающий функцию X передать дополнительные параметры для неё?
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Jun 06, 2006 1:17 pm (спустя 4 минуты; написано за 8 секунд)
   Post subject:
Reply with quote

WingedFox
Quote:
window.attachEvent("onload", (function(s) { return function(e) { alert(e + s); }})("Event"));
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Tue Jun 06, 2006 1:25 pm (спустя 8 минут; написано за 7 секунд)
   Post subject:
Reply with quote

AKS
Ex_Soft wrote:
1. < ... onsmthevent="SmthFunc(Param1, Param2, ..., ParamN)" ... >
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Jun 06, 2006 1:28 pm (спустя 3 минуты; написано за 48 секунд)
   Post subject:
Reply with quote

WingedFox
Понял, не в ту степь я забрел, и не о том вообще начал думать...
Back to top
View user's profile Send private message Send e-mail
Ex_Soft
Участник форума



Joined: 28 Apr 2005
Posts: 138
Карма: -4
   поощрить/наказать


PostPosted: Wed Jun 07, 2006 8:24 am (спустя 18 часов 55 минут; написано за 5 минут 58 секунд)
   Post subject:
Reply with quote

WingedFox wrote:
функция будет создана только один раз - при добавлении её в очередь обработчиков
в случае, если это происходит один раз. А, если, 4 example,
Code (JavaScript): скопировать код в буфер обмена
InputText1.addEventListener("keyup",function(){FunctionBody},true);
InputText2.addEventListener("keyup",function(){FunctionBody},true);
...
InputTextN.addEventListener("keyup",function(){FunctionBody},true);
...
??? Насколько я понимаю - в этом случае родиться N анонимных абсолютно идентичных функций (ессесно, если сами функции будут абсолютно идентичны). Или я неправ?
WingedFox wrote:
Никак
Таки - да... Поразмыслив на досуге, я, таки, понял, что
АБС wrote:
...желаю странного...
;)
Эко ж меня тыркнуло-то... ;) Ведь всегда правила игры определялись теми, кто рожает прерывания, а не их получателями. И что, где и каким макаром получатель будет добывать то, что ему нужно - это его личное половое горе ;) (пусть "...скажет спасибо, что его вообще позвали..." ;) )
Вариант же
Code (JavaScript): скопировать код в буфер обмена
node.addEventListener("load", function() {SmthFunc(param1, param2)}, false);
IMHO, представляет интерес только с точки зрения демонстрации возможностей языка. Потому как, если param1, param2 зависят от каких либо внешних факторов, а, особенно, если их много, то отслеживание этих зависимостей выливается в такой геморрой... Ж8-/ Гораздо проще и надежнее самому внутри SmthFunc сходить куда надо и взять че нужно, чем зависеть от того, что где-то что-то м.б. упущено...
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Wed Jun 07, 2006 9:12 am (спустя 48 минут; написано за 2 минуты 28 секунд)
   Post subject:
Reply with quote

Ex_Soft wrote:
function(){FunctionBody}
Конкретно для этого случая существуют именованные функции. И addEventListener передаётся ссылка на функцию.

Похоже, что вопрос не до конца проветрился. 8*)

В общем,
Ex_Soft wrote:
Я так догадываюсь - прийдется заюзать, не дай Бог, глобальные переменные.
чтобы эта догадка не стала реальностью - пользуйте контексты.
Back to top
View user's profile Send private message
Ex_Soft
Участник форума



Joined: 28 Apr 2005
Posts: 138
Карма: -4
   поощрить/наказать


PostPosted: Wed Jun 07, 2006 11:14 am (спустя 2 часа 2 минуты; написано за 1 минуту 41 секунду)
   Post subject:
Reply with quote

WingedFox wrote:
Конкретно для этого случая существуют именованные функции. И addEventListener передаётся ссылка на функцию
Ну... Эт канЭшно понятно ;) Вопрос, так сказть, был из области общих знаний. В живую так бы, ессесно, никто бы не делал.
WingedFox wrote:
Похоже, что вопрос не до конца проветрился
Та не - все уже устаканилось ;)
Back to top
View user's profile Send private message
Halfi
Заглянувший



Joined: 27 Aug 2010
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Fri Aug 27, 2010 1:24 am (спустя 4 года 2 месяца 19 дней 14 часов 9 минут; написано за 5 минут 35 секунд)
   Post subject:
Reply with quote

Дабы не создавать новой темы, задам вопрос тут, есть цикл, в котором есть i, позиция массива, так вот я в цикле вешаю онклик, как мне передать эту i в функцию?
Code (JavaScript): скопировать код в буфер обмена
        var params = new Array();
        var buttonClassName = "switcher";
        if (typeof window.onload == "function") var oldOnload = window.onload;
        window.onload = function () {
                if (typeof oldOnload == "function") oldOnload();
                var blocks = document.getElementsByClassName("portfolioBlock");
                for(i=0;i<blocks.length;i++){
                        params[i] = {
                                normalBlock: blocks[i],
                                switchBlock: blocks[i].getElementsByClassName("colorBlock")[0],
                                normalBlockHeight: blocks[i].clientHeight,
                                blockHeight: blocks[i].getElementsByClassName("textBlock")[0].clientHeight-1,
                                status: "closed"
                        };
                        params[i].switchBlock.onclick = function(){switcher(this, i);};
                        params[i].switchBlock.getElementsByTagName("i")[0].className = buttonClassName+" closed";
                        params[i].normalBlock.style.height = params[i].blockHeight+"px";
                }
        };
        switcher = function(el, id) {
                alert(el+" "+id);
        };
собсно интересует строка
Code (JavaScript): скопировать код в буфер обмена
params[i].switchBlock.onclick = function(){switcher(this, i);};
Там переменная id в функции switcher имеет ссылку на i, а не ее значение, соответственно по клику на любой кнопке на которую я вешал онклик происходит алерт с последним присвоенным i, т.е. есле у меня 2 элемента в массиве, то я получаю алерт с двойкой, причем с двойкой (3 значения массива 0, 1, 2), т.к. цикл отрабатывает 3 раза, но на третий раз условие не отрабатывает, а i присвоена с предыдущего цикла.
Back to top
View user's profile Send private message
Halfi
Заглянувший



Joined: 27 Aug 2010
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Fri Aug 27, 2010 1:50 am (спустя 26 минут; написано за 33 секунды)
   Post subject:
Reply with quote

не прошло и 5-и минут, решил задачу, кому интересно:
Code (JavaScript): скопировать код в буфер обмена
params[i].switchBlock.onclick = function(i){return function() {switcher(this, i);}}(i);
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Sat Aug 28, 2010 12:52 pm (спустя 1 день 11 часов 1 минуту; написано за 11 секунд)
   Post subject:
Reply with quote

Halfi
кажется, это оно: dklab.ru/chicken/nablas/39.html#cont0
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML