Як я можу передати аргументи обробникам подій у jQuery?


92

З кодом jQuery, таким як:

$("#myid").click(myfunction);

function myfunction(arg1, arg2) {/* something */}

Як передати аргументи myfunction, використовуючи jQuery?


Відповіді:


110

Найпростіший спосіб - зробити це так (припускаючи, що ви не хочете, щоб інформація про події передавалася функції) ...

$("#myid").click(function() {
    myfunction(arg1, arg2);
});

jsFiddle .

Це створює анонімну функцію, яка викликається при clickактивації події. Це, у свою чергу, буде викликати myfunction()аргументи, які ви надаєте.

Якщо ви хочете зберегти ThisBinding(значення часу, thisколи функція викликається, встановіть елемент, який ініціював подію), тоді викличте функцію за допомогою call().

$("#myid").click(function() {
    myfunction.call(this, arg1, arg2);
});

jsFiddle .

Ви не можете передавати посилання безпосередньо так, як вказано у вашому прикладі, або його єдиним аргументом буде об’єкт jQueryevent .

Якщо ви дійсно хочете передати посилання, ви повинні використовувати JQuery в proxy()функцію (яка є крос - браузер обгортка для Function.prototype.bind()). Це дозволяє передавати аргументи, які пов'язані , перш ніж в eventаргументі.

$("#myid").click($.proxy(myfunction, null, arg1, arg2));   

jsFiddle .

У цьому прикладі myfunction()буде виконано з його ThisBindingцілим ( nullне є об’єктом, тому використовується звичайне thisзначення елемента, який ініціював подію), разом з аргументами (по порядку) arg1, arg2і, нарешті, eventоб’єктом jQuery , який ви можете ігнорувати якщо це не потрібно (навіть не називайте його в аргументах функції).

Ви також можете використовувати eventоб'єкт jQuery dataдля передачі даних, але для цього потрібно буде змінити myfunction()доступ до нього через event.data.arg1(які не є аргументами функції, як згадується у вашому запитанні), або, принаймні, ввести ручну функцію проксі, як попередній приклад або згенерований на останньому прикладі.


2
майте на увазі, ви втратите контекст jquery $ (this) у моїй функції (). Для підтримки телефонуйте myfunction(this, arg1, arg2)з анонімного обробника. Тоді ваша функція може зробитиmyfunction(el, arg1, arg2) { alert($(el).val()); }
lambinator

11
@geosteve: Якщо ви хотіли його зберегти, використовуйте myfunction.call(this, arg1, arg2).
alex

1
Це не передача аргументів функції, як задає питання. Це виклик функції, яка викликає іншу функцію. Вкладання функцій всередину анонімних функцій - погана ідея, оскільки ви не можете легко відв’язати анонімну функцію.
Джордж Філіппакос

1
@ geo1701 Ви можете, якщо використовуєте власний простір імен і прив’язуєтесь до нього лише один раз. Для більшості цілей це нормально. Але ви втрачаєте ту вигоду, про яку згадали.
alex

1
Погодившись з @ geo1701, мені довелося видалити обробник подій, і його рішення працює лише одне.
Павел К

76
$("#myid").on('click', {arg1: 'hello', arg2: 'bye'}, myfunction);

function myfunction(e) {

    var arg1 = e.data.arg1;
    var arg2 = e.data.arg2;

    alert(arg1);
    alert(arg2);

}

//call method directly:
myfunction({
    arg1: 'hello agian', 
    arg2: 'bye again'
});

Також дозволяє прив’язувати та відв’язувати конкретні обробники подій за допомогою методів увімкнення та вимкнення.

Приклад:

$("#myid").off('click', myfunction);

Це скасує обробник моєї функції від #myid


Це не передача аргументів функції, як задає питання.
alex

4
Саме так ви передаєте аргументи (ви загортаєте їх всередину об’єкта).
Джордж Філіппакос

Це спосіб передачі даних, але це розтяжка, що називає їх аргументами функції.
alex

6
Це краще рішення прийнятої відповіді, оскільки воно використовує рекомендований зразок прив’язки та розв’язування слухачів за допомогою методів увімкнення / вимкнення.
Джордж Філіппакос

7
Якщо ви вважаєте, що розв’язування є досить рідкісним, тоді у вас повинен бути дуже обмежений досвід. Будь ласка, не качайте внески інших - це колективна база знань, а не змагання. Тут немає правильних чи неправильних відповідей.
Джордж Філіппакос

12

хоча вам, звичайно, слід використовувати відповідь Алекса, метод "прив'язки" бібліотеки прототипів стандартизований в Ecmascript 5 і незабаром буде впроваджений у браузерах. Це працює так:

jQuery("#myid").click(myfunction.bind(this, arg1, arg2));

2
Буде thisвстановлено інший контекст, якщо ви використовуєте цей метод, наприклад, bind()введення його thisв цей контекст (глобальний) може призвести до того, що обробник клацань матиме windowоб’єкт якthis на відміну від посилання на #myidелемент?
alex

2
@alex ти цілком маєш рацію. jQuery прив’яже елемент #myid до 'this' у своїх обробниках подій, а використання методу bind перевизначить це. Я писав цю публікацію кілька років тому, здається, важко сказати, про що я думав тоді. Я думаю, я просто припускаю, що люди, які читають мої відповіді, досить розумні, щоб самі зрозуміти ці деталі.
бретонський

12
Це дуже небезпечне припущення.
Тревіс,

@Travis На момент написання статті (майже через 11 років після відповіді Бретона) caniuse.com повідомляє, що Ecmascript 5 підтримується 98,87% браузерів. (див. caniuse.com/#search=ECMAScript%205 )
Стефан,

@Stephan Мій коментар був спрямований на @Breton за припущення people reading my answers are smart enough to figure these details out themselves, а не про Ecmascript.
Тревіс

6

Стара тема, але для цілей пошуку; спробуйте:

$(selector).on('mouseover',...);

... і перевірте параметр "data": http://api.jquery.com/on/

наприклад:

function greet( event ) {
  alert( "Hello " + event.data.name );
}
$( "button" ).on( "click", {name: "Karl"}, greet );
$( "button" ).on( "click", {name: "Addy"}, greet );

4

Вже є чудові відповіді, але в будь-якому разі, ось мої два центи. Ви також можете використовувати:

$("#myid").click({arg1: "foo", arg2: "bar"}, myfunction)

А слухач буде виглядати так:

function myfunction(event){ alert(event.data.arg1); alert(event.data.arg2); }


2

Просто:

$(element).on("click", ["Jesikka"],  myHandler);

function myHandler(event){
   alert(event.data);     //passed in "event.data"
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.