Функция jQuery .click() вызывается автоматически

У меня есть прослушиватель событий, настроенный на кнопку с помощью jQuery, и по какой-то причине функция в прослушивателе кликов вызывается без нажатия кнопки. Я знаю, что обычно функции анонимны в слушателях, но это не будет работать как анонимная функция. Функция, которую я вызываю, также должна принимать параметры, поэтому я не думаю, что могу просто вызвать ссылку на функцию. Любые идеи о том, как я могу решить проблему вызова функции без щелчка, даже зарегистрированного, и при этом передать функции необходимые параметры?

$('#keep-both').click(keepBothFiles(file, progress, audioSrc));

вызывает эту функцию

function keepBothFiles(file, progress, audioSrc) {
    ...
    ...
}

person Ilan Biala    schedule 08.07.2013    source источник
comment
Взгляните на этот ответ: http://stackoverflow.com/questions/979337/how-can-i-pass-arguments-to-event-handlers-in-jquery   -  person    schedule 08.07.2013


Ответы (2)


Вы неправильно указываете функцию. Попробуйте это вместо этого:

$('#keep-both').click(function(){
  keepBothFiles(file, progress, audioSrc);
});

Всякий раз, когда вы используете синтаксис funcName(), () говорит интерпретатору немедленно вызвать функцию. Метод .click требует, чтобы вы передали ему ссылку на функцию. Ссылки на функции передаются только по имени. Вы также можете сделать:

$('#keep-both').click(keepBothFiles);

Но вы не можете передать ему свои другие аргументы. По умолчанию ему присваивается объект события.

person THEtheChad    schedule 08.07.2013

Вы должны передать ссылку на функцию .click(), а не результат вызова функции. Когда вы включаете (), как это keepBothFiles(...) в конце имени функции, вы указываете javascript выполнить функцию сейчас. Когда вы просто используете имя функции, такое как keepBothFiles, вы получаете ссылку на функцию (которую можно вызвать позже).

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

Функция обратного вызова обработчика кликов передается только одним параметром (событием) в jQuery, поэтому вы не можете заставить его вызывать вашу функцию keepBothFiles(file, progress, audioSrc) напрямую, как она у вас есть.

Вместо этого это можно было бы сделать с помощью второй функции-оболочки:

$('#keep-both').click(function(e) {
    keepBothFiles(file, progress, audioSrc);
});
person jfriend00    schedule 08.07.2013
comment
я бы также просто передал e в функцию keepBothFiles, если бы мне это тоже было нужно, верно? - person Ilan Biala; 09.07.2013
comment
@IlanBiala - да, если e имеет отношение к функции, вы тоже можете передать ее. - person jfriend00; 09.07.2013