Проверьте правильность нескольких функций, а затем сделайте что-нибудь - PullRequest
7 голосов
/ 13 декабря 2010

Я застрял на том, что я считаю простой ошибкой PEBCAK с моей стороны. Я пытаюсь проверить, все ли мои функции верны, прежде чем я отправлю форму, но не могу понять для меня, что не так. Ниже мой код JavaScript:

function checknewaccount(){
if(emailvalid()&& checkname() && passwordcheck())
{
    return true;
}
else{
    return false;
}
}


function emailvalid()
{
      if(email condition)
      {
          return true;
      }
      else {
          return false;
      }
}

function checkname())
{
      if(name condition)
      {
          return true;
      }
      else {
          return false;
      }
}

function passwordcheck(){
      if(password condition)
      {
          return true;
      }
      else {
          return false;
      }
}

HTML ниже:

<form  id="newaccount" name="newaccount" method="post"  onSubmit="accountcode.php">
<input type="text" id="email" onBlur="emailvalid()"/>
<input type="text" id="username" onBlur="checkname()" />
<input type="password" id="password"  onkeyup="passwordcheck()"/>
<input type="submit" value="New" onClick="return checknewaccount()"/>
</form>

Когда я нажимаю «Новый», ничего не происходит, и я знаю, что accountcode.php не работает, потому что ничего не происходит в конце базы данных и не сообщается об ошибках.

Подводя итог, мой вопрос, как не работает checknewaccount ()? Это как-то связано с тем, как я их называю?

Я новичок в javascript, поэтому, если я полностью отказался от своей реализации, я прошу прощения. Большое спасибо за помощь!

Ответы [ 2 ]

5 голосов
/ 13 декабря 2010

С этой частью все в порядке (я взял на себя смелость исправить отступ):

function checknewaccount(){
    if(emailvalid()&& checkname() && passwordcheck())
    {
        return true;
    }
    else{
        return false;
    }
}

Хотя вы можете улучшить его:

function checknewaccount(){
    return emailvalid() && checkname() && passwordcheck();
}

Эта часть является ошибкой синтаксиса(мягко говоря):

function emailvalid(), checkname(), passwordcheck(){
if(condition){
    return true;}
else{return false;}

Если это не реальная цитата из вашего кода, вам придется обновить свой вопрос (хотя я, возможно, не буду здесь, чтобы обновить этот ответ).Нет особого смысла спрашивать о коде и затем цитировать псевдокод в вопросе.(По крайней мере, в псевдокоде отсутствует окончательный }.)

То же самое относится и к вашим функциям в виде:

function emailvalid()
{
      if(email condition)
      {
          return true;
      }
      else {
          return false;
      }
}

Это нормально (при условии, что email condition является все еще psuedocode), но нет необходимости в if:

function emailvalid()
{
    return email condition;
}

С точки зрения "ничего не происходит", убедитесь, что выесть инструменты отладки, которые вы можете использовать.В Chrome встроены инструменты разработки, просто нажмите Ctrl + Shift + I.Для Firefox вы можете установить отличный Firebug.В последние версии IE также встроены средства разработки (для более старых версий вы можете скачать бесплатную версию Visual Studio, которую можно подключить к браузеру).Любой из них расскажет вам о синтаксисе и других ошибках, позволит вам пройтись по вашему заявлению кода за оператором и т. Д., Что крайне важно для выяснения того, что происходит.

Вот быстро набросанная версиячто я думаю ты пытаешься сделатьЯ бы так не поступил, но я внес минимальные изменения, чтобы он работал:

HTML:

<form action="http://www.google.com/search"
      method="GET" target="_blank"
      onsubmit="return checknewaccount()">
<input type="text" id="email" name='q' onblur="emailvalid()">
<input type="text" id="username" onblur="checkname()" >
<input type="password" id="password"  onkeyup="passwordcheck()">
<input type="submit" value="New">
</form>

Примечания по этому поводу:

  • Как указал Basiclife , ваш код form имеет проблемы.Они исправлены выше.
  • Выше я использовал action="http://www.google.com/search", но, конечно, для вас это будет action="accountcode.php" (или, по крайней мере, я так думаю).
  • Использование onsubmit для обработчика отправки формы, а не onclick для кнопки отправки.Вы не можете надежно отменить отправку формы через браузер с помощью кнопок onclick.
  • В onsubmit, убедитесь, что вы используете return - например, onsubmit="return checknewaccount()", а не onsubmit="checknewaccount()" -потому что мы хотим убедиться, что материал события видит возвращаемое значение.Нам все равно, если материал события не увидит возвращаемое значение других наших проверок (onblur="emailvalid()"), но если бы мы это сделали, нам также потребовалось бы return s.
  • Толькоодно из полей выше имеет атрибут name;никто из вас не делает.Только поля с name атрибутами отправляются с формами.Я использовал только один name для своего примера, потому что я хочу отправить только одно поле в Google, но для ваших целей вам понадобятся атрибуты name во всех трех полях. В этой краткой статье обсуждается id против name и для чего они нужны.Иногда вам нужны оба.
  • Я поместил атрибуты в нижний регистр, что является наилучшей практикой (и требуется, если вы хотите использовать XHTML).
  • Однако я удалил/ от концов inputs.Это немного не по теме, но на том уровне, на котором вы работаете, вы не хотите пытаться использовать XHTML, используйте HTML.Правильно использовать XHTML технически сложно, как при создании, так и при настройке сервера, и даже в этом случае вы должны использовать его в качестве супа тега для IE, иначе он не будет обрабатываться должным образом.XHTML имеет свое место, но в подавляющем большинстве случаев нет причин его использовать.
  • С учетом вышесказанного в сочетании с приведенным ниже JavaScript, нет никакой цели для обработчиков отдельных полей.Я оставил их, потому что я предполагаю, что вы делаете больше, чем просто проверки ниже - ниже приведен пример, показывающий, как эти обработчики делают что-то полезное.

