2013-02-08 75 views
1

我正在使用jQuery驗證插件,它工作得很好。當jQuery驗證遠程失敗時打開模式

無論何時遠程ajax失敗,我都希望能夠顯示消息並觸發模式(示例中爲alert())。我無法弄清楚如何做到這一點。現在,它會按預期觸發alert(),但會附加錯誤消息「請解決此問題」,這應該是我自己的自定義錯誤消息。

下面是我得到了什麼:

$("#adresse-form").validate({ 

     errorElement: "span", 

     rules: { 

      navn: { 
       required: true, 
       minlength: 5, 
       maxlength: 25 
      }, 
      tlf: { 
       required: true, 
       digits: true, 
       minlength: 8, 
       remote: { 
        url: "/ajax/check_tlf", 
        type: "post" 
       } 
      } 
     }, 

     messages: { 

      navn: "Field Name is required", 
      tlf: { 
       required: "Field tlf is required!", 
       remote: function() { // i want to add the message aswell, not just the alert 

        alert("failed - tlf is already taken!"); 
       } 
      } 

     }, 
     submitHandler: function(form) { 
      doSomethingGreatOnSuccess(); 
     }, 

     errorPlacement: function (error, element) { 
      error.appendTo(element.parent()); 
     } 

    }); 

回答

1

這是我如何得到它的工作:

jQuery.validator.addMethod("avail",function(value,element){ 
    var isSuccess = true; 

    $.ajax({ 
     url: "/avail", 
     type: 'POST', 
     data: { tlf: value }, 
     async: false, 
     success: function (msg) { 
      isSuccess = msg === "true" ? true : false; 
      if (!isSuccess) { 
       $('#myModal').reveal(); 
      } 
     } 
    }); 
    // return isSuccess; 
}); 

而且在規則:

tlf: { 
       required: true, 
       digits: true, 
       minlength: 8, 
       avail: true 
      } 

以及消息:

tlf: { 
       required: 'Must enter phone number', 
       avail: 'Phone number is already taken!' 
      }, 

具有類似問題的人,我發現很多頗有幫助這裏:https://stackoverflow.com/a/2628442/839716

+0

+1,幹得好。也很好的詳細答案。 – Sparky 2013-02-08 23:49:43

2

我從來不知道一個消息可能是一個函數,通常一個消息是一個字符串。但是,正如您已經證明的那樣,消息可以是一個函數。您沒有看到消息的原因是如果消息是一個函數,它必須返回一個字符串

rules : {...} 
messages: 
{ 
    tlf: 
    { 
     required: "Field tlf is required!", 
     remote: function (val) 
     { 
      alert("failed - " + val + " is already taken!"); 
      return "remote validation failed"; 
     } 
    } 
} 
+0

雖然,你可能要構建的jsfiddle和第一測試了這一點...我有我的瀏覽器停留在一個無限循環使用這段代碼。 http://jsfiddle.net/zDxgA/ – Sparky 2013-02-08 14:51:11

+0

到目前爲止,我只在Safari瀏覽器中看到它......單擊「alert()」上的「OK」會無限觸發一個新的alert()。你無法擺脫循環。因此,在第二個想法中,我不會推薦在'message'中使用函數;至少不要用alert()。 – Sparky 2013-02-08 15:05:14

+0

它不應該是一個警報,而是觸發一個模式/彈出與一些信息。這會改變什麼嗎?就目前來看,在Chrome中,alert()只能工作一次,直到頁面重新加載。 – nielsiano 2013-02-08 15:07:52

2

報價OP評論:「返回的字符串每次的作品,但 .reveal()只觸發第一次,頁面加載後。」

我認爲你只能獲取模態一次,因爲Validate插件只構造一次消息(然後使用hide/show)。如果您希望每次都啓動,請嘗試使用highlight回調函數。配合使用onkeyuponfocusout設置爲false

onkeyup: false, 
onfocusout: false, 
highlight: function(element, errorClass) { 
    if ($(element).attr('name') === 'remotefieldname') { 
     $('#myModal').reveal(); 
    } 
} 

演示:http://jsfiddle.net/NFRvT/1/

+0

它仍然只會觸發alert()或reveal()一次。頁面加載,本地和jsfiddle示例。 – nielsiano 2013-02-08 15:28:22

+0

@nielsiano,看我的編輯。 'highlight'每次都會觸發,但是我再次陷入與Safari無限循環中。也許它會更適合你的模態。 – Sparky 2013-02-08 15:34:19

+0

我真的很感謝你的努力。現在它每次都會觸發,但是會繼續這樣做,即使第二個輸入正確並且不應該觸發錯誤。與模式或警報相同。 – nielsiano 2013-02-08 15:37:46