2013-08-28 97 views
7

我有以下驗證設置的一種形式:嘗試設置自定義的驗證消息的jQuery遠程

$('#form').validate({ 
      onfocusout: false, 
      onkeyup: false, 
      onclick: false, 
      success: function(){ 
       $('#username').addClass('input-validation-confirmation'); 
      } 
     }); 
$('#username').rules("add", { 
     onfocusout: false, 
     onkeyup: false, 
     required: true, 
     email: true,      
     remote: { 
      url: function, 
      type: 'GET', 
      dataType: 'json', 
      traditional: true, 
      data: { 
       username: function() { 
        return $('#username').val(); 
       } 
      }, 
      dataFilter: function (responseString) { 
       var response = jQuery.parseJSON(responseString); 
       currentMessage = response.Message; 
       if (response.State == 0) { 
        currentMessage = currentMessage + 0; 
           return false; 
       } 
       return 'true'; 
      }, 
      beforeSend: function (response) { 
       showLoadingIndicator($('#username')); 
      }, 
      complete: function() { 
       hideLoadingIndicator($('#username')); 
      } 
     } 
}); 

什麼,這是試圖做的是使用相同的驗證元素(爲了與其他一些工作框架)顯示錯誤和成功方法。

我的問題是,我的統治的成功方法被炒魷魚之前,在遠程驗證已完成。我嘗試了幾種方式設置消息,但自定義消息參數似乎沒有在驗證成功時調用。

是否使用遠程和模式驗證規則的混合時,任何人都知道的其他方法使用驗證錯誤場成功和錯誤信息?

編輯:

現在我明白我是在錯誤的時間期待一個成功的事件。我需要在驗證完成後觸發的事件(未提交)。有沒有這樣的事件?

+0

我假設你使用http://jqueryvalidation.org/?如果是這樣,它看起來像[遠程方法](http://jqueryvalidation.org/remote-method)是基於每個字段的,並且應該是要觸發遠程檢查的字段的子節點。 。 。 – ernie

回答

5

你的代碼...

$('#username').rules("add", { 
    onfocusout: false, 
    onkeyup: false, 
    required: true, 
    email: true,      
    remote: { ... }, 
    messages: { ... }, 
    success: function (label) { ... } 
}); 

這裏的問題是,onfocusoutonkeyupsuccess不是 「規則」。只有個別「規則」和messages選項可以放在.rules('add')方法的內部。

$('#username').rules("add", { 
    required: true, 
    email: true,      
    remote: { ... }, 
    messages: { 
     remote: "custom remote message" 
    } 
}); 

.rules()方法見文檔:http://jqueryvalidation.org/rules

onfocusoutonkeyupsuccess是 「選項」,只有去.validate()方法,其僅附接到<form>元件的內部。

remoteAs per the docs的「自定義」消息而言,此錯誤消息將自動成爲從您的服務器返回的消息......沒有特殊設置。


編輯按意見和更新OP:

您的代碼:

$('#form').validate({ 
     onfocusout: false, 
     onkeyup: false, 
     onclick: false, 
     success: function(){ 
      $('#username').addClass('input-validation-confirmation'); 
     } 
}); 

你說:「不過,隨着更新的代碼(見上文)我從來沒有看到成功事件。」

您已停用所有的這種形式的活動。觸發驗證的唯一事件是點擊提交按鈕。究竟你希望「看到」 success斷火?

DEMOhttp://jsfiddle.net/xMhvT/

換句話說,submit是唯一的事件留給觸發時,您禁用了所有其他事件驗證測試。


編輯基於另一個OP更新:

「現在我明白我是在錯誤的時間期待一個成功的事件我 需要一次驗證已經完成了被觸發的事件(不提供 ),有沒有這樣的事件?「

success不是「事件」。 「事件」是一個clickblurkeyup等(onkeyuponfocusoutonclick是控制這個插件的事件選項)

success是「回調函數」。一個「回調函數」是上發生的事件。

•如果您需要一個「回調函數」,每當字段通過驗證時觸發,則可以使用success

•如果您需要在表單通過驗證時觸發的「回調函數」,則可以使用submitHandler。但是,這也是表單提交時的情況。

•如果您想要「測試」整個表單或單個字段以查看它是否有效而不提交表單,則可以使用.valid()「方法」。

$('#username').valid(); // for one field 

// or 

$('#form').valid(); // for the whole form 

// you can also... 

if ($('#form').valid()) { 
    //do something if form is valid 
} 

此方法將觸發測試(顯示消息)並返回一個布爾值。

DEMOhttp://jsfiddle.net/xMhvT/1/

參見:http://jqueryvalidation.org/valid/

+0

是的,那是最古怪的事情。我原本在validate()函數上設置了成功,但根本沒有被調用。我把它移到了規則調用中,因爲我可以。那是什麼時候開始被召喚的。 –

+0

@PaulSachs,也許你在'.validate()'中做了一些其他的錯誤。 '成功'也是插件核心功能的一部分。當插件運行時,無論您是否聲明,「成功」仍將被解僱。否則,除了展示使用此插件及其方法的正確方法外,我不知道還有什麼可以幫助您。 – Sparky

+0

@PaulSachs,在'rules()'方法中放入'success'就完全破壞了插件。它是在頁面加載和字段無效時觸發的:http://jsfiddle.net/9AfLa/ – Sparky

1

我遲到回答這個問題,但我認爲它可以幫助別人:

在你的PHP

只需要添加以下

if($rows_matched==1){ 
      echo (json_encode(false)); 
     } 
     else{ 
      echo (json_encode(true)); 
     } 

並在您的js代碼中寫入以下內容: $(function(){

$('#product_add').validate({ 
rules:{ 
    product_sku:{ 
    remote:{ 
     url:'check.php', 
     type:'POST' 
    } 
    } 
}, 
messages:{ 
    product_sku:{ 
    remote:'already in database' 
    } 
} 
}); 

});

4

使用remotedataFiltermessages參數如下:

var message = 'Default error message'; 

$('form').validate({ 
    rules: { 
     element1: { 
      remote: { 
       url: '/check', 
       type: 'post', 
       cache: false, 
       dataType: 'json', 
       data: { 
        element2: function() { 
         return $('.element2').val(); 
        } 
       }, 
       dataFilter: function(response) { 
        response = $.parseJSON(response); 

        if (response.status === 'success') return true; 
        else { 
         message = response.error.message; 
         return false; 
        } 
       } 
      } 
     } 
    }, 
    messages: { 
     element1: { 
      remote: function(){ return message; } 
     } 
    } 
}); 
相關問題