JQuery'deki olay işleyicilerine bağımsız değişkenleri nasıl iletebilirim?


Yanıtlar:


112

En basit yol, bunu böyle yapmaktır (işleve hiçbir olay bilgisinin iletilmesini istemediğinizi varsayarak) ...

$("#myid").click(function() {
    myfunction(arg1, arg2);
});

jsFiddle .

Bu, clickolay tetiklendiğinde çağrılan anonim bir işlev oluşturur . Bu da myfunction()sağladığınız argümanlarla sonuçlanacaktır.

ThisBinding( thisİşlev çağrıldığında değeri , olayı tetikleyen öğeye ayarlayın) tutmak istiyorsanız , ardından işlevi ile çağırın call().

$("#myid").click(function() {
    myfunction.call(this, arg1, arg2);
});

jsFiddle .

Referansı, örneğinizin ifade ettiği şekilde doğrudan iletemezsiniz, aksi takdirde onun tek bağımsız değişkeni jQuery eventnesnesi olur .

Eğer varsa do referansı geçmek istiyorum, sen jQuery'nin kaldıraç gerekir proxy()(çapraz tarayıcı sarıcı içindir fonksiyonu Function.prototype.bind()). Bu , argümandan önce bağlanan argümanları iletmenize izin verir event.

$("#myid").click($.proxy(myfunction, null, arg1, arg2));   

jsFiddle .

Bu örnekte, myfunction()ile gerçekleştirilebilir ki onun ThisBindingbozulmamış ( nulldeğildir bir amacı, bu nedenle, normal thisdurum kullanılan tetikleyen elemanın değeri) bağımsız değişken (sırayla) ile birlikte arg1, arg2ve son olarak jQuery eventgöz ardı edebilirsiniz nesne gerekli değilse (işlevin argümanlarında adını bile koymayın).

Ayrıca, jQuery eventnesnesini dataveri iletmek için de kullanabilirsiniz , ancak bu, ( sorunuzun bahsettiği gibi işlev bağımsız değişkenleri değildir) myfunction()aracılığıyla ona erişmek için değişiklik yapmayı veya en azından önceki örnek veya oluşturulmuş gibi manuel bir proxy işlevini tanıtmayı gerektirir. ikinci örneği kullanarak.event.data.arg1


2
unutmayın, jquery bağlamını $ (this) myfunction () içinde kaybedeceksiniz. Sürdürmek myfunction(this, arg1, arg2)için, anonim işleyiciden arayın . O zaman işleviniz yapabilirmyfunction(el, arg1, arg2) { alert($(el).val()); }
lambinator

11
@geosteve: Saklamak istiyorsanız, kullanın myfunction.call(this, arg1, arg2).
alex

1
Sorunun sorduğu gibi, bu argümanları işleve iletmek değildir. Başka bir işlevi çağıran bir işlevi çağırıyor. Anonim işlevlerin bağını kolayca çözemeyeceğiniz için işlevleri anonim işlevlerin içine yerleştirmek iyi bir fikir değildir.
George Filippakos 01

1
@ geo1701 Özel bir ad alanı kullanırsanız ve ona yalnızca bir kez bağlanırsanız yapabilirsiniz. Çoğu amaç için sorun değil. Ama bahsettiğiniz faydayı kaybedersiniz.
alex

1
@ Geo1701 ile anlaştım, olay işleyicisini kaldırmak zorunda kaldım ve çözümü işe yarayan tek çözümdü.
Pavel K

77
$("#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'
});

Ayrıca, açma ve kapama yöntemlerini kullanarak belirli olay işleyicileri bağlamanıza ve bağlantısını kaldırmanıza olanak tanır.

Misal:

$("#myid").off('click', myfunction);

Bu, myfunction işleyicisinin #myid ile olan bağlantısını çözer


Sorunun sorduğu gibi, bu argümanları işleve iletmek değildir.
alex

4
Argümanları böyle iletirsiniz (onları bir nesnenin içine sararsınız).
George Filippakos

Verileri bu şekilde iletirsiniz, ancak bu, onlara işlev bağımsız değişkenlerini çağırmaktır.
alex

7
Açık / Kapalı yöntemlerini kullanarak önerilen bağlama ve çözme dinleyicileri modelini kullandığından, kabul edilen yanıt için daha iyi bir çözümdür.
George Filippakos 01

7
Bağlantının kaldırılmasının oldukça nadir olduğunu düşünüyorsanız, çok sınırlı deneyime sahip olmalısınız. Lütfen başkalarının katkılarını kaka yapmayın - bu bir rekabet değil kolektif bir bilgi tabanıdır. Doğru ya da yanlış cevap yok.
George Filippakos

12

Alex'in cevabını kesinlikle kullanmanız gerekirken, prototip kitaplığının "bağlama" yöntemi Ecmascript 5'te standartlaştırılmıştır ve yakında tarayıcılarda yerel olarak uygulanacaktır. Şu şekilde çalışır:

jQuery("#myid").click(myfunction.bind(this, arg1, arg2));

2
Will this, örneğin, bu yöntemi kullanırsanız farklı bir bağlamda da set olmak bind()için ing thisbu bağlamda (global) sahip o tıklama işleyicisi ile sonuçlanabilir windowolarak nesneyi thisreferansı aksine #myideleman?
alex

2
@alex oldukça haklısınız. jQuery, #myid öğesini olay işleyicilerinde "this" e bağlar ve bağlama yöntemini kullanmak bunu geçersiz kılar. Bu yazıyı birkaç yıl önce yazdım, öyle görünüyor ki o sırada ne düşündüğümü söylemek zor. Sanırım cevaplarımı okuyan insanların bu ayrıntıları kendileri çözebilecek kadar akıllı olduklarını varsayıyorum.
Breton

12
Bu çok tehlikeli bir varsayımdır.
Travis

@Travis Bu yazı itibariyle (Breton'un cevabından neredeyse 11 yıl sonra) caniuse.com, Ecmascript 5'in tarayıcıların % 98.87'si tarafından desteklendiğini bildirdi . (bkz caniuse.com/#search=ECMAScript%205 )
Stephan

1
@Stephan Yanak dilim yorumum Ecmascript people reading my answers are smart enough to figure these details out themselveshakkında değil, varsayım için @Breton'a yönelikti.
Travis

6

Eski iş parçacığı, ancak arama amaçlı; Deneyin:

$(selector).on('mouseover',...);

... ve "veri" parametresine bakın: http://api.jquery.com/on/

Örneğin:

function greet( event ) {
  alert( "Hello " + event.data.name );
}
$( "button" ).on( "click", {name: "Karl"}, greet );
$( "button" ).on( "click", {name: "Addy"}, greet );

4

Şimdiden harika cevaplar var, ama neyse, işte benim iki sentim. Ayrıca kullanabilirsin:

$("#myid").click({arg1: "foo", arg2: "bar"}, myfunction)

Ve dinleyici şöyle görünür:

function myfunction(event){ alert(event.data.arg1); alert(event.data.arg2); }


2

Basit:

$(element).on("click", ["Jesikka"],  myHandler);

function myHandler(event){
   alert(event.data);     //passed in "event.data"
}
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.