Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932

Почему объект event надо передавать первым в функцию?

09.07.2010, 10:38. Показов 5451. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Пожалуйста, помогите мне со следующей проблемой: я не могу понять, почему объект event обязательно надо передавать да ещё и первым в функцию (учу на javascript.ru/tutorial, если кто знает другой сайт с учебником по javascript'у, то пожалуйста скажите). Да и вообще почему когда я пишу
"f() {alert(event.target)}" и нажимаю на пустое место, а потом навожу мышь на кнопку ("<niput type='button' value='Hi!' onMouseOver='f()'>"), то он мне выдаёт [Object HTML input Element]. А я кликнул на пустоте, а не на <input>'е. Почему? Пожалуйста, помогите мне с этим, потому что без этого дальше читать статью бессмысленно. Охо... Всё, меня там забанили. А ведь я просто задавал много вопросов, так как не всё понимаю( Понял вроде про всплытие и про погрузку, но что-то ещё там было написано про return false и про кросс-браузерность (в Explorer'e window.event, а у всех остальных просто event, и как с этим быть), а посмотреть это теперь я не могу. Прошу вашей помощи. Заранее благодарен
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.07.2010, 10:38
Ответы с готовыми решениями:

Почему объект движется не туда, куда надо?
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MoveScript : MonoBehaviour { ...

Как правельно передавать значения в функцию и почему присравнивании с NULL у меня выдает ошибку?
Так же что мне делать если я хочу менять значения переменной F из функции main в функции proverka #include &lt;iostream&gt; #include...

Почему в функцию можно передавать аргументы с амперсандом или без него и результат тот же самый?
К примеру : int main() { int x=3, y=4; swap(&amp;x,&amp;y); return 0; } void swap(int* a, int* b){ int tmp = *a; *a...

18
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
09.07.2010, 11:20
Какая разница, где щёлкнул, это же onMouseOver - навёл мышь на кнопку - оно сработало.
0
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
09.07.2010, 15:47  [ТС]
Значит, это что ли нигде не используется?

Добавлено через 17 минут
Я просил сказать, как включать event в функцию и почему у меня написано inputElement, когда я нажимаю к примеру на div.
0
31 / 12 / 3
Регистрация: 20.05.2010
Сообщений: 88
09.07.2010, 16:01
если хочешь что бы стробатывало на нажатию на кнопку, то замени onmousover на onclick
0
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
09.07.2010, 16:05  [ТС]
GORZ, я хочу, чтобы оно срабатывало на НАВЕДЕНИЕ МЫШИ, так как я до этого должен кликнуть по пустому месту, и на наведение он мне должен показать target, место, где я щёлкнул, но он показывает input Element.
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
09.07.2010, 19:25
JavaScript
1
2
3
4
function TheEventHandler(e) {
    e = e || window.event; // теперь точно объект Event
    var o = e.target || e.srcElement || e.currentTarget;
};
1
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
10.07.2010, 07:46  [ТС]
Vovan-VE, а почему первым аргументом передаётся e, а не event? А дальше зачем-то пишется e=e... То, что после пишется "|| e.srcElement || e.currentTarget", - это для кроссбраузерности, но каким образом это действует? Как вообще действует символ "||"?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
10.07.2010, 09:04
Правильные браузеры передают объект Event в первом аргументе. IE пишет его в свойство window.event . Присваивание
JavaScript
1
e = e || window.event;
эквивалентно
JavaScript
1
e = e ? e : window.event;
ввиду особенности оператора ||. С таргетами та же история. В разных браузерах свойства могут по-разному называться, вот мы и ищем любой из них через оператор ||.
0
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
10.07.2010, 09:27  [ТС]
Vovan-VE, спасибо тебе большое! Теперь я многое понял! То есть если свойства x нет, то он смотрит, есть ли свойство y, да?
JavaScript
1
e=x || y
Но почему
JavaScript
1
e=e
? Потому что при вызову функции вместо e ты поставил event ( f(event) )?
Это правильный код? :
JavaScript
1
2
3
4
5
6
function f(e) {
e=e || window.event
alert (e.type)
}
 
f(event)
Кст., e.type возвращает событие, посредством которого была вызвана функция, да?
К примеру
JavaScript
1
<input type='button' onclick='alert(event.type)' value='Кнопка'>
Он отобразит click, если onmouseover, то mouseover, да? В этом случае event передаётся автоматом, да?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
10.07.2010, 09:39
Цитата Сообщение от Hagrael Посмотреть сообщение
Но почему e=e
Потому что
JavaScript
1
if (!e) e = window.event;
Цитата Сообщение от Hagrael Посмотреть сообщение
Это правильный код?
Первый 4 строки - да, правильно. А в вызове f(event) если Вы уверены, чтО передаете в аргументе event, то тоже правильно.
Старый примитивный способ
HTML5
1
<input onclick="f()" />
в таком случае не совсем корректен и универсален, если Вам нужно event.

Вот так точно работает:
HTML5
1
<input type="button" id="btn1" value="Test" />
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function AddEvent(el, ev, handler) {
    if (el) {
        if (el.addEventListener) el.addEventListener(ev, handler, false);
        else if (el.attachEvent) el.attachEvent("on" + ev, handler);
        else el["on" + ev] = handler;
    };
};
function DelEvent(el, ev, handler) {
    if (el) {
        if (el.removeEventListener) el.removeEventListener(ev, handler, false);
        else if (el.detachEvent) el.detachEvent("on" + ev, handler);
        else el["on" + ev] = null;
    };
};
 
function ButtonTest(e) {
    e = e || window.event;
    alert(e.type);
};
 
var b = document.getElementById('btn1');
AddEvent(b, 'click', ButtonTest);
1
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
10.07.2010, 10:02  [ТС]
А-а, 'if (el.attachEvent)' - это значит, 'если есть такая команда, то...' да?

Цитата Сообщение от Vovan-VE Посмотреть сообщение
function ButtonTest(e) {
* * e = e || window.event;
Цитата Сообщение от Vovan-VE Посмотреть сообщение
AddEvent(b, 'click', ButtonTest);
Почему нет аргументов в вызову функции ButtonTest? (я в принципе знаю, что это из-за того, что в функции нет return, но я даже не знаю, что это)))) Всё-таки мы ведь должны передать туда объект event или он передаётся туда автоматически?
Извините, если не сразу всё понимаю.
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
10.07.2010, 10:25
Цитата Сообщение от Hagrael Посмотреть сообщение
А-а, 'if (el.attachEvent)' - это значит, 'если есть такая команда, то...' да?
Да. Опять же, в разных браузерах разные методы.
Цитата Сообщение от Hagrael Посмотреть сообщение
Почему нет аргументов в вызову функции ButtonTest?
Потому что мы ставим обработчиком события саму функцию, а не то, что она возвращает. Надеюсь, это поможет понять суть:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
function A() {
    ...
}
function B() {
    ...
}
 
