2012-02-04 3 views
22

Sto usando chiamare un trigger un ottenere un valore da evento personalizzato, ma voglio che restituisce un valore e il suo unico avermi dato oggetto Object quando faccio la seguente chiamata:Jquery: Tornando Valore Da trigger

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

mia funzione trigger event è simile al seguente:

$("#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

possibile duplicato di [Utilizzare jQuery .trigger per chiamare una funzione personalizzata che restituisce un valore] (http://stackoverflow.com/questions/3142724/use-jquery-trigger-to-call-a-custom-function- that-returns-a-value) –

risposta

29

Non è possibile restituire un valore da un trigger, ma è possibile memorizzare le informazioni in molti modi diversi, un modo è utilizzando un oggetto come parametro:

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

altro modo è usare jQuerys .data() metodo

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

Un'altra cosa che puoi fare è modificare una variabile che viene dichiarata al di fuori della manifestazione e poi di usarlo dopo aver chiamato il grilletto, o immagazzinarla come una proprietà in l'elemento che ha l'evento con la parola chiave this in questo modo:

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

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

Speranza che aiuta.

Edit:

Inoltre, dare un'occhiata a @Arm0geddon answer di seguito, utilizzando .triggerHandler(), state attenti che ha alcuni effetti collaterali, come se non zampillante la gerarchia DOM.

+0

Funzionerà con ajax asincrono? –

+0

Io non la penso così .. –

1

la funzione trigger non restituisce il valore si torna dal gestore di eventi.

Esso restituisce jQuery object ...

.trigger (EventType [, ExtraParameters]) restituisce: jQuery

docs

Questo è stato progettato in modo si potrebbe scrivere cose come questa:

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

Ok bene, in quel caso c'è un modo in cui potrei inserirlo nell'oggetto Jquery in modo che sia accessibile? –

+0

@Petty_Crim. Non sarà una buona idea, salvalo in una variabile o in un ** input nascosto **. – gdoron

+0

Suppongo di averlo assegnato a un oggetto dati, ad esempio $ ("# my_div"). Data ("user_id", user_id) ma speravo che ci sarebbe stata una soluzione alternativa. –

2

Un trigger non può restituire una risposta, perché è un metodo di callback.

Inoltre jQuery ha un'API fluida, quindi .trigger() restituisce sempre $(this).
È possibile scrivere $("#my_id").trigger(something).show().on(someelse)...

22

Quello che puoi fare è usare ".triggerHandler()" invece di ".trigger()". Questo è restituirà un valore. triggerHandler docs

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

Questa è la risposta corretta per me. – Tim

+2

State attenti che 'triggerHandler' non fa esattamente la stessa cosa del trigger, che può causare bug non intenzionali. I documenti coprono queste differenze, come non fare bolle nella gerarchia DOM o non causare il comportamento predefinito di un evento. – NicoSantangelo

1

Prova questo:

$("#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 è la risposta corretta, ma vale la pena notare come non ho ancora visto qui ... È possibile passare un altro richiamata avanti pure, e avere la funzione "on" chiama il callback passato per impostare un valore di ritorno ecc.supponendo che è meglio non aspettare per qualche motivo.