JavaScript:

function checknewaccount() {
  return emailvalid() && checkname() && passwordcheck();
}

function emailvalid() {
  var element;

  // Get the email element
  element = document.getElementById('email');

  // Obviously not a real check, just do whatever your condition is
  return element.value.indexOf('@') > 0;
}

function checkname() {
  var element;

  // Get the username element
  element = document.getElementById('username');

  // Obviously not a real check, just do whatever your condition is
  return element.value.length > 0;
}

function passwordcheck() {
  var element;

  // Get the username element
  element = document.getElementById('password');

  // Obviously not a real check, just do whatever your condition is
  return element.value.length > 0;
}

Live copy

Вещи немного изменятся, если emailvalid, et.al., функции собираются сделать что-то, чтобы пользователь знал, что поля недействительны, например, выделение их меток:

HTML:

<form action="http://www.google.com/search"
      method="GET" target="_blank"
      onsubmit="return checknewaccount()">
<label>Email:  
<input type="text" id="email" name='q' onblur="emailvalid()"></label>
<br><label>Username:
<input type="text" id="username" onblur="checkname()" ></label>
<br><label>Password:
<input type="password" id="password"  onkeyup="passwordcheck()"/></label>
<br><input type="submit" value="New">
</form>

JavaScript:

function checknewaccount() {
  var result;
  // Because we're actually doing something in each of the
  // three functions below, on form validation we want to
  // call *all* of them, even if the first one fails, so
  // they each color their field accordingly. So instead
  // of a one-liner with && as in the previous example,
  // we ensure we do call each of them:
  result = emailvalid();
  result = checkname() && result;
  result = passwordcheck() && result;
  return result;
}

function emailvalid() {
      var element, result;

  // Get the email element
  element = document.getElementById('email');

  // Obviously not a real check, just do whatever your condition is
  result = element.value.indexOf('@') > 0;

  // Update our label and return the result
  updateLabel(element, result);
  return result;
}

function checkname() {
  var element, result;

  // Get the username element
  element = document.getElementById('username');

  // Obviously not a real check, just do whatever your condition is
  result = element.value.length > 0;

  // Update our label and return the result
  updateLabel(element, result);
  return result;
}

function passwordcheck() {
  var element, result;

  // Get the username element
  element = document.getElementById('password');

  // Obviously not a real check, just do whatever your condition is
  result = element.value.length > 0;

  // Update our label and return the result
  updateLabel(element, result);
  return result;
}

function updateLabel(node, valid) {
  while (node && node.tagName !== "LABEL") {
    node = node.parentNode;
  }
  if (node) {
    node.style.color = valid ? "" : "red";
  }
}

Живая копия

4 голосов
/ 13 декабря 2010

неправильный синтаксис формы - onsubmit = имя вызываемой функции js, action = url ...

<form action="accountcode.php" id="newaccount" name="newaccount" method="post"  onSubmit="return checknewaccount()">
<input type="text" id="email" onBlur="emailvalid()"/>
<input type="text" id="username" onBlur="checkname()" />
<input type="password" id="password"  onkeyup="passwordcheck()"/>
<input type="submit" value="New"/>
</form>

Полностью протестированный код:

<html>
    <head>
        <script type="text/javascript">
        function checknewaccount() {
            return emailvalid() && checkname() && passwordcheck();
        }

        function emailvalid() {
             var emailAddress = document.getElementById('email').value;
             return (emailAddress=='test');
        }

        function checkname() {
             return true;
        }

        function passwordcheck() {
             return true;
        }

        </script>
    </head>
    <body>
    <form action="#" onsubmit="return checknewaccount();">
        <input type="text" id="email" name="email"/>
        <input type="submit"/>
    </form>
    </body>
</html>

Форма в приведенном выше коде будет отправлена ​​только в том случае, если текстовое поле имеет значение test

Немного лучшая реализация будет выглядеть так:Меньше всего говорит пользователю, что форма не была отправлена.Еще лучше было бы дать пользователю более подробную причину, почему, но это выходит за рамки этого вопроса ...

...