var x;
if (...) x = A;
else x = B;
x();
Т.е. в x запомнили нужную функцию, а потому ее вызвали.
Цитата Сообщение от Hagrael Посмотреть сообщение
Всё-таки мы ведь должны передать туда объект event или он передаётся туда автоматически?
Браузер его передаст сам (как выше писал, либо в первый аргумент, который у нас e, либо в window.event).
Цитата Сообщение от Hagrael Посмотреть сообщение
Извините, если не сразу всё понимаю.
Ничего, это сложным момент. Любая функция - это на самом деле тоже объект класса Function.
JavaScript
1
2
3
4
5
6
var F = function(){
    alert(1);
} ;
alert(typeof F);
alert(F.constructor);
F();
1
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
10.07.2010, 10:41  [ТС]
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Да. Опять же, в разных браузерах разные методы.
Понятно.
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Ничего, это сложный момент.
Спасибо. А на javascript.ru меня забанили за это.
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Т.е. в x запомнили нужную функцию, а потому ее вызвали.
С этим почти разобрался. Но разве если написать element.onclick=f(x), то x примет значение - функцию f()? Просто если ты хочешь передать туда аргументы, то как быть (а создать событие ты хочешь именно через этот способ)?
Значит, e=event по умолчанию? Но в Explorer'e не так, и поэтому надо писать
JavaScript
1
e=e || window.event
Я правильно понял?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
10.07.2010, 10:56
Цитата Сообщение от Hagrael Посмотреть сообщение
Но разве если написать element.onclick=f(x), то x примет значение - функцию f()?
Если так написать, то в onclick передастся результат вызова f, а не сама f. Не мы вызываем f, а сам браузер, и он передает туда что-то. Если нужно что-то свое туда передать, то это делается по принципу глобальных переменных (или свойств), которые видны и внутри и снаружи обработчика.
Простой пример
JavaScript
1
2
3
4
5
6
7
var x = 5;
function f(e) {
    e = e || window.event;
    if (e.type == 'click') x++;
};
 
