JavaScript методы проверки не работают, как задумано - PullRequest
0 голосов
/ 25 апреля 2020

Я довольно новичок в JavaScript, и я пытаюсь создать форму, которую пользователь должен заполнить, и проверить введенные записи перед отправкой на сервер. На их день рождения я не уверен, как ограничить формат записи приемлемыми днями, месяцами и годами. Что касается некоторых других моих проверок, я все еще могу отправить свою форму без моих методов проверки, которые меня останавливали. Иногда я получаю оповещения, но после нажатия «ОК» форма по-прежнему отображается с неправильными значениями. Кто-нибудь может определить, что я делаю не так? Я уверен, что у меня где-то есть опечатки, а также логические ошибки. Заранее спасибо.

<!DOCTYPE html>
<html>

<head>

<title>Testing</title>

<script language="JavaScript">

today = new Date()

function isNotEmpty(field){
    var inputStr = field.value
    if (inputStr == " " || inputStr == null){

        alert("An entry for this field is required.")
        field.focus()
        field.select()
        return false
    }
    return true
}

function isNumber(field){

    if (isNotEmpty(field)){
        var inputStr = field.value
        for(var i = 0; i<inputStr.length; i++){
            var oneChar=inputStr.substring(i,1)
            if (isNaN(oneChar)==true && oneChar != "+"){
                alert("Only numbers and area codes are allowed in this field.");
                field.focus()
                field.select()
                return false
            }
        }
        return true
    }return false
}

function isOption(e){

    var type = document.getElementById("pastimetype")
    var selectedValue = type.options[type.selectedIndex].value;
        if(selectedValue == "selectpastime"){
            alert("Please select a pastime.")
            return false
        }
        return true
}   


function birthDay(form){

    form.day.value=today.getDate()
    form.month.value=today.getMonth()+1
    form.year.value=today.getYear()+1900

}

function validate(form){
    if(isNumber(form.day) && isNumber(form.month) && isNumber(form.year)){
        return true
    }
    return false

}


</script>
</head>

<body>

<form method="POST" form id ="form" action="http://www.it.murdoch.edu.au/cgi-bin/reply1.pl"
    onSubmit="return validate(this)">

    <p> Welcome! 
    Please enter the following details:</p>

    <p><label for="name"> Name: </label><br>
    <input name="name" id="name" type="text" size="10" onChange="isNotEmpty(this)"></p>

    <p><label for="number"> Number: </label><br> 
    <input name="number" type="text" id="number" onChange="isNumber(this)"></p>  

    <p>Enter your birthday here: <p>
    <p>Day: <input name="day" type="text" size="10" value="1" onChange="isNumber(this)"></p>
    <p>Month: <input name="month" type="text" size="10" value="1" onChange="isNumber(this)"></p>
    <p>Year: <input name="year" type="text" size="10" value="2000" onChange="isNumber(this)"></p>

    <p><label for ="pastime"> Favourite pastime: </label>
    <select name="pastime" select id="pastimetype" onChange="isOption(this)">
    <option value="selectpastime">---Please choose an option---</option>
    <option value="surfingtheweb">Surfing the Web</option>
    <option value="playingsport">Playing Sport</option>
    <option value="listeningtomusic">Listening to Music</option>
    <option value="watchingtv">Watching TV</option>
    <option value="playinggames">Playing Games</option>
    <option value="communityservice">Community Service</option>
    <option value="daydreaming">Daydreaming</option>
    <option value="reading">Reading</option>
    <option value="meditation">Meditation</option>
    </select></p>

    <p>
        <input type="submit">
        <input type = "button" value="birthday" onClick="makeToday(this.form)">

    </p>

</form>

</body>

</html>

1 Ответ

0 голосов
/ 25 апреля 2020

Следует отметить, что, возможно, любая проверка на стороне клиента действительно должна быть подкреплена проверкой server side, поскольку обходить многое из того, что вы надеетесь выполнить sh с помощью Javascript, довольно тривиально. Кроме того, если кто-то нацелится на форму, используя, например, PHP & cURL none из подпрограмм проверки Javascript, то здесь будет использоваться вообще. По сути, не полагайтесь на проверку на стороне клиента.

