почему это регулярное выражение работает вне функции JavaScript, но не внутри нее? - PullRequest
3 голосов
/ 01 декабря 2010

Хорошо, так что я вроде новичок в регулярных выражениях в общем, не говоря уже о Javascript.
Я пытаюсь работать над проектом проверки формы, и я нашел сайт, где у них есть список полезных примеров регулярных выражений для различных вещей здесь , где есть несколько для проверки электронной почты, что я и пытаюсь сделать момент
В любом случае, следуя этому примеру для проверки формы в w3schools, я смог заставить его работать правильно, используя их пример, и регулярное выражение работает за пределами функции 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>

Хорошо ... значит, предупреждение в тегах скрипта внутри тела работает просто отлично.

Я провел множество тестов внутри самой функции javascript и проверил различные вещи:

  • типом 'значения' является Строка
  • функция возвращает undefined при вызове внутри javascript
  • само регулярное выражение работает нормально, так как оно вернет true, когда правильное форматирование введено в теги скрипта ниже

Так в чем же может быть проблема? Я в замешательстве.

1 Ответ

8 голосов
/ 01 декабря 2010

Проблема в том, что 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;
    }
}

Вы можете проверить это здесь .

...