2010-09-11 38 views
5

当一个非注册用户点击一个给定的按钮时,我想停止事件,收集他的oauth,收集他的电子邮件,如果我没有它,然后执行事件。优雅地通过多个回调传递“点击事件”

我想在JavaScript中做所有事情,因为这会让事情变得更加简单。

这是怎么了执行它,我有2个问题:

  1. 是否有这样做的多级回调的更优雅的方式?
  2. 我在最后触发事件的方式似乎是骇人听闻。什么可能是更好的方法来做到这一点?
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); 
    } 

回答

0

考虑存放在变量点击事件的回调。当用户点击按钮时,你的JS首先检查它是否被认证。如果是,它执行回调。如果不是,它会将回调作为参数传递给身份验证例程。当认证例程成功时,它可以执行回调。

+0

嗯,这就是我所做的 - 事件:事件,我把事件直接作为参数。问题是我如何将点击事件存储为变量并执行它。我找不到一个命令(event.XXX)来执行它 – 2010-09-11 21:49:51

1

什么是与此:

if (success = true) { 

你意识到这是设置全局变量“success”为true,是否正确?如果要检测变量“success”是否等于true,请使用以下代码:

if (success === true) { 

请注意3个等号。

做你的代码的严格翻译,我得到了这样的结果:

//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); 
    } 
}); 

如果你试图触发DOM事件,那么你就需要使用jQuery.trigger或相似。为了帮助更多,我需要更多关于您的计划的信息。