2009-05-27 7 views
5

Używam jQuery i mam funkcję, która służy jako wywołanie zwrotne zdarzenia, a więc w tej funkcji "to" reprezentuje obiekt, który przechwycił zdarzenie. Istnieje jednak przypadek, w którym chcę wywołać funkcję jawnie z innej funkcji - jak ustawić, co "to" będzie równe w funkcji w tym przypadku?Podczas wywoływania funkcji JavaScript, jak ustawić niestandardową wartość "to"?

Na przykład:

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 
    } 
} 

Odpowiedz

12

Zastosowanie applycall.

handleEvent.call(this, e); 
+3

Alternatywa: użyj funkcji call(), która jest dokładnie taka sama jak apply(), z wyjątkiem podania serii argumentów zamiast tablicy argumentów. (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Function/call) –

+1

apply() i call() są dokładnie tym, czego szukałem (chociaż w powyższym kodzie odpowiedzi powinno być [ e], ponieważ, jak powiedział Daniel, apply() przyjmuje szereg argumentów). – Charles

+0

Dzięki za poprawkę. Zaktualizowałem odpowiedź. –

4

Wystarczy parametryzacji funkcji, które Cię interesują:

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); 
    } 
} 
+0

lolz ... Podobało mi się to. Fajna praca. – simplyharsh

+2

Nie mogę uwierzyć, że ludzie przejęli to przez odpowiedź Patricka, co jest dokładnie tym, czego potrzeba do pierwotnego pytania. W ten sposób jQuery przypisuje słowo kluczowe "this" w kodzie, który wywołuje, i powinno to być, jak to się robi. Aby zmienić parametry funkcji, aby pomieścić coś, co jest łatwe do wykonania przez wbudowane i powszechnie rozumiane funkcje, jest przypadek machania ogonem psa ... –

+2

Myślę, że to po prostu pokazuje, że jest wiele osób, które nie grokuj JavaScript i być może korzystanie z bibliotek takich jak jQuery zapewniło ich ignorancję, ponieważ nie potrzebują czasu, aby naprawdę zrozumieć język. –

1

Chciałbym doradzić, aby ponownie rozważyć swoją funkcję wtyczki jQuery.

Ale oto szybkie Fix:

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

+1 zastosowanie wydaje się odpowiednie – annakata

+0

Dlaczego refaktoryzacja jako wtyczka jQuery byłaby lepszą opcją niż przy użyciu funkcji call()? – Charles

+0

Charles, ponieważ wtedy może być używany uniwersalnie na wszystkich obiektach jquery, takich jak $ ("div"). HandleEvent() lub $ (this) .handleEvent(), dodatkowo dostaniesz dodatkową korzyść z możliwości łączenia funkcji . – duckyflip

0

Jeśli jesteś po prostu patrząc zadzwonić jeden obsługi zdarzenia tak, jakby były uruchamiane normalnie apply/call będzie działać dobrze. Jednakże, w zależności od potrzeb, może być bardziej wytrzymałe, aby korzystać z wersji zerowej argument click() funkcję jQuery, która wyzwoli wszystkie kliknięcia ładowarki dla tego elementu:

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