Jquery 根据黑名单数组验证输入值

Jquery 根据黑名单数组验证输入值,jquery,validation,jquery-validate,Jquery,Validation,Jquery Validate,我目前正在使用,我有一个表单,有四个输入字段-单词、国家、年龄和性别 国家、年龄和性别验证没有任何问题,但Word不想验证-我试图让Word值在验证之前对照黑名单检查自己,我试图阻止用户提交攻击性词语 目前,无论我在word输入字段中键入什么单词,它都会显示为错误,并且不希望验证 如果有人知道我错在哪里,我会感谢你的帮助 JS HTML 贵国 年龄 18-24 25-34 35+ 性 男性 女性 您添加的word方法中的逻辑是向后的;如果在数组中找不到输入的单词(即,$.inArray返回-

我目前正在使用,我有一个表单,有四个输入字段-单词、国家、年龄和性别

国家、年龄和性别验证没有任何问题,但Word不想验证-我试图让Word值在验证之前对照黑名单检查自己,我试图阻止用户提交攻击性词语

目前,无论我在word输入字段中键入什么单词,它都会显示为错误,并且不希望验证

如果有人知道我错在哪里,我会感谢你的帮助

JS

HTML


贵国
年龄
18-24
25-34
35+
性
男性
女性

您添加的
word
方法中的逻辑是向后的;如果在数组中找不到输入的单词(即,
$.inArray
返回
-1
),则您希望返回
true
,因为该单词有效

在这种情况下,您可以将逻辑简化为:

/* Blacklist Validation */
jQuery.validator.addMethod("word", function(value) {
    return $.inArray(value, blacklist) == -1;
});

注意,在这个示例中,我删除了错误消息抑制,因此您可以看到代码正在工作

还需要确保黑名单数组中的值大小写一致,这样您就可以使用
value.toUpperCase()
value.toLowerCase()
将输入的单词强制转换为同一大小写,因为当前
FoO
FoO
不匹配,将被标记为有效。

传递函数的说明文件:

实际的方法实现,如果元素有效,则返回true

JQuery的
inaray
方法返回
-1
是未找到的元素和项目的索引(如果找到)

查看您的方法,如果元素在您的黑名单中找到,它将返回
true
——因此这基本上是错误的


另外,正如我所评论的,您正在对输入的
执行
toUpperCase
(您随后删除了该值)-但是,如果希望黑名单检查不区分大小写,则可能需要将用户输入的值转换为黑名单的大小写-因此,要么将黑名单完全小写,并在值上使用
toLowerCase()
,要么将黑名单全部大写,在值上使用
toUpperCase()


这个代码应该有效

jQuery.validator.addMethod("word", function(value) {
  var in_array = $.inArray(value.toLowerCase(), blacklist);
  return in_array == -1;
});

有几个问题:

  • 您可以使用
    toUpperCase()
    (在原始问题中)与只有小写单词的列表进行比较。我想您打算使用
    toLowerCase()
  • 返回的
    false
    /
    true
    含义相反。当在黑名单中找不到单词时,您需要返回
    true
    (返回值-1)
  • 您根据黑名单检查整个输入,因此一旦输入包含多个单词,验证将永远不会在黑名单中找到它,即使其中一个输入单词可能被黑名单
我建议将黑名单转换为正则表达式。这将使您的代码非常简洁:

var blacklist = /\b(foo|bar|fizz|buzz)\b/; /* many more banned words... */

jQuery.validator.addMethod("word", function(value) {
    return !blacklist.test(value.toLowerCase());
});

因此,您希望错误添加的作品必须在文本框中输入时进行验证。不是吗?为什么在
值上设置
toUpperCase()
黑名单
中的单词都不是大写的?是的,因此如果用户键入冒犯性单词,该字段将无效,如果用户键入非冒犯性单词,该字段将变为有效并准备提交。@Jamiec输入值为大写,因此,我将数组转换为大写,以便值可以匹配?@Adam-但你没有-你正在将用户输入的值设置为大写,即使黑名单都是小写的。更多细节请参见我的答案。@Rorymcrossan是的,是的,我做了。谢谢你自己@Rory!这对我不起作用。我没有错误。我不明白为什么不起作用。@I但最好是你开始一个新问题,包括与你自己情况相关的代码。我们还需要看看你是如何设置jQuery验证插件的,确保字段名匹配等。可能有很多原因导致某些东西不适合你。具体来说,我验证正确,由于所需的验证有效,因此只有此自定义验证无效。我将验证中的名称放在addMethod函数上。当我从fiddle数组中输入字符串时,不会触发任何验证错误。
jQuery.validator.addMethod("word", function(value) {
  var in_array = $.inArray(value.toLowerCase(), blacklist);
  return in_array == -1;
});
var blacklist = /\b(foo|bar|fizz|buzz)\b/; /* many more banned words... */

jQuery.validator.addMethod("word", function(value) {
    return !blacklist.test(value.toLowerCase());
});