【问题标题】:I would like to use JQuery to validate a form unsing .inArray() and .val()我想使用 JQuery 使用 .inArray() 和 .val() 验证表单
【发布时间】:2015-06-06 14:25:31
【问题描述】:

如果用户没有在字段中输入@ 符号,下面的脚本假设使用 .insertAfter() 插入消息。如果用户键入的值与 invalidEmailAddresses 数组中的值匹配,此脚本也会显示错误消息。

由于某种原因,仅执行此脚本的第二部分。 如果用户键入 @ 符号,他们会收到一条消息,但如果用户键入类似于 test@yahoo.com 的地址,则不会显示一条消息。不确定我是否正确组织了代码。

$(document).ready(function(){

    $("input[name='emailAddress']").blur(function(){
        // Actual Email Validation function

            var hasError = false;
            var emailaddressVal = $("input[name='emailAddress']").val();
            var invalidEmailAddresses = 
            ['goddady.com', 'aol.com', 'yahoo.com', 'yahoo.fr'];     


            if ($.inArray(emailaddressVal,invalidEmailAddresses) > 0) {
                $( "<span id='emailMessage'>The email provided is not from a business related domain. Please use an appropriate email address instead.</span>" ).insertAfter( "input[name='emailAddress']" );
            } else {
                    $ ('#emailMessage').css('display','none');
                }

            if ($("input[name='emailAddress']").val().indexOf('@') > -1) { 
                   $ ('#emailMessage').css('display','none');     
        } 

        else {
                $( "<span id='emailMessage'>The email provided does not contain an @ symbol</span>" ).insertAfter( "input[name='emailAddress']" );
        } 
            if(hasError == true) { return false; }
    });

});

【问题讨论】:

  • 你想让你的代码做什么?告诉我您的具体要求。
  • 如果用户键入的值与 invalidEmailAddresses 数组中的值匹配,我想显示一条错误消息。如果用户没有输入 @ 符号,则显示错误消息。
  • 我的理解是,如果用户输入 jimmy@yahoo.com 或 jimmy@aol.com 那么他应该会收到一条错误消息。对吗?
  • @Sukanya 正确!或者,如果您缺少“@”符号,您也应该得到一个错误
  • 我已经在我的答案中重构了你的代码,现在应该可以工作了:)

标签: javascript jquery arrays


【解决方案1】:

问题在于如果有条件:if ($.inArray(emailaddressVal,invalidEmailAddresses) &gt; 0)

由于$.inArray()方法返回的是找到的字符串的索引,所以当返回0的值时,实际上是找到了——但是在字符串的开头(位置0,因为JS是从零开始的) .所以,you should use !== -1 instead,即:if ($.inArray(emailaddressVal,invalidEmailAddresses) !== -1)

但是,这并不能完全解决您的问题$.inArray() 只比较字符串,不搜索它。因此,如果您的字符串包含列入黑名单的电子邮件域,但不完全匹配,它将返回 false。在这种情况下,您应该改用正则表达式。策略很简单:使用.each() 循环遍历您的数组,并获取值,使用它构造一个表达式,我们将测试您提供的电子邮件地址。

此外,由于用户输入的电子邮件地址可能无法通过两项测试,因此会出现两个相同 ID 的&lt;div&gt;。这是无效的 HTML。相反,请尝试使用类。

p/s:我还建议将收听 .blur() 改为 .change()。它更健壮:)


考虑到以上所有要点,我对您的代码进行了一些重构:

  • 声明一个名为hasError 的全局(但仍在函数范围内)错误数组。它将用于存储您收到的所有错误消息,因为我们无法确定是否会有一个或多个错误。
  • 我们构建了两个测试:
    1. 使用string.search(regexp) 方法测试电子邮件是否与黑名单匹配。如果匹配,返回的值将超过-1。然后我们将相关的错误信息推送到对象中的hasError
    2. 为了测试电子邮件是否包含@ 符号,我们使用您的默认逻辑(效果很好)。如果出现错误,我们再次将相关错误消息推送到对象中的hasError
  • 最后,我们评估hasError。如果它不为空,那么我们知道某处有错误,并循环遍历它。可以通过 messages 关键字访问错误消息 :)

事不宜迟,这是您的代码:

$(document).ready(function() {

  $("input[name='emailAddress']").change(function() {

    // Actual Email Validation function
    var hasError = [],
        emailaddressVal = $("input[name='emailAddress']").val(),
        invalidEmailAddresses = ['godaddy.com', 'aol.com', 'yahoo.com', 'yahoo.fr'];

    // Check against blacklist
    $.each(invalidEmailAddresses, function(i, v) {
      var pattern = new RegExp(v, 'i');
      if (emailaddressVal.search(pattern) > -1) {
        hasError.push({
          'test': 'blacklist',
          'message': 'The email provided is not from a business related domain. Please use an appropriate email address instead.'
        });
      }
    });

    // Check if there is an '@' character
    if ($("input[name='emailAddress']").val().indexOf('@') === -1) {
      hasError.push({
        'test': '@ sign',
        'message': 'The email provided does not contain an @ symbol'
      });
    }

    console.log(hasError);
    // Error handling
    $('#error').remove();
    if(hasError.length > 0) {
      var $error = $('<div id="error"><ul></ul></div>');
      $.each(hasError, function(i,v) {
        $error.find('ul').append('<li>'+v.message+'</li>');
      });
      $error.insertAfter("input[name='emailAddress']");
    }

  });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <input name="emailAddress" type="email" />
</form>

【讨论】:

  • 谢谢!这会执行,但只有当我输入“yahoo.com”时,如果我输入 test@yahoo.com 我没有收到错误消息
  • 感谢您的全面投入。谢谢
【解决方案2】:

如果您添加以下代码,这将起作用

    $(document).ready(function() {

  $("input[name='emailAddress']").blur(function() {
    // Actual Email Validation function
    $('#emailMessage').html("");
    var hasError = false;
    var emailaddressVal = $("input[name='emailAddress']").val().trim();
    var invalidEmailAddresses = ['goddady.com', 'aol.com', 'yahoo.com', 'yahoo.fr'];

    if (!isValidEmailAddres(emailaddressVal)) {
      $("<span id='emailMessage'>The email provided does not contain an @ symbol</span>").insertAfter("input[name='emailAddress']");
      hasError = true;
    } else {
      debugger
      emailaddressVal = emailaddressVal.split('@').slice(1)[0].trim();

      if ($.inArray(emailaddressVal, invalidEmailAddresses) >= 0) {
        $("<span id='emailMessage'>The email provided is not from a business related domain. Please use an appropriate email address instead.</span>").insertAfter("input[name='emailAddress']");
      } else {
        $('#emailMessage').css('display', 'none');
      }
    }
    if (hasError == true) {
      return false;
    }
  });

  function isValidEmailAddres(emailID) {
    var regexExp = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i);
    return regexExp.test(emailID);
  }

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input name="emailAddress" />

【讨论】:

  • 这太棒了。谢谢
  • 由于某种原因,以下代码在 IE 8 中不起作用
  • 能不能按F12看看有没有控制台报错?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 2012-03-10
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
相关资源
最近更新 更多