Z kodem jQuery takim jak:
$("#myid").click(myfunction);
function myfunction(arg1, arg2) {/* something */}
Jak przekazać argumenty do myfunctionpodczas korzystania z jQuery?
Z kodem jQuery takim jak:
$("#myid").click(myfunction);
function myfunction(arg1, arg2) {/* something */}
Jak przekazać argumenty do myfunctionpodczas korzystania z jQuery?
Odpowiedzi:
Najprościej zrobić to w ten sposób (zakładając, że nie chcesz, aby żadne informacje o zdarzeniu przekazywane do funkcji) ...
$("#myid").click(function() {
myfunction(arg1, arg2);
});
jsFiddle .
Tworzy to anonimową funkcję, która jest wywoływana po clickwyzwoleniu zdarzenia. To z kolei wywoła myfunction()argumenty, które podasz.
Jeśli chcesz zachować ThisBinding(wartość thismomentu wywołania funkcji, ustaw na element, który wyzwolił zdarzenie), wywołaj funkcję za pomocą call().
$("#myid").click(function() {
myfunction.call(this, arg1, arg2);
});
jsFiddle .
Nie możesz przekazać odwołania bezpośrednio w sposób, w jaki stwierdza Twój przykład, albo jego pojedynczy argument będzie obiektem jQueryevent .
Jeśli nie chcesz przekazać odwołanie, należy wykorzystać jQuery w proxy()funkcji (co jest krzyż wrapper dla przeglądarki Function.prototype.bind()). To pozwala przekazać argumenty, które są zobowiązane przed tym eventargumentem.
$("#myid").click($.proxy(myfunction, null, arg1, arg2));
jsFiddle .
W tym przykładzie myfunction()zostałby wykonany w ThisBindingstanie nienaruszonym ( nullnie jest obiektem, więc thisużywana jest normalna wartość elementu, który wywołał zdarzenie), wraz z argumentami (w kolejności) arg1, arg2a na końcu eventobiekt jQuery , który można zignorować jeśli nie jest to wymagane (nawet nie nazywaj tego w argumentach funkcji).
Możesz również użyć eventobiektu jQuery datado przekazywania danych, ale wymagałoby to modyfikacji, myfunction()aby uzyskać do nich dostęp event.data.arg1(które nie są argumentami funkcji, takimi jak wspomniane w pytaniu) lub przynajmniej wprowadzić ręczną funkcję proxy, taką jak poprzedni przykład lub wygenerowany używając tego drugiego przykładu.
myfunction(this, arg1, arg2)z anonimowego programu obsługi. Wtedy twoja funkcja może to zrobić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'
});
Umożliwia także wiązanie i odłączanie określonych programów obsługi zdarzeń przy użyciu metod włączania i wyłączania.
Przykład:
$("#myid").off('click', myfunction);
Spowodowałoby to odłączenie procedury obsługi mojej funkcji od #myid
chociaż z pewnością powinieneś użyć odpowiedzi Alexa, metoda „bind” biblioteki prototypowej została ustandaryzowana w Ecmascript 5 i wkrótce zostanie natywnie zaimplementowana w przeglądarkach. Działa to tak:
jQuery("#myid").click(myfunction.bind(this, arg1, arg2));
thisustawiony na inny kontekst, jeśli użyjesz tej metody, na przykład ustawienie bind()jej thisw tym kontekście (globalnym) może spowodować, że ta funkcja obsługi kliknięcia będzie miała windowobiekt, thisa nie odniesienie do #myidelementu?
people reading my answers are smart enough to figure these details out themselves, a nie o Ecmascript.
Stary wątek, ale do celów wyszukiwania; próbować:
$(selector).on('mouseover',...);
... i sprawdź parametr „data”: http://api.jquery.com/on/
na przykład:
function greet( event ) {
alert( "Hello " + event.data.name );
}
$( "button" ).on( "click", {name: "Karl"}, greet );
$( "button" ).on( "click", {name: "Addy"}, greet );