Проверьте JavaScript, что опция выбора была выбрана - PullRequest
0 голосов
/ 18 октября 2019

У меня есть элемент select на странице формы, и я хотел бы, чтобы внутренний html-ярлык был изменен, если пользователь пытается отправить без выбора. Вот HTML.

  <div class="form-group">
    <label for="FamilySize" name = "FamSizeLable">How Many in Your Household</label>
    <select class="form-control" name = "FamilySize" id="FamilySize">
      <option disabled selected value="">Size</option>
      <option>1</option>
      <option>2</option>
      <option>3</option>
      <option>4</option>
      <option>5</option>
      <option>Good god ya'll</option>
    </select>
  </div>

Я пытался получить значение несколькими различными способами.

  else if(!document.getElementById("FamilySize").value){
    document.getElementByName("FamSizeLabel").innerHTML = "***You Must Select a Family Size***";
    document.getElementById("FamSizeLabel").style.color = "red";
    return false;
  }

и

  else if(!document.querySelector('[id = "FamilySize"]').value){
    document.getElementByName("FamSizeLabel").innerHTML = "***You Must Select a Family Size***";
    document.getElementById("FamSizeLabel").style.color = "red";
    return false;
  }

и

  else if(document.querySelector('[id = "FamilySize"]').value==null){
    document.getElementByName("FamSizeLabel").innerHTML = "***You Must Select a Family Size***";
    document.getElementById("FamSizeLabel").style.color = "red";
    return false;
  }

и

  else if(document.querySelector('[id = "FamilySize"]').value==""){
    document.getElementByName("FamSizeLabel").innerHTML = "***You Must Select a Family Size***";
    document.getElementById("FamSizeLabel").style.color = "red";
    return false;
  }

Я также попытался использовать console.log в представлении разработчика, чтобы увидеть, что мне не хватает. Тем не менее, я довольно новичок в JavaScript и не могу его закрепить. Форма все еще отправляется, когда FamilySize не выбран. Я могу поймать эту сторону сервера, но я пытаюсь улучшить JavaScript, поэтому хочу это понять / понять.

Редактировать (полный код страницы указан ниже):

{% extends "layout.html" %}

{% block main %}
<!--form action tells this form what route to post the data to. DOH! -->
<form action="/form" method="post">
  <div class="form-group">
    <!--for="FormControlInput1"This was in the EmailLablel label not sure what it does-->
    <label id = "EmailLabel" >Email address</label>
    <input type="email" class="form-control" name = "Email" autocomplete = "off" autofocus id="FormControlInput1" placeholder="name@example.com">
  </div>
  <div class="form-group">
    <label id = "Fname" >First Name</label>
    <input type="text" class="form-control" name = "Fname" autocomplete = "off"  id="FnameFormControlInput" placeholder="John">
  </div>
  <div class="form-group">
    <label id = "Lname" >Last Name</label>
    <input type="text" class="form-control" name ="Lname" autocomplete = "off"  id="LnameFormControlInput" placeholder="Doe">
  </div>
  <div class="form-group">
    <label for="FamilySize" name = "FamSizeLable">How Many in Your Household</label>
    <select class="form-control" name = "FamilySize" id="FamilySize">
      <option disabled selected value="">Size</option>
      <option>1</option>
      <option>2</option>
      <option>3</option>
      <option>4</option>
      <option>5</option>
      <option>Good god ya'll</option>
    </select>
  </div>
  <div class="form-group">
    <label for="AgeGroup">Select Age Group</label>
    <select multiple class="form-control" name = "AgeGroup" id="AgeGroup">
      <option>0-15</option>
      <option>16-24</option>
      <option>25-36</option>
      <option>37-45</option>
      <option>45-Dead</option>
    </select>
  </div>
  <div class="form-group">
    <label for="Comments">Comments</label>
    <textarea class="form-control" name = "Comments" id="Comments" rows="3"></textarea>
  </div>
  <div class="form-check">
    <input type="checkbox" class="form-check-input" id="exampleCheck1">
    <label class="form-check-label" for="exampleCheck1">Check me out</label>
  </div>
  <button class="btn btn-primary" type="submit">Submit</button>
</form>

<script>

    document.querySelector('form').onsubmit=function(){
      if(!document.querySelector('[type = "email"]').value){
        document.getElementById("EmailLabel").innerHTML = "***You Must Provide an Email address***";
        document.getElementById("EmailLabel").style.color = "red";
        return false;
      }
      else if(!document.querySelector('[id = "FnameFormControlInput"]').value){
        document.getElementById("Fname").innerHTML = "***You Must Provide a First Name***";
        document.getElementById("Fname").style.color = "red";
        return false;
      }
      else if(!document.querySelector('[id = "LnameFormControlInput"]').value){
        document.getElementById("Lname").innerHTML = "***You Must Provide a Last Name***";
        document.getElementById("Lname").style.color = "red";
        return false;
      }
      // //Here we have to use label for family size because there is no text on the control itself
      else if(!document.getElementById("FamilySize").value){
        document.getElementByName("FamSizeLabel").innerHTML = "***You Must Select a Family Size***";
        document.getElementById("FamSizeLabel").style.color = "red";
        console.log(document.querySelector('[id = "FamilySize"]').value);
        return false;
      }
      else if(!document.querySelector('[id = "AgeGroup"]').value){
        document.getElementById("AgeGroup").innerHTML = "***You Select Your Age Group***";
        document.getElementById("AgeGroup").style.color = "red";
        return false;
      }
      alert(document.querySelector('[id = "FamilySize"]').value);
      return true;

    };
