为什么这个正则表达式在javascript函数之外工作但不在其中?

邪悪歌*_*邪悪歌 3 javascript regex email validation undefined

好的,所以我对regexps一般都是新手,更不用说Javascript了.
我正在尝试一个表单验证项目,我找到了一个站点,他们在这里有各种有用的示例正则表达式列表,其中有一些用于电子邮件验证,这是我目前正在尝试的.
无论如何,按照这个w3schools表单验证的例子,我能够使用他们的例子让它正常工作,并且regexp在javascript函数之外工作,但由于某些原因,当我在函数内部调用它时,它返回一个undefined值.
这是我的代码:

<html>
  <head>
    <title>formzz validate-jons</title>
      <script type="text/javascript">
        pattern = new RegExp("^[0-9a-zA-Z]+@[0-9a-zA-z]+[\.]{1}[0-9a-zA-Z]+[\.]?[0-9a-zA-Z]+$");

        function valid8email(field, txt)
        {
          with(field)
          {
            //at_pos = value.indexOf('@');
            //dot_pos = value.lastIndexOf('.');

            if(!pattern.test(value)) //at_pos < 1 || (dot_pos - at_pos) < 2)
            {
              alert(txt);
              return false;
            }
            else
            {
              return true;
            }
          }
        }

        function valid8(form)
        {
          with(form)
          {
            if(valid8email(email, "you must enter an email address") == false)
            {
              email.focus();
              return false;
            }
          }
        }
      </script>
    </head>
    <body>
      <form action="#" method="POST" onsubmit="return valid8(this)">

        Email: <input type="text" name="email" size="30" />
        <input type="submit" value="clicky-click" />

    </form>

    <script type="text/javascript">
      alert(pattern.test(""));
    </script>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

好的...所以身体内部脚本标签中的警报工作正常.

我在javascript函数本身内做了很多测试并检查了各种各样的东西:

  • 'value'的类型是String
  • 当在javascript中调用时,该函数返回'undefined'
  • 正则表达式本身工作正常,因为当在下面的脚本标记中输入正确的格式时它将返回true

那么问题是什么呢?我很迷惑.

Nic*_*ver 8

问题是pattern引用field.pattern(HTML5属性),因为你在里面使用它with(),这是一个字符串,而不是你的正则表达式.如果你把它称为其他东西pattern1,那就行了.

话虽这么说,不要with在第一时间使用,你不会有这些问题:)


with版本看起来像这样:

var pattern = new RegExp("^[0-9a-zA-Z]+@[0-9a-zA-z]+[\.]{1}[0-9a-zA-Z]+[\.]?[0-9a-zA-Z]+$");

function valid8email(field, txt) {
    if (!pattern.test(field.value))
    {
        alert(txt);
        return false;
    }
    else {
        return true;
    }
}

function valid8(form) {
    if (valid8email(form.email, "you must enter an email address") == false) {
        form.email.focus();
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里测试一下.