2011-02-04 84 views
0

我做了什麼本質上是一個燈箱,由此,如果更改需要用戶確認他們的密碼之前,這個燈箱彈出,用戶輸入密碼有等使用Javascript - 等待點擊結束功能

我觸發功能是這樣的:

if(verifyPassword()) 
{ 
    //apply change 
} 

的驗證功能:

function verifyPassword() { 
$('#confirmpasswordoverlay').fadeIn(300); 

$('#submit').click(function() { 
    $.post('', { password: $('input[name=password]').val() }, 
      function(check) { 
       if(check.error) 
       { 
        if(check.password) 
        { 
         //show password error 
         return false; 
        } 
        else 
        { 
         //show error 
         return false; 
        } 
       } 
       else 
       { 
        return true; 
       } 
      }, 'json'); 
}); 

} 

基本上我需要的功能要等到#submit是點擊返回true或false。

在此先感謝

回答

2

因爲jQuery的1.5.0,你可以做一些應用與魔法Deferred objects

$.when(verifyPassword()).done(function() { 
    // do something 
}); 

你會需要重新寫一點verifyPassword()

function verifyPassword() { 
    var Notify = $.Deferred(); 
    $('#confirmpasswordoverlay').fadeIn(300); 

    $('#submit').click(function() { 
     $.post('', { password: $('input[name=password]').val() }, 
       function(check) { 
        if(check.error) { 
         if(check.password) { 
          //show password error 
          Notify.resolve(); 
         } 
         else { 
          //show error 
          Notify.reject(); 
         } 
        } 
        else { 
         return true; 
        } 
       }, 'json'); 
     }); 

    return Notify.promise(); 
} 

這可能不會在這裏實現你的目標的最優雅的方式,我只是說你可以做在這樣:-)

+0

我回家測試這個,從來不知道這個技術。看起來很有趣。 – Pablo 2011-02-04 21:54:31

2

不要拖延,而不是提供一個回調:

function verifyPassword(f) { 
    /** 
    * Do all your logic here, then callback to the passed function 
    */ 
    f(result); 
} 
verifyPassword(function (correct) { 
    if (correct) { 
     /* Continue */ 
    } 
    else { /* Other */ } 
}); 
+0

它不會工作,因爲`$ .post`不會返回任何東西到父函數。他確實需要一個新的函數,他可以從`$ .post`回調函數中調用 – Pablo 2011-02-04 21:49:24

+0

@Pablo:我省略了`$ .post`代碼,`f(result)`會從中回調。 – 2011-02-04 21:56:19

0

我想你想轉換您的通話$.post()方式進入更通用的$.ajax() jQuery調用,並通過async: false。例如:

$.ajax('', { async:false, data: {password:...}, success: function() { 
    // ... success callback ... 
}});