2012-02-04 19 views
22

Używam wyzwalacza nazywają się wartość z niestandardowego zdarzenia, ale chcę go zwrócić wartość oraz jej tylko daje mi object Object kiedy wykonać następujące połączenia:Jquery: Zwracanie wartości z wyzwalacza

var user_id=$("#my_div").trigger("get_id", [username]); 

Moja funkcja wyzwalania zdarzeń wygląda następująco:

$("#my_div").on("get_id", function(e, username){ 
    var user_id; 
    if (username='fred'){ 
     user_id=1; 
    } 
    else if(username='mario'){ 
     user_id=2; 
    } 
    return user_id; 
}); 
+0

możliwy duplikat [Użyj jQuery .trigger, aby wywołać niestandardową funkcję, która zwraca wartość] (http://stackoverflow.com/questions/3142724/use-jquery-trigger-to-call-a-ustom-funkcja- ta-zwraca-wartość-wartości) –

Odpowiedz

29

Nie można zwrócić wartość z wyzwalaczem, ale można przechowywać informacje na wiele różnych sposobów, jednym ze sposobów jest za pomocą obiektu jako parametr:

//event 
$("element").on("click", function(event, informationObj) { 
     informationObj.userId = 2; //you have to access a propery so you can modify the original object 
}); 
//trigger 
var informationObj = {userId : 0}; 
$("element").trigger("click", [informationObj ]); //informationObj.userId === 2 

Innym sposobem jest użycie jQuerys .data() metoda

//event 
$("element").on("click", function() { 
    $(this).data("userId", 2); 
}); 
//trigger 
$("element").trigger("click").data("userId") //2 

Inną rzeczą, jaką możesz zrobić, to modyfikując zmienną, która jest zadeklarowana poza zdarzenia, a następnie używając go po wywołaniu spust lub przechowywanie go jako właściwość w elemencie, który ma zdarzenie z this słów kluczowych takich jak to:

//inside the event function 
this.userId = 2; 

//outside the event 
$("element").trigger("click").get(0).userId 

Nadzieję, że to pomaga.

Edit:

Również spojrzeć na @Arm0geddon answer poniżej, używając .triggerHandler(), tylko uważaj, że ma pewne skutki uboczne, jak nie przepuszczając górę hierarchii DOM.

+0

Czy to działa z asynchronicznym ajaxem? –

+0

Nie sądzę .. –

1

funkcja trigger nie zwraca wartość powrocie z procedury obsługi zdarzeń.

Zwraca jQuery object ...

.trigger (EventType [, extraParameters]) Zwraca: jQuery

docs

ten został zaprojektowany tak można napisać takie rzeczy:

$("#my_div").trigger("get_id", [username]).val('foo').css('color', 'red'); 
+0

Dobrze, w takim razie czy jest jakiś sposób, że mógłbym wepchnąć go do obiektu Jquery'ego, żeby był dostępny? –

+0

@Petty_Crim. To nie będzie dobry pomysł, zapisz go w zmiennej lub ** ukryte dane wejściowe **. – gdoron

+0

Przypuszczam, że po prostu przypisać go do obiektu danych, tj. $ ("# My_div") .danych ("user_id", user_id), ale miałem nadzieję, że będzie alternatywne rozwiązanie. –

2

Wyzwalacz nie może zwrócić odpowiedzi, ponieważ jest to metoda wywołania zwrotnego.

Ponadto jQuery ma płynny API, więc .trigger() zawsze zwraca $(this).
Możesz napisać $("#my_id").trigger(something).show().on(someelse)...

22

To, co możesz zrobić, to użyć ".triggerHandler()" zamiast ".trigger()". To zwróci wartość. triggerHandler docs

var user_id=$("#my_div").triggerHandler("get_id", [username]); 
+6

To jest poprawna odpowiedź dla mnie. – Tim

+2

Po prostu uważaj, że 'triggerHandler' nie robi dokładnie tego samego co wyzwalacz, co może powodować niezamierzone błędy. Dokumenty opisują te różnice, tak jak nie propagują hierarchii DOM lub nie powodują domyślnego zachowania zdarzenia. – NicoSantangelo

1

Spróbuj tego:

$("#my_div").on("get_id", function(e, username){ 
    var user_id; 
    if (username='fred'){ 
     user_id=1; 
    } 
    else if(username='mario'){ 
     user_id=2; 
    } 
    return user_id; 
}); 

var user_id=$("#my_div").triggerHandler("get_id", ["username"]); 
0

triggerHandler jest poprawna odpowiedź, ale warto zauważyć, jak nie widziałem go tutaj jeszcze ... można przekazać innej zwrotnego wzdłuż, jak również i mieć funkcję "włącz", wywołać przekazywany oddzwonień, aby ustawić jakąś wartość zwracaną itp.zakładając, że lepiej nie czekać z jakiegoś powodu.

Powiązane problemy