Javascript jquery验证插件,条件远程调用未按预期工作
我正在尝试使用标准jquery验证插件设置条件远程调用 问题是,当我在validate方法中传入name.val()时,页面加载时,它始终是在输入文本字段中设置的名称。文本框中的名称永远都不是 我将name.val()替换为“Test”,然后脚本就可以完美地运行了。控制台中没有语法错误或任何错误我还删除了对get_exists_规则(name.val())的调用,并将其替换为一个简单的required:true和it's fine。我已将此设置用于具有相同命名方案的其他表单,只是没有远程调用。 我还在get_exists_规则中抛出了一个警报消息,不管发生什么,它在页面加载时只执行一次,因此可能会有一些有趣的事情发生 我已经连续7个小时被困在这个问题上了,我查看了所有相关的SO帖子和我能想到的任何地方,但没有找到一个有效的解决方案 这是咖啡脚本:Javascript jquery验证插件,条件远程调用未按预期工作,javascript,jquery,coffeescript,jquery-validate,Javascript,Jquery,Coffeescript,Jquery Validate,我正在尝试使用标准jquery验证插件设置条件远程调用 问题是,当我在validate方法中传入name.val()时,页面加载时,它始终是在输入文本字段中设置的名称。文本框中的名称永远都不是 我将name.val()替换为“Test”,然后脚本就可以完美地运行了。控制台中没有语法错误或任何错误我还删除了对get_exists_规则(name.val())的调用,并将其替换为一个简单的required:true和it's fine。我已将此设置用于具有相同命名方案的其他表单,只是没有远程调用。
name = $("#category_name")
get_exists_rule = (category_name) ->
if original_name is category_name
required: true
maxlength: 64
else
remote: { url: "/dashboard/categories/exists/" + title_to_slug(category_name), type: "POST", async: false }
category_form.validate
errorElement:
"span"
rules:
"category[name]":
get_exists_rule(name.val())
var get_exists_rule, name;
name = $("#category_name");
get_exists_rule = function(category_name) {
if (original_name === category_name) {
return {
required: true,
maxlength: 64
};
} else {
return {
remote: {
url: "/dashboard/categories/exists/" + title_to_slug(category_name),
type: "POST",
async: false
}
};
}
};
category_form.validate({
errorElement: "span",
rules: {
"category[name]": get_exists_rule(name.val())
}
});
下面是javascript:
name = $("#category_name")
get_exists_rule = (category_name) ->
if original_name is category_name
required: true
maxlength: 64
else
remote: { url: "/dashboard/categories/exists/" + title_to_slug(category_name), type: "POST", async: false }
category_form.validate
errorElement:
"span"
rules:
"category[name]":
get_exists_rule(name.val())
var get_exists_rule, name;
name = $("#category_name");
get_exists_rule = function(category_name) {
if (original_name === category_name) {
return {
required: true,
maxlength: 64
};
} else {
return {
remote: {
url: "/dashboard/categories/exists/" + title_to_slug(category_name),
type: "POST",
async: false
}
};
}
};
category_form.validate({
errorElement: "span",
rules: {
"category[name]": get_exists_rule(name.val())
}
});
使初始规则与类别名称===原始名称时相同。 然后,当类别名称更改时,添加远程规则 大概是这样的:
$('#category_name').on('change', function() {
$( "#category_name" ).rules( "add", {
remote: {
url: "/dashboard/categories/exists/" + title_to_slug(category_name),
type: "POST",
success: function(exists) {
if(title_to_slug(category_name) === original_name) {
return true;
else {
return exists;
}
}
}
});
});
编辑
解决方案默认使用验证器的远程规则,而不是在更改时添加规则
rules: {
"category[name]": {
required: true
maxlength: 64
remote: {
url: "/dashboard/categories/valid_category",
type: "POST",
data: {
"category[name]": function() {
return title_to_slug(name.val());
},
original_name: original_name
}
}
}
}
在服务器端,使用您的语言执行以下操作:
您需要返回一个json字符串“true”或“false”
此时的name.val()是什么?当页面加载时,它是输入字段的值,它从不改变该值。那么name是什么呢?是一个引用输入的jquery obj吗?是的,我编辑了这篇文章以包含它,它只是通过id引用节点。我还尝试直接引用它,而不使用额外的变量,以防出现一些奇怪的缓存问题,但它也失败了。如果将name.val()传递给返回规则的函数,它将在页面加载时传递该值。因此,原始名称将始终===类别名称这几乎有效,我将其更改为附加到表单的“提交”事件中,以减少垃圾邮件。新的问题是,假设我执行以下步骤:1。将类别更改为我知道存在的名称,然后它会正确地给我一条失败消息,2。将类别更改为ok名称,它仍然失败,但如果我返回并再次更改它并切换字段/返回,它将允许我通过。关于如何纠正这种行为的想法?非常感谢您的帮助。如果我把它也放在字段的更改/模糊事件上,同样适用。如果一直尝试使用原始名称提交它,也会失败。您在哪里设置原始名称?你确定没有改变吗?我在文件顶部设置了它,它是name.val()的副本。我还将更改规则应用于表单提交事件,但当字段更改时,它似乎仍会触发,我可以感觉到它滞后于输入。知道为什么吗?这是整个cs文件:,和js版本:--我不知道为什么pastie要在第一个函数中添加一个额外的->,忽略它。此外,我还将服务器更改为接受GET而不是POST,这样可以更轻松地调试exists方法(它确实有效)。我不确定如何使用它来调试此问题,我只做了控制台日志记录。远程通话让人感觉有些东西坏了。它明显落后于我的电脑,现在我让它以某种方式提交了一个不应该通过的名称。