</script>
{% endblock %}

Ответы [ 4 ]

1 голос
/ 18 октября 2019

Я отредактировал свой исходный пост и включил некоторые из ваших дополнительных элементов ввода. В настоящее время я использую класс form-control, чтобы решить, какие элементы нужно проверять (вы, конечно, можете использовать другое имя класса, предназначенное просто для этой цели). Затем я проверяю их все, используя метод Array.reduce(), который возвращает общее логическое значение. В зависимости от этого значения будет происходить дальнейшая обработка или нет ...

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

var chk=Array.from(document.querySelectorAll('.form-control')),
    msg="You must enter a value for ";

document.querySelector('#subm').addEventListener('click',
 function(){
 if (chk.reduce(function(ac,el){
   el.parentNode.querySelector('div.error').innerHTML=
     el.value=="" ? msg+el.name : "";
   return ac || el.value==""},
   false)) return false;
 console.log('OK, your data will be submitted ...');
 // and further code ...
})
div.error {color: red;}
<div class="form-group">
    <label id = "EmailLabel" >Email address</label>
    <input type="email" class="form-control" name="Email" 
     autocomplete = "off" autofocus id="FormControlInput1"
     placeholder="name@example.com"><div class="error"></div>
  </div>
  <div class="form-group">
    <label id = "Fname" >First Name</label>
    <input type="text" class="form-control" name = "Fname" autocomplete = "off"  id="FnameFormControlInput" placeholder="John"><div class="error"></div>
  </div>
  <div class="form-group">
    <label id = "Lname" >Last Name</label>
    <input type="text" class="form-control" name ="Lname" autocomplete = "off"  id="LnameFormControlInput" placeholder="Doe"><div class="error"></div>
  </div>
  <div class="form-group">
    <label for="FamilySize">How Many in Your Household</label>
    <select class="form-control" name="FamilySize" id="FamilySize">
      <option disabled selected value="">Size</option>
      <option>1</option>
      <option>2</option>
      <option>3</option>
      <option>4</option>
      <option>5</option>
      <option>Good god ya'll</option>
    </select><div class="error"></div>
  </div>
  <div class="form-group">
    <label for="AgeGroup">Select Age Group</label>
    <select multiple class="form-control" name="AgeGroup" id="AgeGroup">
      <option>0-15</option>
      <option>16-24</option>
      <option>25-36</option>
      <option>37-45</option>
      <option>45-Dead</option>
    </select><div class="error"></div>
  </div> 
  <button id="subm">submit</button>
0 голосов
/ 22 октября 2019

Наконец-то я решил эту проблему, присвоив своей метке идентификатор

  <div class="form-group">
  <label for="FamilySize" name = "FamSizeLable" id = "FamSizeLable">How Many in Your Household</label>
  <select class="form-control" name="FamilySize" id="FamilySize">
      <option disabled selected value="">Size</option>
      <option>1</option>
      <option>2</option>
      <option>3</option>
      <option>4</option>
      <option>5</option>
      <option>Good god ya'll</option>
    </select>
  </div>

, а затем изменил свой JavaScript, чтобы выбрать идентификатор селектора и проверить значение "":

  else if(document.querySelector('#FamilySize').value==""){
    //Here the # means id
    document.querySelector('#FamSizeLable').innerHTML = "***You Must Select a Family Size***";
    document.querySelector('#FamSizeLable').style.color = "red";
    return false;
  }
0 голосов
/ 18 октября 2019

Чтобы получить доступ к выбранному значению элемента или его innerHTML, будет работать что-то вроде этого:

var e = document.getElementById("FamilySize");
// For the option tag value attribute:
var value = e.options[e.selectedIndex].value;
// For the option text:
var text = e.options[e.selectedIndex].text;

Для метода getElementsByName нет единственного параметра. Чтобы получить доступ к содержанию вашего ярлыка, вы должны использовать:

var labelInnerHTML = document.getElementsByName("FamSizeLable")[0].innerHTML

Также обратите внимание, что в вашем коде есть ошибка опечатки:

name = "FamSizeLable"

Должно быть:

name = "FamSizeLabel"
0 голосов
/ 18 октября 2019

Вам также нужно значение внутри, например <option value="1">1</option>. Затем присвойте 0 значение size и проверьте, не равно ли значение 0, что пользователь не может продолжить.

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