2010-09-11 8 views
5

Cuando un usuario no conectado hace clic en un botón determinado, quiero detener el evento, recopilar su oauth, recopilar su correo electrónico si no lo tengo y luego ejecutar el evento.Pasar elegantemente un "evento de clic" a través de varias devoluciones de llamada

Quiero hacer todo en javascript porque eso mantendría las cosas mucho más simples.

Esta es la forma en que estoy ejecutando la misma, y ​​tengo 2 preguntas:

  1. ¿Existe una forma más elegante de hacer las devoluciones de llamada de múltiples niveles?
  2. La forma en que estoy desencadenando el evento al final parece hackish. ¿Cuál podría ser una mejor manera de hacerlo?
jQuery("a.callbacktesting").click(function(event){ 

    if (success==false){ 
     event.preventDefault(); 
     event.stopImmediatePropagation(); 
     authentication({endevent:event,followup:afterEmail},collectEmail, failFn); 
    } 
    }); 

    //1st level function 
    function authentication(params, successFn, failFn){ 
     if (success=true){ 
     successFn(params,params.followup,failFn); 
     }else{ 
     failFn(); 
     }  
    } 

    //2nd level function 
    function collectEmail(params, successFn, failFn){ 
     console.log("Collecting email"); 
     if (success=true){ 
     successFn(params); 
     }else{ 
     failFn(); 
     }; 
    } 

    //After everything is done, you want to execute this 
    function afterEmail(params){ 
    jele=$(params.endevent.currentTarget) 
    action=params.endevent.type 
    jele.trigger(action); 
    } 

Respuesta

0

considere almacenar su evento de devolución de llamada clic en una variable. Cuando el usuario hace clic en el botón, su JS primero verifica que esté autenticado. Si es así, ejecuta la devolución de llamada. Si no es así, pasa la devolución de llamada a la rutina de autenticación como argumento. Cuando la rutina de autenticación es exitosa, puede ejecutar la devolución de llamada.

+0

Hmmm, eso es lo que hice - endevent: event, puse el evento directamente como un param. El problema es cómo puedo almacenar el evento click como una variable y ejecutarlo. No puedo encontrar un comando (event.XXX) para ejecutarlo –

1

¿Qué pasa con esto:

if (success = true) { 

?

Te das cuenta de que es configuración la variable global "éxito" en verdadero, ¿correcto? Si desea detectar si la variable "éxito" es igual a true, utilice esto:

if (success === true) { 

Nota las 3 marcas iguales.

haciendo una traducción estricta de su código, que tiene el siguiente resultado:

//After everything is done, you want to execute this 
function afterEmail(event) { 
    $(event.currentTarget).trigger(event.type); 
} 

//2nd level function 
function collectEmail(event) { 
    console.log("Collecting email"); 
    if (success === true){ 
     afterEmail(event); 
    } else { 
     failFn(); 
    } 
} 

//1st level function 
function authentication(event) { 
    if (success === true) { 
     collectEmail(event); 
    } else { 
     failFn(); 
    } 
} 

jQuery("a.callbacktesting").click(function (event) { 
    if (success === false) { 
     event.preventDefault(); 
     event.stopImmediatePropagation(); 

     authentication(event); 
    } 
}); 

Si usted está tratando de desencadenar eventos DOM, entonces usted tendrá que utilizar jQuery.trigger o similar. Necesitaré más información sobre su programa para ayudar más.

Cuestiones relacionadas