Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Объект, вызвавший функцию


Автор: smartov 2.7.2007, 14:26
Есть такая модель. Есть форма. У неё по событию submit вызывается какая-то функция. 
Код

<form ... onsubmit="my_function(this)">
...


Внимание вопрос smile
Можно ли внутри той функции (my_function) получить ссылку или id формы, по сабмиту которой она вызвалась.

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

Автор: stup 2.7.2007, 14:45
Цитата(smartov @  2.7.2007,  14:26 Найти цитируемый пост)
Нужно это потому, что хотелось бы не передавать все время в функцию this как ссылку на форму.


На мой взгляд, это абсолютно нормальный подход. this же внутри функции будет ссылаться на window/document.

Автор: Zeroglif 2.7.2007, 15:24
Цитата(smartov @  2.7.2007,  15:26 Найти цитируемый пост)
Можно ли внутри той функции (my_function) получить ссылку или id формы, по сабмиту которой она вызвалась

Низзя, потому как вызов my_function() прописан в теге, то есть он живёт внутри ещё одной "невидимой глазу" функции (не имеет значение , как и когда она создаётся), которая при возникновении события знает значение this и значение event. Она знает, а my_function не знает, отсюда необходимость передавать в неё аргументы.



Автор: vasac 2.7.2007, 15:26
В IE через event, в Gecko, видимо, никак.

Автор: Zeroglif 2.7.2007, 15:29
smartov, 

а чего ты прикипел-то к этому обработчику в теге, сделать форма.onsubmit = функция и будет нужный this или нельзя?

Добавлено через 5 минут и 54 секунды
Цитата(vasac @  2.7.2007,  16:26 Найти цитируемый пост)
В IE через event

Правильное уточнение, а то я обобщил про идентификатор event в inline-обработчике, IE может с event выкрутиться, единственное, не проверял, будет ли srcElement всегда вести на форму, как бы мы её не засабмитили. Кто-нибудь знает?

Автор: smartov 2.7.2007, 18:12
Zeroglif, хочется вместо
Код

<form ... onsubmit="my_function(this)">

писать просто
Код

<form ... onsubmit="my_function()">

 и чтобы все работало.

По идее я догадываюсь что такое неосуществимо, но мало ли...

vasac, 
Цитата(vasac @  2.7.2007,  14:26 Найти цитируемый пост)
В IE через event

поподробнее, пожалуйста.

Автор: AKS 2.7.2007, 18:38
Цитата(vasac @  2.7.2007,  15:26 Найти цитируемый пост)
в Gecko, видимо, никак.

Код

<form ... onsubmit="my_function()">

Код

function my_function() {
    alert(arguments.callee.caller.arguments[0]); // object Event
}

Цитата(Zeroglif @  2.7.2007,  15:29 Найти цитируемый пост)
Кто-нибудь знает?

Решили подловить кого-нибудь? ;)

Автор: Zeroglif 2.7.2007, 19:35
Цитата(AKS @  2.7.2007,  19:38 Найти цитируемый пост)
Решили подловить кого-нибудь?

 просто не уверен на 100% в ответе, за сим сильно ищу сильно уверенных... , никого я не ловлю, даже бабочек...  smile

Цитата(smartov @  2.7.2007,  19:12 Найти цитируемый пост)
поподробнее, пожалуйста

В IE event - свойство window, то есть есть из функции можно обращаться к соответствующему идентификатору и нет надобности передавать event в функцию аргументом. В gecko же event передаётся аргументом в ту функцию, что автоматом создаётся в теге и дальше двигается уже руками в любое место, в твоём случае передаётся в функцию my_function:

Код

<form ... onsubmit="my_function(event)">


Писать ручками event нам не подходит, т.к. аргументы по условию исключены (мы даже от this отказались), тогда AKS-молодец впомнил про свойство caller (увы, уже давно deprecated, но пока ещё работает), с помощью которого мы можем из тела функции my_function выйти на функцию, созданную в теге, а уже у этой функции получить её аргументы, вернее, один аргумент - ссылку на event. Получив event, можно определить элемент, на котором "зажглось событие", с помощью свойства target(gecko) или srcElement(IE), получится что-то вроде:

Код

function my_function(){
    var e = arguments.callee.caller.arguments[0] || event,
        t = e.target || e.srcElement;
    alert(t.nodeName); //-> может FORM, а может и нет
}

Я во всей этой затее вижу кучу узких мест (особенно, когда видишь из-за чего весь сыр-бор) и или оставил бы this в покое, или по-другому бы навешал обработчики...

Автор: vasac 2.7.2007, 19:37
AKS, ну вот smile Только, по-моему кто-то из вас говорил, что caller лучше не использовать.

PS. А вот и про caller ответили, прежде чем я спросил )

Автор: AKS 2.7.2007, 20:10
Цитата(vasac @  2.7.2007,  19:37 Найти цитируемый пост)
caller лучше не использовать

Показалось что беседа принимает философский оттенок, вот и "сунулся" с этим caller'ом. 
Цитата(Zeroglif @  2.7.2007,  19:35 Найти цитируемый пост)
 просто не уверен на 100% в ответе...

А мне просто сразу вспомнилась тема о событиях (точнее фрагмент другой темы на dklab), о возможности переопределения св-в объекта Event (созданного методом createEventObject). Вот отсюда и вопрос...

Автор: smartov 3.7.2007, 10:02
Zeroglif, ясно. Да, много недоработано еще в javascript smile

Добавлено через 1 минуту и 4 секунды
Спасибо всем, тогда. Теа закрыта. Проще оставить this как есть

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)