2009-05-27 18 views
5

jQuery kullanıyorum ve bir olay geri çağrısı olarak işlev gören bir işlev var, ve bu işlevde "bu", olayı yakalayan nesneyi temsil eder. Ancak, işlevi başka bir işlevden açıkça çağırmak istediğim bir örnek var - bu durumda "bu" ifadesinin işlev içinde eşit olacağını nasıl ayarlayabilirim? ÖrneğinJavascript işlevini çağırırken, "bu" özel değerini nasıl ayarlayabilirim?

:

function doStuff(el) { 
    $(el).removeClass("sad").addClass("happy"); 
} 

function handleEvent(event) { 
    doStuff(this); 
} 

$("a.sad").click(handleEvent); // in this case, "this" is the anchor clicked 

function differentEvent(event) { 
    $("input.sad").keydown(e) { 
     doSomeOtherProcessing(); 
     doStuff(this); 
    } 
} 

cevap

12

Kullanım applycall:

function handleEvent(event) { 
    $(this).removeClass("sad").addClass("happy"); 
} 

$("a.sad").click(handleEvent); // in this case, "this" is the anchor clicked 

function differentEvent(event) { 
    $("input.sad").keydown(e) { 
     doSomeOtherProcessing(); 
     handleEvent(e); // in this case, "this" will be the window object 
         // but I'd like to set it to be, say, the input in question 
    } 
} 
+3

Alternatif: bir argüman dizisi yerine bir dizi argüman iletmeniz dışında, apply() ile tam olarak aynı olan call() işlevini kullanın. (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Function/call) –

+1

apply() ve call() tam olarak aradığım şeydir (her ne kadar yukarıdaki kodun içinde olsa da, e) Çünkü Daniel'in dediği gibi,() bir dizi argüman alır). – Charles

+0

Düzeltme için teşekkürler. Cevabı güncelledim. –

4

Sadece ilgilendiğiniz işlevini parameterize.

handleEvent.call(this, e); 
+0

lolz: Ancak, ihtiyaçlarınıza bağlı olarak, bu element için tüm tıklama işleyicileri tetikleyecek jQuery'nin click() fonksiyonunun sıfır argüman sürümünü kullanmak daha sağlam olabilir. İyi iş çıkardın. – simplyharsh

+2

İnsanların bunu Patrick'in cevabıyla savunduğuna inanamıyorum, bu tam olarak orijinal soru için gerekli olan şey. JQuery, 'bu' anahtar kelimeyi çağırdığı kodda bu şekilde atar ve bunun nasıl yapılacağıdır. Bir fonksiyonun parametrelerini değiştirmek için, yerleşik ve yaygın olarak anlaşılan fonksiyonlar tarafından kolayca gerçekleştirilebilen bir şey, köpeğin sallanmasına neden olan kuyruğun bir örneğidir ... –

+2

Sanırım bu sadece bir sürü insanın var olduğunu gösteriyor. JavaScript'i guc etmeyin ve belki de jQuery gibi kütüphanelerin kullanımı onların cehaletini sağlamışlardır, çünkü dilin kendisini gerçekten anlamak için zaman ayırmazlar. –

1

Kullanım

e.target 
1

İşlevinizi bir jQuery eklentisi olarak yeniden belirlerken öneriyorum.

handleEvent.apply(this,e) //transfers this from one scope, to another 
+0

+1 Uygulanışı uygun görünüyor – annakata

+0

Neden jQuery eklentisi olarak refactoring, call() 'ı kullanmaktan daha iyi bir seçenek olabilir? – Charles

+0

Charles Çünkü o zaman tüm nesneleri (örneğin $ ("div")) handleEvent() veya $ (this) .handleEvent() gibi evrensel olarak kullanılabilir, ayrıca artı fonksiyonları zincirleme yapabilmek için ekstra fayda elde edersiniz . – duckyflip

0

sadece normal tetiklenen sanki tek bir olay işleyicisi çağırmak için arıyorsanız, apply/call iyi çalışır:

Ama burada hızlı bir düzeltme var. Ben sevdim ...

function differentEvent(event) { 
    $("input.sad").keydown(e) { 
     doSomeOtherProcessing(); 
     $(this).click(); // simulate a click 
    } 
} 
İlgili konular