Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.73/67: Рейтинг темы: голосов - 67, средняя оценка - 4.73
Просто любитель
625 / 463 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
1

Как передать аргументы функции, назначенной addEventListener?

20.10.2011, 09:21. Показов 13632. Ответов 22
Метки нет (Все метки)

К примеру:
Javascript
1
2
3
4
function alerter (txt) {
    alert(txt);
}
document.body.addEventListener("click",alerter,false,"it's work");
Не работает. Функции alerter передаётся только аргумент класса Event.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2011, 09:21
Ответы с готовыми решениями:

Как передать аргументы функции
Доброго времени суток! Знаю вопрос банальный, но я не особо шарю в MatLab. Я так понял здесь:...

Как передать имя функции и её аргументы в виде текстовой переменной и запустить её преобразовав в команду?
Возможно ли передать имя функции и её аргументы в виде текстовой переменной и потом запустить её...

addEventListener - дополнительные аргументы
Здравствуйте. ActionScript знаю довольно плохо, поэтому требуется помощь) Конечно, мог бы...

For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента
Изучаю контейнеры и алгоритмы stl по Майерсу . С непривычки слегка охренел и запутался в них . В...

__________________

Записывайтесь на профессиональные курсы Fullstack-разработчиков на JavaScript‌
Обучение в Java Mentor с оплатой после трудоустройства
22
13194 / 6581 / 1040
Регистрация: 10.01.2008
Сообщений: 15,069
20.10.2011, 14:36 2
Какой вообще смысл в такой функции?
Javascript
1
.addEventListener("click", function(e){ alert("it's work"); },false);
1
БТР - мой друг
332 / 276 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
20.10.2011, 16:33 3
Javascript
1
2
3
.addEventListener ("click", function () {
    alerter ("It works!");
}, false);
Но не забывайте, что добавление обработчика события через .addEventListener некроссбраузерно

Добавлено через 35 секунд
(Про кроссбраузерное добавление события)
1
Просто любитель
625 / 463 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
20.10.2011, 16:53  [ТС] 4
Vovan-VE, смысл в том, чтобы была возможность удалить назначенное событие с помощью .removeEventListener(). В случае назначения анонимной функции, удалить её из листа событий нельзя (или я не знаю такого способа).

Добавлено через 3 минуты
Hagrael, я кодю (быдлокодю, наверное=) для собственного удовольствия, делая небольшие скрипты под WebKit'овский браузер (на андроид и под Chrome домой и на работу), делая небольшие оффлайн-приложения для расчётов и обработки данных, поэтому не сильно озабочен кроссбраузерностью, что иногда (при ответах в темах) выходит боком.

Похоже, ваш вариант тоже не позволяет удалить назначенное событие с помощью removeEventListener() ?
0
13194 / 6581 / 1040
Регистрация: 10.01.2008
Сообщений: 15,069
20.10.2011, 18:09 5
Цитата Сообщение от GuardCat Посмотреть сообщение
В случае назначения анонимной функции, удалить её из листа событий нельзя (или я не знаю такого способа).
Ну а кто запрещает запомнить её в переменную или еще куда-нибудь?
0
10 / 10 / 1
Регистрация: 12.08.2011
Сообщений: 19
20.10.2011, 22:30 6
Вот :cofee:
Javascript
1
2
3
4
5
6
7
8
9
10
11
function onEvent(element, event_name, handler) {
    /*Обработка событий для всех браузеров кроме IE*/
    if (element.addEventListener) {
        element.addEventListener(event_name, handler, false);
        /*Обработчик событий для IE*/
    } else {
        element.attachEvent('on' + event_name, handler);
    }
}
/*Вызываем ф-ию по нажатию кнопки*/
onEvent(document, 'mousedown', mouseDown);
Javascript
1
2
3
4
5
6
7
8
9
10
    removeHandler(document, 'mouseup', mouseUpWin);
}
/*Функция отмены события для браузеров и IE соответсвенно*/
function removeHandler(element, event_name, handler) {
    if (element.removeEventListener) {
        element.removeEventListener(event_name, handler, false);
    } else {
        element.detachEvent('on' + event_name, handler);
    }
}
Javascript
1
2
3
4
function mouseDown(e){
    /*получаем ссылку на элемент с событием*/
    var target = e.target || event.srcElement;
//Тут уже ваш код с проверками условия (проверка от какого элемента пришло событие и что с ним делать)
1
Просто любитель
625 / 463 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
21.10.2011, 09:20  [ТС] 7
Vovan-VE, буду благодарен за пример, где функция присваивается переменной, например, далее назначается по addEventListener с аргументами и далее удаляется по removeEventListener.

Добавлено через 2 минуты
LuckyO_O, спасибо за пример. Остался открытым вопрос с передачей аргументов функции при назначении события. Я так понимаю, вы предлагаете заменить передачу аргументов ветвлениями, зависящими от того, какой элемент сигнализирует о событии? Это вариант, но, на мой взгляд недостаточно универсальный.
0
10 / 10 / 1
Регистрация: 12.08.2011
Сообщений: 19
21.10.2011, 10:47 8
Вариант более чем универсальный и удобный.
Не совсем понимаю, что вам это даст, но попробуйте ловить через var arguments;
Собственно любая ф-ия может принять любое число аргументов, даже если они не были объявлены в ее шапке, например
Javascript
1
2
3
function f(x, y, z, a, b, c){
тут ваш код
}
Можно заменить на
Javascript
1
2
3
4
5
function f (){
var arguments;
var s = arguments.length;
var x = arguments[0];
}
При объявлении arguments в теле функции, переменной автоматически присваивается массив переданных аргументов. Собственно как работать с массивом вы знаете, попробуйте адаптировать уже приведенные коды с использованием arguments. Может чего и выйдет =). Сам такой ерундой не страдал и не совсем понимаю, зачем Вам при событие ще и параметры какие то передавать.
1
Просто любитель
625 / 463 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
21.10.2011, 14:26  [ТС] 9
LuckyO_O, =) Сам не знаю зачем. Но если есть функция, должна же она принимать аргументы? Для меня это — хобби, мне простительно А вообще, проще, на мой взгляд, сказать функции что от неё нужно, чем заставлять её разбираться с тем, кто, зачем и для чего её вызвал.

