проверка встроенной формы javascript - PullRequest
2 голосов
/ 08 мая 2009

Я работаю над сценарием проверки формы на работе, и у меня возникли некоторые трудности. Форма предназначена для того, чтобы убедиться, что пользователь заполняет имя, реально выглядящий адрес электронной почты, категорию (из выпадающего списка) и вопрос:

Это имя формы и собирает все данные из формы:

<script>

  function checkForm(form1) {
name = document.getElementById("FieldData0").value;
category = document.getElementById("FieldData3").value;
question = document.getElementById("FieldData1").value;
email = document.getElementById("FieldData2").value;

Это проверяет, что что-то находится в поле «имя». Он работает нормально и проверяет точно так, как должен, отображая текст ошибки:

  if (name == "") {
  hideAllErrors();
document.getElementById("nameError").style.display = "inline";
document.getElementById("FieldData0").select();
document.getElementById("FieldData0").focus();
  return false;

Это также работает так же, как и должно. Он проверяет, является ли поле электронной почты пустым, и если оно пустое, отображает текст ошибки и выбирает это поле:

  } else if (email == "") {
hideAllErrors();
document.getElementById("emailError").style.display = "inline";
document.getElementById("FieldData2").select();
document.getElementById("FieldData2").focus();
  return false;
  } 

Это также работает так же, как и должно, чтобы убедиться, что поле вопросов не пустое:

else if (question == "") {
hideAllErrors();
document.getElementById("questionError").style.display = "inline";
document.getElementById("FieldData1").select();
document.getElementById("FieldData1").focus();
  return false;
  } 

Этот работает частично - если не выбрано ни одно раскрывающееся меню, будет отображаться сообщение об ошибке, но это не мешает отправке формы, оно просто отображает текст ошибки, пока форма отправляет:

else if (category == "") {
hideAllErrors();
document.getElementById("categoryError").style.display = "inline";
document.getElementById("FieldData3").select();
document.getElementById("FieldData3").focus();
  return false;
  } 

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

else if (!check_email(document.getElementById("FieldData1").value)) {
hideAllErrors();
document.getElementById("emailError2").style.display = "inline";
document.getElementById("FieldData2").select();
document.getElementById("FieldData2").focus();
  return false;
  } 

Otherwise it lets the form submit:


  return true;
  }

Это проверяет электронную почту:

function check_email(e) {
ok = "1234567890qwertyuiop[]asdfghjklzxcvbnm.@-_QWERTYUIOPASDFGHJKLZXCVBNM";

for(i=0; i < e.length ;i++){
if(ok.indexOf(e.charAt(i))<0){ 
return (false);
}   
} 

if (document.images) {
re = /(@.*@)|(\.\.)|(^\.)|(^@)|(@$)|(\.$)|(@\.)/;
re_two = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
if (!e.match(re) && e.match(re_two)) {
return (-1);        
} 

}

}

Эта функция скрывает все ошибки, поэтому пользователь не засыпает красным текстом. Я попытался вставить "document.getElementById (" emailError "). Style.display =" none "", но это сломало все:

  function hideAllErrors() {
document.getElementById("nameError").style.display = "none"
document.getElementById("emailError").style.display = "none"
document.getElementById("categoryError").style.display = "none"
document.getElementById("questionError").style.display = "none"

  }


</script>

И форма выглядит так:

<form onSubmit="return checkForm();" method="post" action="http://www.emailmeform.com/fid.php?formid=303341io4u" name="form1">

<p><div class=error id=nameError>Required: Please enter your name<br/></div><p><strong>Name:</strong> <span></span><br><input type="text" name="FieldData0" id="FieldData0" value="" size="22" tabindex="1" />
<label for="name"></label></p>

<p><div class=error id=emailError>Required: Please enter your email address<br/></div>
<div class=error id=nameError2>This doesn't look like a real email address, please check and reenter<br/></div>
<strong><p>Email:</strong> <span>(will not be published)</span><br><input type="text" name="FieldData2" id="FieldData2" value="" size="22" tabindex="2" />
<label for="email"></label>
</p>

<div class=error id=categoryError>Please select a category from the drop-down menu<br></div>
<p><strong>Category:</strong> <span></span><br>
<p><select id="FieldData3" name="FieldData3">
<option value="">Please select a category</option>
<option value="a">a</option>
<option value="b">b</option>
<option value="c">c</option>
<option value="d">d</option>
<option value="e">e</option>
<option value="f">f</option>
<option value="other">Other</option>
</select><label for="category"></label>

<p><div class=error id=questionError>Please type your question in the box below:<br></div><label for="question"><strong><p>Your Question:</strong> <span></span></label><br>

<textarea name="FieldData1" id="FieldData1" cols="50" rows="10"></textarea></p>

<p><input type="submit" class="btn" value="Submit Question" name="Submit"></p>
</div>
</form>

Является ли проблема порядком запуска проверок? Я не могу понять это. Любая помощь будет оценена.

Ответы [ 5 ]

5 голосов
/ 09 мая 2009

Я позволил себе переписать ваш javascript, чтобы сделать его более читабельным и более легким для отладки.

Как отметил Марк Бернье, выпадающий элемент не поддерживает функцию select, поэтому я поместил вокруг нее оператор if, чтобы исключить исключение. Я также упростил вашу checkEmail функцию, она выглядела довольно запутанной. Я переименовал его в isAnInvalidEmail, чтобы сделать код checkForm более простым.

