将自定义消息应用于远程验证时,JQuery验证未捕获typeError

时间:2013-11-09 13:30:10

标签: jquery jquery-validate

我正在尝试使用jqueryvalidation.org plugin.

远程验证服务器上是否已存在字符串

这是我的jQuery代码:

$("#title").rules("add", {
    "remote": {
        url: checkTitleAvailable.php,    // echoes "true" or "false"
        type: "post",
        data: {
            proposedSeoTitle:function() {
                return $('#title').val();
            }
        },
        complete: function(response) {
            if (response.responseText != "true" && response.responseText != "false") {
                alert("unexpected response " + response.responseText);
            }
            return response;
        }
    },
    "messages": {"remote": "That title already exists"}
});

('title'是输入字段,id =“title”class =“required”)

我收到错误消息:

  

“未捕获的TypeError:无法调用未定义的方法'调用'。”

"messages"被视为另一条规则,但没有运行的功能。然而它仍然被视为一条消息,并且往往会弹出它,但错误会使整个系统无法使用 - 在保存之前无法验证整个页面。

我做错了什么,或者这是Validation插件中的错误?有一些解决方法吗?我是否应该破解插件以使其正常工作?

1 个答案:

答案 0 :(得分:1)

引用OP:

  

'title'是id="title" class="required"

的输入字段

即使您使用.rules('add')方法在字段上声明规则,插件仍然要求每个输入字段都有(唯一name属性。这是插件跟踪输入的方式。

请参阅Reference Docs page ...

标记建议部分
  

输入元素的name属性是'required',如果没有它,验证插件就无法工作。


您的代码:

"remote": {
    url: checkTitleAvailable.php,    // echoes "true" or "false"
    type: "post",
    data: {
        proposedSeoTitle:function() {
            return $('#title').val();
        }
    },
    complete: function(response) {
        if (response.responseText != "true" && response.responseText != "false") {
            alert("unexpected response " + response.responseText);
        }
        return response;
    }
}

我不确定你在这里使用complete回调试图做什么。插件的remote规则会自动评估服务器的响应,但您还在评估响应是否为布尔值并返回响应。

As per the documentationremote方法正在为经过验证的字段查找true。或者,当服务器响应为falseundefinednull或字符串时,它将被评估为无效字段,其中字符串本身会覆盖默认错误消息。鉴于插件已经评估了服务器响应,您永远不需要使用complete回调手动评估响应。否则,您也可以从头开始编写自己的remote方法,而不是使用插件中的方法。

  

通过jQuery.ajax(XMLHttpRequest)调用serverside资源   获取与已验证的名称对应的键/值对   元素及其作为GET参数的值。 响应评估为   JSON,对于有效元素必须为true,并且可以是任何false,   使用默认消息,undefinednull表示无效元素;要么   一个字符串,例如。 “这个名字已经被采用,请尝试peter123”   显示为错误消息。

删除complete回调,看看会发生什么。

remote: { // <-- quotation marks not required.
    url: checkTitleAvailable.php,    // echoes "true" or "false"
    type: "post",
    data: {
        proposedSeoTitle:function() {
            return $('#title').val();
        }
    }
},
messages: { // <-- quotation marks not required.
    // quotation marks not required around `remote`.
    remote: "That title already exists"
}

BTW - rules周围的引号,messages和其他选项不是必需的。