Jas*_*son 10 jquery jquery-validate
email1: {
required: true,
blacklist: true,
beanEmailValidator: true,
minlength: 6,
maxlength: 70,
remote: {
type: "GET",
url: llbFieldValJSONURL,
data: {
fieldData : function() {
return $("#enterEmail").val();
}
},
dataType:"json",
dataFilter: function(data) {
var json = jQuery.parseJSON(data);
if(json.error == "true") {
return "\"" + json.errorMessage + "\"";
} else {
return success;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
此函数检查用户名的唯一性,如果不是唯一的,则返回错误.问题是远程方法在有效后不会进行任何额外的调用.我需要它在每次输入/更改值时触发.
例如,如果我输入3个非唯一用户名,则每次都进行调用.如果我输入唯一的用户名,则呼叫正确,用户名恢复为有效.所以该领域是有效的.现在,如果我输入另一个非唯一(无效)用户名,则远程方法不会再次触发.
想知道它是否以某种方式缓存响应?
无效(非唯一)响应:
{"error":"true","errorMessage":"<b>The User Name you chose is already in use.</b> Please enter another name."}
Run Code Online (Sandbox Code Playgroud)
有效(唯一)响应:
{"error":"false","errorMessage":""}
Run Code Online (Sandbox Code Playgroud)
编辑
在SO上看到这个:
$("#site").change(function() {
$("#email").removeData("previousValue");
});
Run Code Online (Sandbox Code Playgroud)
因此插件似乎缓存了响应.插件是否有关闭缓存的方法,或者添加cache: falseajax调用是否也做同样的事情?
编辑
这两种方法都不奏效.看起来,一旦字段被标记为有效,它将不再进行远程呼叫.关于如何修复的想法?将函数放入自己的addMethod会阻止这种情况吗?
UPDATE /解决方案:
查看源代码jquery.validate.js,特别是此代码段:
success: function(response) {
validator.settings.messages[element.name].remote = previous.originalMessage;
var valid = response === true;
if ( valid ) { ...
Run Code Online (Sandbox Code Playgroud)
由于响应被评估为JSON,因此您需要调用return "true".这也在文档中指出
"响应被评估为JSON,对于有效元素必须为true"
但是,如果您忽略了隐含设置以下内容的事实,那么在查看完全等于测试为true 的源代码时可能会非常混乱.dataType: json
结束更新
经过调查,我会说你的'dataFilter'不应该回归'成功'
请参阅回调函数队列@ http://api.jquery.com/jQuery.ajax/
成功接收响应数据后立即调用dataFilter回调.它接收返回的数据和dataType的值,并且必须返回(可能已更改的)数据以传递给成功.
我的猜测是你的JS试图破坏return success,因此没有发送进一步的验证请求
我有相同的症状,但它是由一个不同的问题引起的.
看起来jQuery远程验证方法如果认为字段的值没有改变,则不会触发另一个ajax调用.这对我来说是有问题的,因为我有远程验证,在表格中的两个字段上验证:手机号码(IE 555-123-1234)和国家代码(IE 1表示美国).
如果手机号码没有变化,但国家代码没有变化,我们需要重新验证.但是,如果验证绑定到移动号码字段,则插件不会进行另一个ajax调用,因为其值未更改.
您可以在远程方法中查看插件执行此缓存的位置:
if ( previous.old === optionDataString ) {
return previous.valid;
}
Run Code Online (Sandbox Code Playgroud)
插件使用jQuery的$ data方法和"previousValue"键存储前一个值.因此,在我的情况下,我所要做的就是清除这个值:
$("#my-phone-number-element").removeData("previousValue");
$("#my-phone-number-element").valid();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8968 次 |
| 最近记录: |