根据黑名单数组验证输入值
Validate input value against blacklist array
我目前正在使用 jQuery Validation,我有一个包含四个输入字段的表单 - 单词、国家/地区、年龄和性别。
国家、年龄和性别验证没有任何问题,但 Word 不想验证 - 我试图让 Word 值在验证之前根据黑名单检查其自身,我试图阻止用户提交冒犯性言论。
目前,无论我在 Word 输入字段中键入什么词,它总是显示为错误并且不想验证。
如果有人能看出我哪里出错了,我将不胜感激!
JS
/* Blacklist Array */
var blacklist = ['foo', 'bar', 'fizz', 'buzz', /* many more banned words... */ ];
/* Blacklist Validation */
jQuery.validator.addMethod("word", function(value) {
var in_array = $.inArray(value, blacklist);
if (in_array == -1) {
return false;
} else {
return true;
}
});
/* Submit Validation */
$("#submit").validate({
errorPlacement: function(error, element){},
rules: {
word: {
required: true
},
country: {
required: true
},
age: {
required: true
},
sex: {
required: true
}
},
submitHandler: function(form) {
alert('Submitted');
}
});
HTML
<form methord="post" name="wordsubmit" id="submit">
<div class="inner">
<input class="word" name="word" placeholder="Your Word" type="text"/>
<select class="country" name="country" size='1'>
<option value="">Your country</option>
</select>
<select class="age" name="age" size='1'>
<option value="">Age</option>
<option value="18-24">18-24</option>
<option value="25-34">25-34</option>
<option value="35+">35+</option>
</select>
<select class="sex" name="sex" size='1'>
<option value="">Sex</option>
<option value="Male">Male</option>
<option vlaue="Female">Female</option>
</select>
</div>
<input class="submit" name="submit" type="submit" value="Submit"/>
</form>
您添加的word
方法中的逻辑是倒退的;如果在数组中找不到输入的单词(即 $.inArray
returns -1
),那么您需要 return true
因为这个单词是有效的。
既然如此,您可以将逻辑简化为:
/* Blacklist Validation */
jQuery.validator.addMethod("word", function(value) {
return $.inArray(value, blacklist) == -1;
});
请注意,在示例中我删除了错误消息抑制,因此您可以看到代码有效。
确保黑名单数组中值的大小写一致也是值得的,因此您可以使用 value.toUpperCase()
或 value.toLowerCase()
将输入的单词转换为相同的大小写,如当前 FoO
将不匹配 foo
并将被标记为有效。
addMethod
的文档提到传入的函数:
The actual method implementation, returning true if an element is valid.
JQuery的inArray
方法returns -1
是元素是NOT找到的,索引项目如果是。
看看你的方法 returns true
如果元素 IS 在你的黑名单中找到 - 所以它基本上是错误的方法。
此外,正如我评论的那样,您正在对输入的 value
(您随后将其删除)执行 toUpperCase
- 但是,如果您希望黑名单检查不区分大小写,您可能需要将用户输入的值转换为黑名单的任何大小写 - 因此要么将黑名单完全小写并在值上使用 toLowerCase()
,要么将黑名单全部大写并在值上使用 toUpperCase()
。
此代码应该有效
jQuery.validator.addMethod("word", function(value) {
var in_array = $.inArray(value.toLowerCase(), blacklist);
return in_array == -1;
});
有几个问题:
- 您使用
toUpperCase()
(在您的原始问题中)与仅包含小写单词的列表进行比较。我想你打算使用 toLowerCase()
;
- 你return
false
/true
的意思相反。当在黑名单中找不到该词时,您需要 return true
(returned 值 -1)
- 您根据黑名单检查整个输入,因此一旦输入包含多个单词,验证将永远不会在黑名单中找到它,即使其中一个输入单词可能被列入黑名单。
我建议把你的黑名单变成正则表达式。这将使您的代码非常简洁:
var blacklist = /\b(foo|bar|fizz|buzz)\b/; /* many more banned words... */
jQuery.validator.addMethod("word", function(value) {
return !blacklist.test(value.toLowerCase());
});
我目前正在使用 jQuery Validation,我有一个包含四个输入字段的表单 - 单词、国家/地区、年龄和性别。
国家、年龄和性别验证没有任何问题,但 Word 不想验证 - 我试图让 Word 值在验证之前根据黑名单检查其自身,我试图阻止用户提交冒犯性言论。
目前,无论我在 Word 输入字段中键入什么词,它总是显示为错误并且不想验证。
如果有人能看出我哪里出错了,我将不胜感激!
JS
/* Blacklist Array */
var blacklist = ['foo', 'bar', 'fizz', 'buzz', /* many more banned words... */ ];
/* Blacklist Validation */
jQuery.validator.addMethod("word", function(value) {
var in_array = $.inArray(value, blacklist);
if (in_array == -1) {
return false;
} else {
return true;
}
});
/* Submit Validation */
$("#submit").validate({
errorPlacement: function(error, element){},
rules: {
word: {
required: true
},
country: {
required: true
},
age: {
required: true
},
sex: {
required: true
}
},
submitHandler: function(form) {
alert('Submitted');
}
});
HTML
<form methord="post" name="wordsubmit" id="submit">
<div class="inner">
<input class="word" name="word" placeholder="Your Word" type="text"/>
<select class="country" name="country" size='1'>
<option value="">Your country</option>
</select>
<select class="age" name="age" size='1'>
<option value="">Age</option>
<option value="18-24">18-24</option>
<option value="25-34">25-34</option>
<option value="35+">35+</option>
</select>
<select class="sex" name="sex" size='1'>
<option value="">Sex</option>
<option value="Male">Male</option>
<option vlaue="Female">Female</option>
</select>
</div>
<input class="submit" name="submit" type="submit" value="Submit"/>
</form>
您添加的word
方法中的逻辑是倒退的;如果在数组中找不到输入的单词(即 $.inArray
returns -1
),那么您需要 return true
因为这个单词是有效的。
既然如此,您可以将逻辑简化为:
/* Blacklist Validation */
jQuery.validator.addMethod("word", function(value) {
return $.inArray(value, blacklist) == -1;
});
请注意,在示例中我删除了错误消息抑制,因此您可以看到代码有效。
确保黑名单数组中值的大小写一致也是值得的,因此您可以使用 value.toUpperCase()
或 value.toLowerCase()
将输入的单词转换为相同的大小写,如当前 FoO
将不匹配 foo
并将被标记为有效。
addMethod
的文档提到传入的函数:
The actual method implementation, returning true if an element is valid.
JQuery的inArray
方法returns -1
是元素是NOT找到的,索引项目如果是。
看看你的方法 returns true
如果元素 IS 在你的黑名单中找到 - 所以它基本上是错误的方法。
此外,正如我评论的那样,您正在对输入的 value
(您随后将其删除)执行 toUpperCase
- 但是,如果您希望黑名单检查不区分大小写,您可能需要将用户输入的值转换为黑名单的任何大小写 - 因此要么将黑名单完全小写并在值上使用 toLowerCase()
,要么将黑名单全部大写并在值上使用 toUpperCase()
。
此代码应该有效
jQuery.validator.addMethod("word", function(value) {
var in_array = $.inArray(value.toLowerCase(), blacklist);
return in_array == -1;
});
有几个问题:
- 您使用
toUpperCase()
(在您的原始问题中)与仅包含小写单词的列表进行比较。我想你打算使用toLowerCase()
; - 你return
false
/true
的意思相反。当在黑名单中找不到该词时,您需要 returntrue
(returned 值 -1) - 您根据黑名单检查整个输入,因此一旦输入包含多个单词,验证将永远不会在黑名单中找到它,即使其中一个输入单词可能被列入黑名单。
我建议把你的黑名单变成正则表达式。这将使您的代码非常简洁:
var blacklist = /\b(foo|bar|fizz|buzz)\b/; /* many more banned words... */
jQuery.validator.addMethod("word", function(value) {
return !blacklist.test(value.toLowerCase());
});