З кодом jQuery, таким як:
$("#myid").click(myfunction);
function myfunction(arg1, arg2) {/* something */}
Як передати аргументи myfunction, використовуючи jQuery?
З кодом jQuery, таким як:
$("#myid").click(myfunction);
function myfunction(arg1, arg2) {/* something */}
Як передати аргументи myfunction, використовуючи jQuery?
Відповіді:
Найпростіший спосіб - зробити це так (припускаючи, що ви не хочете, щоб інформація про події передавалася функції) ...
$("#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(які не є аргументами функції, як згадується у вашому запитанні), або, принаймні, ввести ручну функцію проксі, як попередній приклад або згенерований на останньому прикладі.
myfunction(this, arg1, arg2)з анонімного обробника. Тоді ваша функція може зробитиmyfunction(el, arg1, arg2) { alert($(el).val()); }
myfunction.call(this, arg1, arg2).
$("#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
хоча вам, звичайно, слід використовувати відповідь Алекса, метод "прив'язки" бібліотеки прототипів стандартизований в Ecmascript 5 і незабаром буде впроваджений у браузерах. Це працює так:
jQuery("#myid").click(myfunction.bind(this, arg1, arg2));
thisвстановлено інший контекст, якщо ви використовуєте цей метод, наприклад, bind()введення його thisв цей контекст (глобальний) може призвести до того, що обробник клацань матиме windowоб’єкт якthis на відміну від посилання на #myidелемент?
people reading my answers are smart enough to figure these details out themselves, а не про Ecmascript.
Стара тема, але для цілей пошуку; спробуйте:
$(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 );