2010-10-13 15 views
5

Mam funkcję, która jest procedurą obsługi zdarzeń JQuery. Ponieważ jest to moduł obsługi zdarzeń JQuery, używa zmiennej this, aby odnieść się do obiektu, w którym jest wywoływana (co jest normalne dla tej biblioteki).Jak mogę przedefiniować `this` w JavaScript?

Niestety, muszę ręcznie wywołać tę metodę w tym momencie. Jak sprawić, aby this w wywołanej funkcji zachowywał się tak, jakby był wywoływany z JQuery?

Przykładowy kod:

function performAjaxRequest() { 
    //Function which builds AJAX request in terms of "this" 
} 

function buildForm(dialogOfForm) { 
    var inputItem; 
    dialogOfForm.html('...'); 
    dialogOfForm.dialog('option', 'buttons', { 
     "Ok" : performAjaxRequest 
    }); 
    inputItem = dialogOfForm.children(':not(label)'); 
    //Redirect enter to submit the form 
    inputItem.keypress(function (e) { 
     if (e.which === 13) { 
      performAjaxRequest(); //Note that 'this' isn't the dialog box 
            //as performAjaxRequest expects here, it's 
            //the input element where the user pressed 
            //enter! 
     } 
    } 
} 

Odpowiedz

8

Jeśli dialog jest obiekt, który trzeba ustawić na this następnie:

performAjaxRequest.apply(dialog, []); 
// arguments (instead of []) might be even better 

powinno załatwić sprawę.

W przeciwnym razie, w jQuery można po prostu wywołać metodę trigger na element, który chcesz mieć ustawiony this

Załóżmy na przykład, że chcesz mieć zdarzenie click zdarzyć na przycisku i trzeba to się stało teraz. Wystarczy zadzwonić: zostanie wywołany

$("#my_button").trigger("click"); 

Twoje #my_button „s click Wózek i this zostanie ustawiona na elemencie #my_button.

Jeśli chcesz wywołać metodę z inną this ... powiedzmy na przykład, z this odnosząc się do samego obiektu jQuery, a następnie będziemy chcieli użyć call lub apply na swojej funkcji.

Chuck i Meder już wam przykłady każdy ... ale mieć wszystko w jednym miejscu:

// Call 
my_function.call(object_to_use_for_this, argument1, argument2, ... argumentN); 

// Apply 
my_function.apply(object_to_use_for_this, arguments_array); 

SEE: A List Apart's Get Out of Binding Situations

+0

Załóżmy, że nie mam przydatnego odniesienia do faktycznego wydarzenia lub elementu, na którym wydarzenie zostanie wystrzelone. –

+0

@Billy ... więc chcesz wywołać zdarzenie zmiennej na zmiennym obiekcie lub zestawie obiektów? Jeśli tak, jak wygląda ogólny kod? Co * robisz * wiesz w momencie, w którym chcesz wywołać to, co chcesz wywołać? –

+0

Właśnie zaktualizowałem pytanie - daj mi znać, jeśli to pomoże. –

10

Można użyć funkcji za call metody.

someFunction.call(objectToBeThis, argument1, argument2, andSoOnAndSoOn); 
+1

+1 do pierwszej odpowiedzi, która odpowiada na najbardziej bezpośredni problem, jaki mi zadał. Checkmarked @ Sean's answer po prostu dlatego, że jest bardziej kompletny. –

3

Szukasz ..

functionRef.apply(objectContext, arguments); 
+1

+1 - Również dobra odpowiedź, chociaż odpowiedź @ Chucka bardziej bezpośrednio robi to, czego szukałem. –

0

korzystanie zamknięcie tj przypisać to, że na początku; możesz z nim zrobić to, co lubisz.

var that = this; 
+0

Zobacz mój przykładowy kod. Zwróć uwagę, że funkcja event jest wywoływana z dwóch miejsc. Jak zaproponować rozwiązanie tego z zamknięciem bez powielania treści 'performAjaxRequest'? –

1

Należy oczywiście nauczyć się opanowania call() i apply() jak ludzie podaną ale trochę pomocnik nie boli ...

w jQuery istnieje $.proxy.W czystych js, można ponownie utworzyć ten niftyness;) coś jak:

function proxyFn(fn , scope){ 
    return function(){ 
    return fn.apply(scope,arguments); 
    } 
} 

Przykłady użycia:

var myFunctionThatUsesThis = function(A,B){ 
    console.log(this,arguments); // {foo:'bar'},'a','b' 
}; 

// setTimeout or do Ajax call or whatever you suppose loses "this" 

var thisTarget = {foo: 'bar'}; 
setTimeout(proxyFn(myFunctionThatUsesThis, thisTarget) , 1000 , 'a', 'b'); 

// or... 

var contextForcedCallback = proxyFn(myAjaxCallback , someObjectToBeThis); 
performAjaxRequest(myURL, someArgs, contextForcedCallback); 

Jeśli nie nadużywać go, jest to narzędzie najpewniejszy nigdy tracić zakres "tego".

+0

Przepraszam, pierwotna funkcja, którą podałem zawierała mentalny lapsus. Zostało ono zaktualizowane do poprawnej wersji. – Quickredfox

Powiązane problemy