a.onclick = f;
Примеры посложнее, не захламляют глобальную область лишними переменными:
JavaScript
1
2
3
4
5
6
function f(e) {
    e = e || window.event;
    if (e.type == 'click') f.x++;
};
f.x = 5;
a.onclick = f;
JavaScript
1
2
3
4
5
6
7
(function(){
    var x = 5;
    a.onclick = function(e) {
        e = e || window.event;
        if (e.type == 'click') x++;
    };
})()
Цитата Сообщение от Hagrael Посмотреть сообщение
Значит, e=event по умолчанию? Но в Explorer'e не так, и поэтому надо писать
Да, примерно так. В функцию-обработчик event передается в первый аргумент (мы его назвали e). В неправильном IE в первый параметр ничего не передается.
1
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
10.07.2010, 11:36  [ТС]
Я понял!
Значит, аргументы передаются в функцию, как свойства. А когда они передаются - во время чтения строки 'f.x=5' или при вызове функции?
Значит, если я пишу
JavaScript
1
a.onclick=f(x)
то тогда вначале выполняется функция f(), а потом из неё берётся x и выполняется, как функция, да?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
10.07.2010, 12:18
Нет. Фукция - это некая сущность. Вот мы ее, как сущность, и передаем браузеру, а уже сам браузер ее вызывает с нужными аргументами.

Не надо писать так
JavaScript
1
a.onclick=f(x)
ибо это бред. Cначала будет вызвана f(x) и то, что она return'уна, попадет в a.onclick, и получится полный бред.

Надо саму функцию присваивать
JavaScript
1
a.onclick=f;
а вызывать ее будет браузер.

Вот это постарайтесь понять:
JavaScript
1
2
3
4
5
function f() {
    return 42;
};
alert( f() );
alert( f );
1
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
10.07.2010, 12:50  [ТС]
Вот код:
JavaScript
1
2
f.x=document.i.value
a.onclick=f
А когда x станет равным document.i.value - во время вызова функции?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
10.07.2010, 13:04
Цитата Сообщение от Hagrael Посмотреть сообщение
А когда x станет равным document.i.value - во время вызова функции?
Не понимаю вопроса. Как он станет? ЕГо кто-то должен обновить, чтобы он стал:
JavaScript
1
2
3
4
5
function f() {
    f.x = dosument.i.value;
    // ...
};
a.onclick=f;
Т.е. когда произошел клик, когда вызвалось f(), тогда и прочитали i.value.
1
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
10.07.2010, 15:02  [ТС]
А-а, то есть аргументы для функций, которые будут вызваны таким способом (element.onclick=f), пишутся в самой функции (function f() {f.text=document.i.value}), да? СПАСИБО!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.07.2010, 15:02
Помогаю со студенческими работами здесь

Передавать не ссылку, а объект
Вообщем: У меня есть интерфейс Int: public interface Intr { double Length { get; set; } string Name { get; set; } ...

Для чего нужен объект Event?
Для чего нужен объект Event?

Как передавать указатель на функцию в функцию для ее выполнения?
Здравствуйте! Вопрос следующий: Как передавать указатель на функцию в функцию для ее выполнения? Например: &lt;хедер&gt; ... ...

Событие Event.COPY Event.PASTE Event.CUT
Привет я не знаю как написать код в котором текстовое поле реагировало бы на события копирования/вставки/вырезки В справочнике написано,...

Обработчик события .load(). Толстеет объект Event
Пишу галерею. Нужно выполнят функцию, после полной загрузки картинки. Вставляю эту функцию в событие .load() и наблюдаю следующее: нажал 1...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru