Z kodem jQuery takim jak:
$("#myid").click(myfunction);
function myfunction(arg1, arg2) {/* something */}
Jak przekazać argumenty do myfunction
podczas korzystania z jQuery?
javascript
jquery
Edward Wong Hau Pepelu Tivrusk
źródło
źródło
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
click
wyzwoleniu zdarzenia. To z kolei wywołamyfunction()
argumenty, które podasz.Jeśli chcesz zachować
ThisBinding
(wartośćthis
momentu 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 jQuery
event
.Jeśli nie chcesz przekazać odwołanie, należy wykorzystać jQuery w
proxy()
funkcji (co jest krzyż wrapper dla przeglądarkiFunction.prototype.bind()
). To pozwala przekazać argumenty, które są zobowiązane przed tymevent
argumentem.$("#myid").click($.proxy(myfunction, null, arg1, arg2));
jsFiddle .
W tym przykładzie
myfunction()
zostałby wykonany wThisBinding
stanie nienaruszonym (null
nie jest obiektem, więcthis
używana jest normalna wartość elementu, który wywołał zdarzenie), wraz z argumentami (w kolejności)arg1
,arg2
a na końcuevent
obiekt 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ć
event
obiektu jQuerydata
do przekazywania danych, ale wymagałoby to modyfikacji,myfunction()
aby uzyskać do nich dostępevent.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.źródło
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
źródło
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));
źródło
this
ustawiony na inny kontekst, jeśli użyjesz tej metody, na przykład ustawieniebind()
jejthis
w tym kontekście (globalnym) może spowodować, że ta funkcja obsługi kliknięcia będzie miaławindow
obiekt,this
a nie odniesienie do#myid
elementu?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 );
źródło
Są już świetne odpowiedzi, ale tak czy inaczej, oto moje dwa centy. Możesz także użyć:
$("#myid").click({arg1: "foo", arg2: "bar"}, myfunction)
A słuchacz wyglądałby tak:
function myfunction(event){ alert(event.data.arg1); alert(event.data.arg2); }
źródło
Prosty:
$(element).on("click", ["Jesikka"], myHandler); function myHandler(event){ alert(event.data); //passed in "event.data" }
źródło