2009-11-17 16 views
8

Próbuję powiązać zdarzenie z textbox, które zawiera parametry. Następująca przechowalnia wygląda tak, jakby powinna, ale za każdym razem, gdy strona się ładuje, zostaje wykonana.jQuery wiąż i usuwaj wiązanie zdarzeń z parametrami

jQuery(function(){ 
    jQuery('#textbox').bind('click', EventWithParam('param')); 
}); 

Zdarzenie zostanie wywołane z tym parametrem przy każdym załadowaniu strony. To może nie działać, ponieważ zdarzenia z parametrami nie są obsługiwane. Jeśli tak, czy jest inna droga?

Odpowiedz

10

Aby powiązać funkcję, która pobiera parametry, należy użyć anonimowej funkcji, aby działać jako zamknięcie nad parametrami.

jQuery(function($) { 
    var param = 'text'; 
    $('#textbox').click(function() { 
     EventWithParam(param); 
     // or just use it without calling out to another function 
     $(this).text(param); 
    }); 
}); 

Twój przykład jest wykonywanie funkcji EventWithParam, a następnie stara się związać na wynik tego wywołania funkcji.

Wywołanie unbind bez określenia funkcji spowoduje odblokowanie wszystkich programów obsługi dla określonego typu zdarzenia (w tym funkcji anonimowej). Jeśli chcesz, aby rozwiązać tę funkcję konkretnie, trzeba zapewnić mu nazwę, na przykład:

jQuery(function($) { 
    var param = 'text', 
     clickCallback = function() { 
      EventWithParam(param); 
      // or just use it without calling out to another function 
      $(this).text(param); 
     }; 
    $('#textbox').click(clickCallback); 
}); 
1

Powodem jest to, że EventWithParam jest nazywany jako funkcja prawo w twojej wiążące. Wyrażone w inny sposób, wiążące zdarzenia click do wynik połączenia EventWithParam('param'). To powinno działać:

jQuery('#textbox').bind('click',function(){EventWithParam('param')}); 

Teraz już związała nawet do funkcji, która, gdy zdarzenie pożary, wezwie EventWithParam('param')

+0

gdybym wtedy zrobić unbind będzie rozpiąć funkcja anonimowa? jQuery ('# textbox'). Unbind ("kliknięcie") ;? –

+0

Tak. Zobacz [http://docs.jquery.com/Events/unbind#typefn] – Dan

+0

To nie działa dla mnie? –

0
jQuery(function() { 
    jQuery('#textbox').click(function() { 
     EventWithParam(param1,param2,...,paramN); 
    }); 
}); 

function EventWithParam(param1,param2,...,paramN) { 
    doSomething...; 
    ...; 
} 
4

bdukes jest dokładnie prawo. Dodaję moją odpowiedź, ponieważ ostatnio znalazłem coś interesującego związanego z funkcją bind/unbind jQuery i anonimowymi funkcjami, jej przestrzeniami nazw zdarzeń. Poprzednio pokazane powyżej zdarzenie bind jest wywoływane w następujący sposób.

jQuery('#textbox').bind('click',function(){EventWithParam('param')});

Aby rozwiązać ten nawet użytkownik musi wywołać ... jQuery('#textbox').unbind('click');

W efekcie, usuwając wszystkie zdarzenia onclick.

Teraz pojawia się w przestrzeni nazw jQuery. Jeśli masz anonimową funkcję, którą chcesz dołączyć do zdarzenia kliknięcia, a później usuń ją, zrób to w następujący sposób.

jQuery('#textbox').bind('click.yourNameSpace',function(){EventWithParam('param')});

Następnie do rozpiąć prostego wywołania funkcji Unbind następująco.

jQuery('#textbox').unbind('click.yourNameSpace');

resztę swojego onclick zdarzeń pozostanie.

11

Parametry zdarzeń można przekazywać jako drugie argumenty funkcji bind().To nie jest bezpośredni zwrotnych parametes ale może chcesz go używać:

Z dokumentacji jQuery: bind

function handler(event) { 
    alert(event.data.foo); 
} 
$("p").bind("click", {foo: "bar"}, handler) 
+0

na pewno coś bym użył –

+0

W funkcji handler(), do obiektu można uzyskać dostęp poprzez pole "data" zdarzenia: function handler (evt) {var fooValue = evt.data.foo; } – SCO