.click jQuery - przekazuje parametry do funkcji użytkownika

283

Próbuję wywołać funkcję z parametrami za pomocą .click jQuery, ale nie mogę jej uruchomić.

Oto jak chcę, żeby to działało:

$('.leadtoscore').click(add_event('shot'));

który wzywa

function add_event(event) {
    blah blah blah }

Działa, jeśli nie używam parametrów, takich jak to:

$('.leadtoscore').click(add_event);
function add_event() {
    blah blah blah }

Ale muszę być w stanie przekazać parametr do mojej add_eventfunkcji.

Jak mogę to zrobić?

Wiem, że mogę korzystać .click(function() { blah }, ale wywołuję tę add_eventfunkcję z wielu miejsc i chcę to zrobić w ten sposób.

Paul Hoffer
źródło
przyjęto to z patricksodpowiedzi, która moim zdaniem jest świetnym rozwiązaniem: jsfiddle.net/naRRk/1
jAndy

Odpowiedzi:

514

Dla dokładności natknąłem się na inne rozwiązanie, które było częścią funkcjonalności wprowadzonej w wersji 1.4.3 procedury obsługi zdarzeń kliknięcia jQuery .

Pozwala przekazać mapę danych do obiektu zdarzenia, który jest automatycznie przekazywany do funkcji obsługi zdarzeń przez jQuery jako pierwszy parametr. Mapa danych byłaby przekazywana do .click()funkcji jako pierwszy parametr, a następnie funkcja obsługi zdarzeń.

Oto kod ilustrujący to, co mam na myśli:

// say your selector and click handler looks something like this...
$("some selector").click({param1: "Hello", param2: "World"}, cool_function);

// in your function, just grab the event object and go crazy...
function cool_function(event){
    alert(event.data.param1);
    alert(event.data.param2);
}

Wiem, że na to pytanie jest późno w grze, ale poprzednie odpowiedzi doprowadziły mnie do tego rozwiązania, więc mam nadzieję, że kiedyś komuś to pomoże!

Chris Kempen
źródło
11
Właśnie tego chciałem (wtedy). Od tego czasu nie pracowałem nad tym projektem, ale myślę, że korzystałem z wersji 1.4.0. To zdecydowanie najlepszy dostępny sposób.
Paul Hoffer
1
Dynamicznie tworzę obiekt po stronie serwera i wiążę zdarzenie click: r.OnClientClick = "imageClicked ({param1: '" + obj.Command + "'}); return false"; Następnie po stronie klienta mam: function imageClicked (event) {if (event.param1 == "GOTO POPRZEDNI") {... Jeśli używam event.data.param1, to znaczy, że jest niezdefiniowany. Teraz napisałem to tutaj, widzę różnicę, och!
Rodzina
1
@Family - Haaha, nie ma problemu, miło jest pomóc, nawet poprzez komentarze;)
Chris Kempen
5
@totymedli - Chyba zawsze można nazwać go gdzieś indziej, przekazując obiekt o tej samej strukturze: var param_obj = {data : {param1: "Hello", param2: "World"}}; cool_function(param_obj);?
Chris Kempen,
1
To o wiele lepsze niż używanie atrybutów danych HTML5, dziękuję! (I rozwiązuje problem JSHinta, który narzeka na użycie tego w oddzwanianiu!)
Matthew Herbst,
77

Musisz użyć takiej anonimowej funkcji:

$('.leadtoscore').click(function() {
  add_event('shot')
});

Możesz to nazwać tak, jak w przykładzie, po prostu nazwę funkcji bez parametrów, jak poniżej:

$('.leadtoscore').click(add_event);

Ale add_eventmetoda nie otrzyma 'shot'tego, co jest parametrem, a raczej cokolwiek clickprzejdzie do jej wywołania zwrotnego, które jest samym eventobiektem ... więc nie ma zastosowania w tym przypadku , ale działa dla wielu innych. Jeśli potrzebujesz przekazać parametry, należy anonimową funkcję ... czy istnieje jedna inna opcja, wykorzystywanie .bind()i przekazywanie danych, jak poniżej:

$('.leadtoscore').bind('click', { param: 'shot' }, add_event);

I uzyskaj do niego dostęp w add_eventnastępujący sposób:

function add_event(event) {
  //event.data.param == "shot", use as needed
}
Nick Craver
źródło
Kiedy mówisz sprawiedliwie, czy to oznacza tylko? Po drugie, czy to oznacza, że ​​będę mógł użyć $ (this) w mojej funkcji add_event, tak jak normalnie w funkcji anonimowej?
Paul Hoffer
2
@phoffer - Tak, „just” oznacza brak parametrów, tylko nazwę funkcji, jest to odwołanie do funkcji, a nie wynik działania funkcji, którą chcesz przypisać do programu clickobsługi. W anonimowej metodzie i .bind()powyższych przykładach, których możesz użyć this, będzie ona odnosić się do .loadtoscoreklikniętego (zgodnie z oczekiwaniami). W ostatnim przykładzie add_event(event)to samo jest prawdą, użyj thislub $(this)i będzie to, czego chcesz.
Nick Craver
1
@phoffer: Musisz użyć elementu jawnie, aby go użyć, np .: function(){ add_event('shot', $(this));}i function add_event(event, element){...}. elementbyłby tu elementem jQuery (działa bind()jednak z, jak wspomniał Nick).
Felix Kling
@ Felix - może także używać $(this)wewnątrz funkcji, na przykład: jsfiddle.net/tSu5t
Nick Craver
35

Jeśli nazwiesz to tak, jak to miałeś ...

$('.leadtoscore').click(add_event('shot'));

... musisz add_event()zwrócić funkcję, na przykład ...

function add_event(param) {
    return function() {
                // your code that does something with param
                alert( param );
           };
}

Funkcja jest zwracana i używana jako argument dla .click().

użytkownik113716
źródło
@jAndy - Dziękujemy za opublikowanie przykładu zawierającego eventparametr. Powinienem to załączyć. : o)
user113716
27

Miałem sukces używając .on () tak:

$('.leadtoscore').on('click', {event_type: 'shot'}, add_event);

Następnie wewnątrz add_eventfunkcji masz dostęp do „strzału” w następujący sposób:

event.data.event_type

Aby uzyskać więcej informacji, zobacz dokumentację .on () , podając następujący przykład:

function myHandler( event ) {
  alert( event.data.foo );
}
$( "p" ).on( "click", { foo: "bar" }, myHandler );
Grób grawitacyjny
źródło
11

Tak, to jest stary post. Niezależnie od tego, ktoś może uznać to za przydatne. Oto inny sposób wysyłania parametrów do procedur obsługi zdarzeń.

//click handler
function add_event(event, paramA, paramB)
{
    //do something with your parameters
    alert(paramA ? 'paramA:' + paramA : '' + paramB ? '  paramB:' + paramB : '');
}

//bind handler to click event
$('.leadtoscore').click(add_event);
...
//once you've processed some data and know your parameters, trigger a click event.
//In this case, we will send 'myfirst' and 'mysecond' as parameters
$('.leadtoscore').trigger('click', {'myfirst', 'mysecond'});

//or use variables
var a = 'first',
    b = 'second';

$('.leadtoscore').trigger('click', {a, b});
$('.leadtoscore').trigger('click', {a});
Kevin
źródło
6
      $imgReload.data('self', $self);
            $imgReload.click(function (e) {
                var $p = $(this).data('self');
                $p._reloadTable();
            });

Ustaw obiekt javaScript na element onclick:

 $imgReload.data('self', $self);

pobierz Obiekt z „tego” elementu:

 var $p = $(this).data('self');
Vladimir Novick
źródło
Niesamowite! Niestety, to jedyna rzecz, która działa, gdy próbuję użyć zmiennych jquery! nie mam pojęcia dlaczego. : |
cregox
3

Dostaję proste rozwiązanie:

 <button id="btn1" onclick="sendData(20)">ClickMe</button>

<script>
   var id; // global variable
   function sendData(valueId){
     id = valueId;
   }
   $("#btn1").click(function(){
        alert(id);
     });
</script>

Mam na myśli to, że przekazujemy onclickzdarzenie value do javascript function sendData(), inicjalizujemy zmienną i bierzemy ją za pomocą metody obsługi zdarzeń jquery.

Jest to możliwe, ponieważ najpierw sendData(valueid)zostaje wywołana i zainicjowana wartość. Następnie po wykonaniu zdarzenia jquery zostanie wykonane i użyje tej wartości.

Jest to proste rozwiązanie, a szczegółowe informacje można znaleźć tutaj .

susan097
źródło
Nie widzę tutaj sposobu na przekazanie parametrów dynamicznych, tylko wartości zakodowane na stałe.
user1451111
w ten sposób przekazujesz tylko wartość valueId i tracisz element oraz obiekty zdarzenia.
Zoltán Süle,