Добавлено через 2 часа 34 минуты
LuckyO_O, я сломал весь мозг, но не смог понять, как я могу, используя arguments, получить аргументы внутри функции, если они не были переданы при её вызове.

P.S.
Кстати, объявлять arguments не обязательно. Массив доступен и без объявления.
0
13194 / 6581 / 1040
Регистрация: 10.01.2008
Сообщений: 15,069
21.10.2011, 16:16 10
GuardCat,
Javascript
1
2
3
4
5
6
function alerter() {
    alert("It'works");
};
document.body.addEventListener("click", alerter, false);
// ...
document.body.removeEventListener("click", alerter, false);
либо
Javascript
1
2
3
4
5
6
var alerter = function() {
    alert("It'works");
};
document.body.addEventListener("click", alerter, false);
// ...
document.body.removeEventListener("click", alerter, false);
1
Просто любитель
625 / 463 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
21.10.2011, 23:14  [ТС] 11
Товарищи, получается, если мне нужно, чтобы функция выводила сообщение, в зависимости от различных условий разное, то уже внутри неё следует разбирать event, ловить тип события и объект, на котором оно произошло, нужно зашить в неё все возможные варианты сообщений? Как-то не нравится мне в таком ракурсе ненавязчивый js. Кросспроектная универсальность функций падает. Что ж, будем работать с тем что есть.

Спасибо всем, кто помог разобраться!
0
13194 / 6581 / 1040
Регистрация: 10.01.2008
Сообщений: 15,069
22.10.2011, 06:34 12
Цитата Сообщение от GuardCat Посмотреть сообщение
Товарищи, получается, если мне нужно, чтобы функция выводила сообщение, в зависимости от различных условий разное, то уже внутри неё следует разбирать event, ловить тип события и объект, на котором оно произошло, нужно зашить в неё все возможные варианты сообщений?
Если в конечном итоге функция делает одно и то же, но с разными данными, то проще разбить её на два этапа и для первого этапа сделать для каждого типа события отдельные функции, которые все будут вызывать вторую.
0
БТР - мой друг
332 / 276 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
23.10.2011, 10:28 13
На всякий случай поясню. Со всякой функцией можно обращаться, как с обычной переменной. Ее можно хоть складывать с чем-то (и получится "Не Число" - NaN - "Not a Number"), ей можно, подобно объекту, присваивать свойства:
Javascript
1
2
3
function A () {}
A.b = 5;
A.c = {name: "Object of function A"};
и уж конечно функцию можно отправлять аргументом, вызывая другую функцию:
Javascript
1
2
3
4
5
6
7
8
function B (FUNC) {
    FUNC ();
}
 
function A () {}
 
