jQuery'nin .click - parametreleri kullanıcı işlevine geçirir


283

JQuery's .click kullanarak parametreleri ile bir işlevi çağırmak çalışıyorum, ama işe alamıyorum.

Nasıl çalışmasını istiyorum:

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

hangi çağrılar

function add_event(event) {
    blah blah blah }

Aşağıdaki gibi parametreleri kullanmazsanız çalışır:

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

Ama bir parametreyi işlevime geçirebilmem gerekiyor add_event.

Bu özel şeyi nasıl yapabilirim?

Kullanabileceğimi biliyorum .click(function() { blah }, ancak add_eventişlevi birden çok yerden çağırıyorum ve bu şekilde yapmak istiyorum.


Bu patricksharika bir çözüm olduğunu düşündüğüm cevaptan kabul edildi : jsfiddle.net/naRRk/1
jAndy

Yanıtlar:


514

Ayrıntılı bilgi için, jQuery click olay işleyicisinin 1.4.3 sürümünde sunulan işlevselliğin bir parçası olan başka bir çözümle karşılaştım.

İlk parametre olarak jQuery tarafından olay işleyici işlevine otomatik olarak geri beslenen olay nesnesine bir veri eşlemesi iletmenizi sağlar. Veri eşlemesi .click()ilk parametre olarak fonksiyona ve ardından olay işleyici fonksiyonuna verilir.

İşte ne demek istediğimi göstermek için bazı kod:

// 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);
}

Bu soru için oyunda geç olduğunu biliyorum, ancak önceki cevaplar beni bu çözüme götürdü, bu yüzden umarım birisine yardımcı olur!


11
Bu tam olarak istediğim şeydi (o zamanlar). O zamandan beri bu proje üzerinde çalışmadım ama bence 1.4.0 kullanıyordum. Bu kesinlikle mevcut en iyi yoldur.
Paul Hoffer

1
Dinamik olarak sunucu tarafında nesne oluşturma ve tıklama olayı ile bağlıyorum: r.OnClientClick = "imageClicked ({param1: '" + obj.Command + "'}); return false"; Sonra istemci tarafında var: function imageClicked (event) {if (event.param1 == "GOTO PREVIOUS") {... event.data.param1 kullanırsam tanımsız olduğunu söyler. Şimdi buraya yazdım, farkı görebiliyorum, d'oh!
Aile

1
@Aile - Haaha sorun değil, yorumlar yoluyla bile yardımcı olmak güzel;)
Chris Kempen

5
@totymedli - Hep aynı yapının bir nesne geçirerek, başka bir yerde diyebiliriz sanırım: var param_obj = {data : {param1: "Hello", param2: "World"}}; cool_function(param_obj);?
Chris Kempen

1
Bu, HTML5 veri özelliklerini kullanmaktan çok daha iyi, teşekkür ederim! (Ve JSHint geri aramada 'bu' kullanmaktan şikayetçi!)
Matthew Herbst

77

Bunun gibi anonim bir işlev kullanmanız gerekir:

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

Eğer, örneğin, sadece bir işlev adı varmış gibi diyebilirsiniz olmadan bu gibi parametreler:

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

Ancak add_eventyöntem 'shot'parametre olarak alamaz , aksine nesnenin kendisi clickolan geri çağrısına geçen her şey event... yani bu durumda geçerli değildir , ancak diğerleri için çalışır. Parametreleri geçirmeniz gerekiyorsa, anonim bir işlev kullanın ... veya başka bir seçenek daha vardır .bind(), aşağıdaki gibi verileri kullanın ve iletin:

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

Ve şu şekilde erişin add_event:

function add_event(event) {
  //event.data.param == "shot", use as needed
}

Sadece dediğin zaman, bu sadece demek mi? İkincisi, bu normalde anonim işlev içinde olduğu gibi add_event işlevi içinde $ (this) kullanabileceğim anlamına mı geliyor?
Paul Hoffer

2
@phoffer - Evet, "sadece" hiçbir parametre anlamına gelmez, sadece işlev adıdır, clickişleyiciye atamak istediğiniz işlevi çalıştırmanın sonucu değildir, işleve bir referanstır . .bind()Kullanabileceğiniz yukarıdaki anonim yöntemde ve örneklerde this, .loadtoscoretıkladığınız (beklediğiniz gibi) anlamına gelir. Son örnekte, add_event(event)aynısı içinde doğrudur, thisya da kullanın $(this)ve istediğiniz şey olacaktır.
Nick Craver

1
@phoffer: Kullanmak için öğeyi açık bir şekilde iletmeniz gerekir, örneğin: function(){ add_event('shot', $(this));}ve function add_event(event, element){...}. elementburada bir jQuery öğesi olurdu ( bind()Nick'in de bahsettiği gibi çalışır ).
Felix Kling

@Felix - Ayrıca $(this)işlevin içinde de kullanabilir , örneğin: jsfiddle.net/tSu5t
Nick Craver

35

Eğer sahip olduğun şekilde çağırırsan ...

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

... add_event()bir işlev döndürmeniz gerekir , örneğin ...

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

İşlev döndürülür ve argüman olarak kullanılır .click().


@jAndy - eventParametreyi içeren örneği gönderdiğiniz için teşekkür ederiz . Ben dahil etmeliydim. : o)
user113716

27

Ben böyle .on () kullanarak başarılı oldu:

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

Sonra add_eventfonksiyonun içinde 'şut'a erişim elde edersiniz:

event.data.event_type

Aşağıdaki örneği verdikleri daha fazla bilgi için .on () belgelerine bakın :

function myHandler( event ) {
  alert( event.data.foo );
}
$( "p" ).on( "click", { foo: "bar" }, myHandler );

11

Evet, bu eski bir gönderi. Ne olursa olsun, birisi yararlı bulabilir. Olay işleyicilerine parametre göndermenin başka bir yolu.

//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});

6
      $imgReload.data('self', $self);
            $imgReload.click(function (e) {
                var $p = $(this).data('self');
                $p._reloadTable();
            });

JavaScript nesnesini onclick öğesine ayarlayın:

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

Object'i "this" öğesinden al:

 var $p = $(this).data('self');

Müthiş! Ne yazık ki, bu jquery değişkenleri kullanmaya çalıştığınızda çalışan tek şey! neden olduğu hakkında hiçbir fikrim yok. : |
cregox

3

Basit bir çözüm elde ederim:

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

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

Demek istediğim, value onclickolayını 'e iletmek, javascript function sendData()değişkeni başlatmak ve jquery olay işleyicisi yöntemiyle almaktır.

Bu, sendData(valueid)başlangıçta değeri çağırdığı ve başlattığı için mümkündür . Sonra jquery olayı alın ve bu değeri kullanın.

Bu basit bir çözümdür ve Detay için çözüm Buraya gidin .


Burada dinamik parametreleri geçirmenin bir yolunu görmüyorum, sadece sabit kodlanmış değerler.
user1451111

bu şekilde yalnızca valueId öğesini iletir ve öğeyi ve olay nesnelerini kaybedersiniz.
Zoltán Süle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.