Вы также неправильно назвали 'emailError2' div в своем HTML, что может вызвать другое исключение в javascript. Ваш HTML довольно грязный и, в некоторых случаях, недействительный. В некоторых значениях атрибутов отсутствуют кавычки и отсутствуют конечные теги. Вам следует рассмотреть возможность использования валидатора W3C , чтобы гарантировать, что ваш HTML чистый и соответствует стандартам.

Я разместил ваш код на jsbin: http://jsbin.com/iyeco (редактируется через http://jsbin.com/iyeco/edit)

Вот очищенный Javascript:

function checkForm() {
  hideAllErrors();
  var formIsValid =
    showErrorAndFocusIf('FieldData0', isEmpty, 'nameError')
    && showErrorAndFocusIf('FieldData2', isEmpty, 'emailError')
    && showErrorAndFocusIf('FieldData2', isAnInvalidEmail, 'emailError2')
    && showErrorAndFocusIf('FieldData3', isEmpty, 'categoryError')
    && showErrorAndFocusIf('FieldData1', isEmpty, 'questionError');

  /* For debugging, lets prevent the form from submitting. */
  if (formIsValid) {
    alert("Valid form!");
    return false;
  }

  return formIsValid;
}

function showErrorAndFocusIf(fieldId, predicate, errorId) {
  var field = document.getElementById(fieldId);
  if (predicate(field)) {
    document.getElementById(errorId).style.display = 'inline';
    if (field.select) {
      field.select();
    }
    field.focus();
    return false;
  }

  return true;
}

function isEmpty(field) {
  return field.value == '';
}

function isAnInvalidEmail(field) {
  var email = field.value;

  var ok = "1234567890qwertyuiop[]asdfghjklzxcvbnm.@-_QWERTYUIOPASDFGHJKLZXCVBNM";

  for(i = 0; i < email.length; i++){
    if(ok.indexOf(email.charAt(i)) < 0) {
      return true;
    }
  }

  re = /(@.*@)|(\.\.)|(^\.)|(^@)|(@$)|(\.$)|(@\.)/;
  re_two = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
  return re.test(email) || !re_two.test(email);
}



function hideAllErrors() {
  document.getElementById("nameError").style.display = "none"
  document.getElementById("emailError").style.display = "none"
  document.getElementById("emailError2").style.display = "none"
  document.getElementById("categoryError").style.display = "none"
  document.getElementById("questionError").style.display = "none"
}

и убранный HTML:

<form onSubmit="return checkForm();" method="post" action="http://www.emailmeform.com/fid.php?formid=303341io4u" name="form1"> 
  <div> 
    <div class="error" id="nameError"> 
      Required: Please enter your name 
    </div> 
    <label for="FieldData0"><strong>Name:</strong></label> 
    <input type="text" name="FieldData0" id="FieldData0" value="" size="22" tabindex="1" /> 
  </div> 

  <div> 
    <div class="error" id="emailError"> 
      Required: Please enter your email address 
    </div> 
    <div class="error" id="emailError2"> 
      This doesn't look like a real email address, please check and reenter 
    </div> 
    <label for="FieldData2"><strong>Email:</strong>(will not be published)</label> 
    <input type="text" name="FieldData2" id="FieldData2" value="" size="22" tabindex="2" /> 
  </div> 

  <div> 
    <div class="error" id="categoryError"> 
      Please select a category from the drop-down menu 
    </div> 
    <label for="FieldData3"><strong>Category:</strong></label> 
    <select id="FieldData3" name="FieldData3"> 
      <option value="">Please select a category</option> 
      <option value="a">a</option> 
      <option value="b">b</option> 
      <option value="c">c</option> 
      <option value="d">d</option> 
      <option value="e">e</option> 
      <option value="f">f</option> 
      <option value="other">Other</option> 
    </select> 
  </div> 

  <div> 
    <div class="error" id="questionError"> 
      Please type your question in the box below: 
    </div> 
    <label for="FieldData1"><strong>Your Question:</strong></label> 
    <textarea name="FieldData1" id="FieldData1" cols="50" rows="10"></textarea> 
  </div> 

  <input type="submit" class="btn" value="Submit Question" name="Submit"> 
</form> 
1 голос
/ 09 мая 2009

Что касается ошибки в раскрывающемся списке, не вызывайте эту строку:

document.getElementById ( "FieldData1") выберите ();.

Кажется, я вспомнил, что у меня была точно такая же проблема несколько недель назад.

0 голосов
/ 08 мая 2009

Я бы порекомендовал избавиться от целой цепочки if else и проверить каждую по отдельности, вот это.

var error = 0;
if (value == '') {
    error = 1;
    // other stuff;
}

if (value2 == '') {
    error = 1;
    // do stuff;
} 

...

if (error) {
    // show error
} else {
    // submit form
}
0 голосов
/ 08 мая 2009

Попробуйте заменить == на ===, который не печатает приведение. Это может помочь вам с проблемой выпадающего списка.

Ваша функция возвращает false и может также вернуть -1.

Поскольку я не знаю, какой тип приведения типов JavaScript делает с !-1, вам также следует сделать следующее:

check_email(...)!==false;

Вместо этого:

!check_email(...)
0 голосов
/ 08 мая 2009

Первая проблема: переместить содержимое оператора if в функцию ... затем перейти оттуда. У вас есть около 5 частей кода, которые делают одно и то же.

Далее: поскольку вы допускаете только одно сообщение об ошибке за раз, создайте общий div для его хранения и просто переместите объект. Таким образом, вам не нужно отслеживать какие-то ошибки, отображать другие и т. Д.

Далее: только возвращайте true или false из вашей функции check_email ... возвращать -1 и false и т. Д. - это дурной тон, даже несмотря на то, что javascript мягко относится к таким вещам.

После того, как вы очистите свой код, отладка будет намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...