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

时间:2016-05-06 09:39:39

标签: jquery validation jquery-validate

我目前正在使用jQuery Validation,我有一个包含四个输入字段的表单 - Word,Country,Age&性。

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

目前,无论我在Word输入字段中输入什么字,它总是显示为错误,并且不想验证。

如果有人能看到我出错的地方,我会很感激帮助!

Screenshot

JS

func

HTML

 /* 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');
      }
    });

3 个答案:

答案 0 :(得分:1)

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

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

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

Working example

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

同样值得确保案例与黑名单数组中的值保持一致,因此您可以使用value.toUpperCase()value.toLowerCase()将输入的字词转换为相同的案例,如同{ {1}}不匹配FoO,并且会被标记为有效。

答案 1 :(得分: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());
});

答案 2 :(得分:0)

addMethod的文档说明了传入的函数:

  

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

JQuery的inArray方法返回-1是找到 NOT 的元素,如果是,则为该项的索引。

如果在您的黑名单中找到元素 IS ,则查看您的方法会返回true - 所以它基本上是错误的方式。

另外,正如我评论的那样,您在输入的toUpperCase上进行了value(之后您已删除) - 但是如果您希望黑名单检查不区分大小写,则可能需要将用户输入的值转换为黑名单所具有的任何外壳 - 所以要么将黑名单全部小写并对值使用toLowerCase(),要么将黑名单全部置于大写并且值为toUpperCase()。< / p>

此代码应该可以使用

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