2012-01-13 128 views
1

我在用戶的設置區域有電子郵件字段。所有的電子郵件當然都是獨一無二的,所以我需要在提交表單之前檢查電子郵件是否已被別人使用。jQuery ajax:如果ajax驗證失敗,如何銷燬提交?

下面是代碼:

var email = $("input#email-id").val(); 

$("#form-id").submit(function(){ 
    $.ajax({ 
     url: "/ajax/email?email=" + email, 
     success: function(data){ 
      if(data != 'ok'){ 
       alert("Email is used already"); 
       return false; 
      } 
     } 
    }); 
}); 

所以,如果data不是'ok'必須摧毀提交表單,因爲if()回報false,但它不會與表單提交和往常一樣,甚至沒有按警報」 t出現!

我檢查了ajax答案,它工作正常(如果使用電子郵件,則返回'user_already')。 那麼我做錯了什麼?

謝謝!

+2

爲什麼要將AJAX與標準表單提交結合使用?只需選擇一個或另一個。 – maxedison 2012-01-13 18:41:53

+1

@ maxedison因爲應用程序應該在沒有JavaScript的情況下運行? – Behrang 2012-01-13 18:45:49

回答

5

由於ajax是異步的,你不能這樣做。如果你真的想這樣做,你可以在成功處理程序中提交表單。嘗試這個。

function submitHandler(){ 
    var email = $("input#email-id").val(); 

    $.ajax({ 
     url: "/ajax/email?email=" + email, 
     success: function(data){ 
      if(data != 'ok'){ 
       alert("Email is used already"); 
       return false; 
      } 
      else{ 
       //Once the data is ok you can unbind the submit handler and 
       //then submit the form so that the handler is not called this time 
       $("#form-id").unbind('submit').submit(); 
      } 
     } 
    }); 
    return false;//This will prevent the form to submit 
} 
$("#form-id").submit(submitHandler); 
+0

它工作的很好!非常感謝。 – 2012-01-13 18:57:42

+0

hi shankar我已經嘗試過了,但由於ajax的知識水平不高,它不工作,請在js小提琴中使用它,它會幫助像我這樣的新手 – 2014-07-18 10:19:55

1

這是因爲檢查電子郵件的Ajax請求是異步的。在提交事件處理程序完成之前它不會完成。你必須這樣做:

$('#form-id').submit(function() { 

    if($(this).data('valid')) { 
     //you've already validated, allow the form to submit 
     return true; 
    } else { 
     //send an ajax request and wait for the response to really submit 
     $.ajax({ 
      url: "/ajax/email?email=" + email, 
      success: function(data){ 
       if(data == 'ok') { 
        //submit the form again, but set valid data so you don't do another Ajax request 
        $('#form-id').data('valid', true); 
        $('#form-id').submit(); 
       } else { 
        alert("Email is used already"); 
       } 
      } 
     }); 
     return false; 
    } 

    //clear the validation flat 
    $(this).data('valid', false); 

}); 
+1

使用'$ .data'方法比'.data快得多()',檢出這個JSPerf:http://jsperf.com/jquery-data-vs-jqueryselection-data/17 – Jasper 2012-01-13 19:00:38

+0

很好的知道,謝謝。 – alexp 2012-01-13 19:03:21

1

有一個公認的答案,但我想我會分享另一種方式來做到這一點。

您可以使用一個額外的參數與.trigger()功能首先測試用戶的電子郵件,並且如果它回來用,則重新觸發提交事件,但設置一個標誌,沒有檢查用戶名:

$("#form-id").submit(function(event, forceSubmit){ 

    //the normal submit will not have the extra parameter so we need to initialize it to not throw any errors, 
    //typeof is great for this since it always returns a string 
    if (typeof(forceSubmit) == 'undefined') { forceSubmit = false; } 

    //now check if this is a normal submit or flagged to allow submission 
    if (forceSubmit === false) { 
     var $form = $(this); 
     $.ajax({ 
      url: "/ajax/email?email=" + email, 
      success: function(data){ 
       if(data != 'ok'){ 
        alert("Email is used already"); 
       } else { 
        $form.trigger('submit', true); 
       } 
      } 
     }); 

     //since this submit event is for checking the username's availability we return false to basically: event.preventDefault(); event.stopPropagation(); 
     return false; 
    } 
}); 

.trigger()http://api.jquery.com/trigger

0

如果JSON參與,返回的數據是data.d - 看到http://encosia.com/a-breaking-change-between-versions-of-aspnet-ajax/一個解釋。

+0

我是否錯過了一些東西,或者這是爲asp.net JSON響應?問題中的服務器響應似乎正在返回純文本。 – Jasper 2012-01-13 19:04:32

+0

@Jasper我錯了 - 我花了很長時間查找錯過的東西,當我這樣做時提供了更多的答覆和正確的答案。如果我刪除了我的不正確答案,那麼此評論和您的評論是否會消失,還是值得讓需要使用數據的人員使用? – 2012-01-13 20:37:43

+0

如果您覺得您的回答有實用信息,請將其保留,否則當您刪除答案時,只有擁有10,000名以上代表的用戶才能看到該信息(以及評論)。儘管這個問題並沒有引用JSON的任何地方,而這正是你的答案發揮的地方。 – Jasper 2012-01-13 20:40:20

0

在你的代碼中你有兩個函數。一個是傳遞給submit功能:

$("#form-id").submit(function() { 
    // code 
}); 

另一個是傳遞給Ajax調用成功處理程序的功能:

success: function(data) { 
    // code 
} 

您從第二函數返回false。這意味着當第一個函數返回時,它不會返回false。但是,只有第一個函數返回false,表單提交纔會停止。

你應該做的是讓函數傳遞給submit總是返回false並以編程方式處理提交。

此代碼可以幫助您實現這一點:

var submitHandler = function() { 
    $.ajax({ 
     url: "/ajax/email?email=" + email, 
     success: function(data) { 
      if (data != 'ok') { 
       alert("Email is used already"); 
       // no need to do anything here 
      } else { 
      // success, we should submit the form programmatically 
      // first we de-attach the handler, so that submitHandler won't be called again 
      // and then we submit 
      $("#form-id").unbind('submit').submit(); 
      // now we reattach the handler, so that submit handler is executed if the user 
      // submits the form again 
      $("#form-id").submit(submitHandler); 
      } 
     } 
    }); 

    // always return false, because if validation succeeds, we will submit the 
    // form using JavaScript 
    return false; 
}; 

$("#form-id").submit(submitHandler); 
0

我已經+1 @ShankarSangoli,因爲他這樣做是正確不過,我不覺得它的100%完成的還有一個錯誤狀態,可以在網絡問題或服務器故障時發生。

$('#form-id').submit(function(ev) { 
    ev.preventDefault(); // cancels event in jQuery typical fashion 
    $.ajax({ 
     url: "/ajax/email", 
     data : { email: $("input#email-id").val()}, 
     success : function(d) { 
      if (d !== 'ok') { 
       alert('email in use'); 
      } 
     }, 
     error : function(a,b,c) { 
      // put your error handling here 
      alert('a connection error occured'); 
     } 
    }); 
}); 

甚至有更好的方法來處理這個問題,因爲我已經寫了jQuery的一些偉大形式的插件是兼容HTML5和對手的jQuery工具的易用性。

你可以在這裏看到一個例子 - >http://www.zipstory.com/signup

編碼愉快。

+0

爲什麼-1?誰是dat? – 2012-01-13 19:35:53