2013-02-08 36 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