JQuery Validation插件:使用带有延迟的远程

时间:2016-06-20 12:56:21

标签: php jquery ajax validation

我正在使用来自remote methodjQuery validation plugin进行ajax调用。每次在输入字段中按下键时,都会激活远程功能。我想添加一个延迟,以便只有当用户停止按键几毫秒时才会触发ajax请求。

此问题于2012年at GitHub提出,但2015年由开发人员关闭:

  

我很抱歉在这个问题上缺乏活动。而不是离开   它打开了,我决定不试图关闭旧问题   解决这些问题,以便更长时间地给人以错误的印象   最终解决了。

在论坛中,用户lohfu提出了以下解决方案:

$.validator.methods._remote = $.validator.methods.remote;

var timer = 0;
$.validator.methods.remote = function () {
    clearTimeout(timer);

    var args = arguments;

    timer = setTimeout(function() {
        $.validator.methods._remote.apply(this, args);
    }.bind(this), 500);

    return "pending";
};

然而,有两个主要问题:

  1. 不起作用。如果我添加延迟并且远程函数返回false,则表单仍然会被提交。

  2. 当我在输入字段中输入导致远程功能出错的内容时,它会正确地分配class="error"。如果我现在选择不同的输入,class="error"会切换到class="valid",尽管错误消息仍然存在且仍显示错误消息。当我按提交时也是如此。

  3. 这是一个最小的例子:

    HTML

    <form action="test.php" method= "POST" id="form">
        Name:  <input type="text" name="name"><br>
        Email:  <input type="email" name="email"><br>
        <input type="submit">
    </form>
    

    JS

        $("#form").validate({
         rules: {
           name: "required",
           email: {
             required: true,
             email: true,
             remote: {
               url: "ajax.php",
               type: "post"
             }
           }
         },
         messages: {
           email: {
             remote: "Email already exists"
           }
         }
       });
    

    ajax.php

    <?php
    header('Content-Type: application/json');
    
    $valid = null;
    
    echo json_encode($valid);
    

    永远不要提交此表单,因为ajax.php始终返回false。但是,输入姓名和有效的电子邮件将提交表单,尽管错误&#34;电子邮件已经存在&#34;显示。

1 个答案:

答案 0 :(得分:0)

以下小提琴是否按预期工作? 您可以将网址更改为true或false:

url: '/echo/js/?js=[null|true|false]',

https://jsfiddle.net/ww0zh9jm/2/

..你必须广告外部资源(Fiddle删除它们): https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js https://ajax.aspnetcdn.com/ajax/jquery.validate/1.15.0/jquery.validate.min.js