С учетом сказанного в HTML5 существует ряд атрибутов и элементов, которые помогают вам в выполнении проверки на стороне клиента. Элемент формы может иметь установленный атрибут required - форма не будет отправлена, пока это поле не будет иметь значения. Если формат этого поля должен быть в определенной форме, вы можете назначить атрибут pattern (в основном шаблон стиля RegExp) и снова, если значение поля не соответствует этому шаблону, форма не будет отправлена.

Функция validation действительно брала только составляющие элементы date of birth пользователя для проверки и игнорирования других полей. Имея единственную функцию для проверки, вы можете убедиться, что все элементы формы используются в задачах проверки.

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

document.addEventListener('DOMContentLoaded',function(){
  var today = new Date();
  var nl=String.fromCharCode( 10 );// New Line character

  var oForm = document.querySelector('form');
  var oBttn = document.querySelector('input[type="button"][name="bd"]');

  oBttn.addEventListener('click',function(e){
    oForm.day.value=today.getDate();
    oForm.month.value=today.getMonth()+1;
    oForm.year.value=today.getYear()+1900;
  });

  oForm.addEventListener('submit',function(e){
    try{
      e.preventDefault();

      Array.from( this.elements ).forEach( el=>{
        if( el.type.toLowerCase()!='submit' ){
          if( !el.value || el.value=='' || ( el.type.toLowerCase()=='select-one' && el.value=='false' ) ){

            var error=[ '"'+el.name + '" cannot be empty' ];

            if( el.hasAttribute( 'pattern' ) ) error.push( 'The field "'+ el.name + '" has a required pattern of '+el.getAttribute('pattern') )
            if( el.hasAttribute('data-rule') )error.push( el.dataset.rule );

            throw new Error( error.join( nl ) );
          }
        }
      });

      return this.submit();
    }catch( err ){
      alert( err );
      return false;
    }
  });
});
body,body *{
  box-sizing:border-box; font-family:monospace;
}
form{
  width:50%;
  padding:1rem;
  border:1px dotted gray;
  float:none;
  margin:auto;
}
label{
  margin:0.25rem auto;
  display:block;
  width:80%;
  float:left;
  clear:both;
  text-indent:1rem;
}
label input,
label select{
  float:right; width:40%;
}
p{
  clear:both;
}
.bold{
  font-weight:bolder; text-decoration:underline;
}
<form method='POST' action='http://www.it.murdoch.edu.au/cgi-bin/reply1.pl'>
  <p class='bold'> Welcome! Please enter the following details:</p>

  <label for='name'>Name: 
    <input type='text' name='name' size='10' pattern='[a-zA-z\s]+' data-rule='An entry for this field is required.' required />
  </label>

  <br />

  <label for='number'>Number: 
    <input type='text' name='number' pattern='[0-9\+ ]+' data-rule='Only numbers and area codes are allowed in this field.' required />
  </label>

  <br />

  <p class='bold'>Enter your birthday here: <p>

  <label for='day'>Day: <input type='number' name='day' size='2' min=1 max=31 step=1 value='1' required /></label>
  <label for='month'>Month: <input type='number' name='month' size='2' min=1 max=12 step=1 value='1' required /></label>
  <label for='year'>Year: <input type='number' name='year' size='4' min=1900 max=2020 step=1 value='2000' required /></label>

  <br />

  <label for='pastime'> Favourite pastime: 
    <select name='pastime' required data-rule='Please select a pastime.'>
      <option value=false selected hidden disabled>---Please choose an option---
      <option value='surfingtheweb'>Surfing the Web
      <option value='playingsport'>Playing Sport
      <option value='listeningtomusic'>Listening to Music
      <option value='watchingtv'>Watching TV
      <option value='playinggames'>Playing Games
      <option value='communityservice'>Community Service
      <option value='daydreaming'>Daydreaming
      <option value='reading'>Reading
      <option value='meditation'>Meditation
    </select>
  </label>

  <p>
    <input type='submit' name='sub' />
    <input type='button' name='bd' value='birthday' />
  </p>
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...