B (A);
A (A); // правда, это ничего не даст =)
В последней строке примера вызвалась функция A с аргументом A, т. е. функция вызывается с аргументом, равным ей же. Это совсем не запрещено (а зачем запрещать-то?). Вас может насторожить, что функция A вызывалась с аргументом, в то время как она не принимает никаких аргументов. В других ЯП это вызвало бы ошибку, но не в JS. В нем нет такого правила как "Сколько аргументов функция принимает, столько в нее и надо послать". Все отправленные аргументы попадут в локальный массив arguments. И его совсем необязательно объявлять, как писал LuckyO_O:
Javascript
1
2
3
4
function A () {
    alert (arguments[ 0 ]);
}
// здесь массив arguments не доступен, т. к. он локален
Вы спросите, зачем нужен этот массив, если можно дать человеческие имена аргументам, занеся их в отдельные локальные переменные? Он нужен затем, что иногда вы не сможете знать, сколько аргументов вам передают, и тут на помощь и приходит массив arguments, проходясь в цикле по которому вы сможете обработать каждый из аргументов.
В JS существует 2 способа создать функцию:
Javascript
1
2
3
4
5
6
function [имя_функции] ( [аргументы_функции] ) {
    [код_выполняемый_функцией]
}
[префикс_если_надо] [имя_функции] = function ( [аргументы_функции] ) {
    [код_выполняемый_функцией]
}
Однако способы слегка отличаются друг от друга.
Первый указывает, что компьютеру следует создать локальную функцию, как только программа "входит" в скоп с ней. Т. е. вот как это работает:
Javascript
1
2
3
4
5
6
........... {
    ........... // здесь функция A уже была создана и может применяться
    function A () {}
    ........... // здесь функция A тоже может быть вызвана
}
........... // здесь функция A не может быть вызвана, т. к. она локальная
Второй же указывает на то, что компьютеру следует создать функцию (возможно, локальную, возможно, глобальную), когда программа дойдет до команды "создать функцию". Т. е. вот как это работает:
Javascript
1
2
3
4
5
6
7
8
........... {
    ........... // здесь функцию вызвать нельзя, т. к. она еще не создана
    var A = function () {}
    ........... // здесь функцию можно вызвать
}
........... // здесь функцию нельзя вызвать, т. к. мы обозначили ее, как локальную
            // однако мы можем обозначить ее как глобальную, убрав префикс "var" перед ней,
           // и тогда мы сможем ее вызвать извне того скопа, в котором она была создана
Функции, созданные по второму методу, называются лямбда-функциями или неименноваными функциями. И у меня вопрос: почему их так называют? Их ведь заносят в переменную, а значит, у них есть имя.

Добавлено через 4 минуты
А вообще, GuardCat, вы можете сделать так:
Javascript
1
2
3
4
5
6
7
8
9
10
function getAlerterCaller (str) {
    return function () {
        alerter (str);
    }
}
 
// теперь работаем
var myAlerterCaller = getAlerterCaller ("hi people!");
document.body.addEventListener ("click", myAlerterCaller, false);
document.body.removeEventListener ("click", myAlerterCaller, false);
1
Просто любитель
625 / 463 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
25.10.2011, 12:36  [ТС] 14
Двойная обёртка — реальный вариант. Буду использовать.
0
Vovan-VE
25.10.2011, 18:49
  #15

Не по теме:

Фича называется Карринг / Currying

1
БТР - мой друг
332 / 276 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
26.10.2011, 14:30 16
Vovan-VE, но ведь в моем случае аргумент везде 1, и функция getAllerterCaller никак не влияет на их количество. А каррирование - это ведь уменьшение аргументов. Выходит, это не карринг.
0
13194 / 6581 / 1040
Регистрация: 10.01.2008
Сообщений: 15,069
26.10.2011, 15:24 17
Hagrael, Как раз-таки и влиает. Был 1 агрумент, а стало 0. Функция в конецном итоге вызывается та же самая.
0
4 / 0 / 0
Регистрация: 29.11.2011
Сообщений: 94
02.12.2011, 17:33 18
У меня вопрос. А если я хочу слушать массив на изменения, как должен выглядеть код???
0
13194 / 6581 / 1040
Регистрация: 10.01.2008
Сообщений: 15,069
02.12.2011, 19:39 19
Цитата Сообщение от Пися Камушкин Посмотреть сообщение
А если я хочу слушать массив на изменения, как должен выглядеть код???
Сам по себе массив (Array) не имеет никаких событий.
0
4 / 0 / 0
Регистрация: 29.11.2011
Сообщений: 94
02.12.2011, 21:18 20
А как можно событие связать с массивом???

Добавлено через 43 минуты
Или с переменной или как там еще можно?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2011, 21:18

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Создание функции, формирующую предложение из аргументов функции, аргументы . Аргументы - переменное число
Короче, вот бы всё норм. Хочу соединять, но он мне выдаёт ошибку, когда использую strcat. Не могу...

Как передать аргументы?
Подскажите как передать аргументы чтобы калькулятор заработал? #include "stdafx.h" #include...

Как передать аргументы в поток?
Здравствуйте, как ни стараюсь разобраться, никак не получается. Помогите пожалуйста. main.cpp ...

Можно ли в коде VBA пользовательской функции EXCEL передать аргументы и запустить для промежуточного расчета процедуру?
Ребята! Подскажите. Можно ли в коде VBA пользовательской функции EXCEL передать аргументы и...

Как правильно передать аргументы в функцию?
Подскажите пожалуйста, как правильно сделать из этого функцию Node *p = new Node;...

Вектор объектов - как передать аргументы в конструктор
Привет Нужно создать вектор объектов std::vector<object> collection(N); существует ли ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.