Условная проверка в веб-форме JavaScript - PullRequest
0 голосов
/ 17 февраля 2020

Я работаю над веб-формой, используя JavaScript для проверки. Это только один раздел гораздо большей формы.

В форме есть вопрос, который спрашивает пользователя, есть ли у него номер социального страхования. (Поле SocialSecurity). Имеет две кнопки-переключателя: один да и один нет. Если пользователь отвечает «да», то становится видимым другое поле (SSN). В противном случае он остается скрытым. Эта часть на самом деле работает. (показать / скрыть поле SSN)

JS необходимо сделать две вещи. Если пользователь отвечает «да», то поле SSN становится обязательным и должно подтвердить, что оно имеет 9 целых чисел. НО, если пользователь отвечает «нет», поле SSN, которое останется скрытым, больше не должно быть обязательным.

С чем я сталкиваюсь, так это получение SSN только в том случае, если пользователь отвечает «да», и подтвердите это правильно при этом обстоятельстве.

Демонстрация в Интернете

Вот код:

<div class="field SocialSecurity">
<span id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SocialSecurity_lb" class="EditingFormLabel">Do you have a Social Security Number?</span> 
<div id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_ncpsocialsecurity" class="EditingFormControlNestedControl editing-form-control-nested-control">
<span id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SocialSecurity_list" class="radio radio-list-vertical">
<input id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SocialSecurity_list_0" type="radio" name="p$lt$ctl03$pageplaceholder$p$lt$ctl00$On_lineForm$viewBiz$SocialSecurity$list" value="As a U.S. Citizen, permanent resident, or temporary working resident, I have a Social Security Number." />
<label for="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SocialSecurity_list_0">As a U.S. Citizen, permanent resident, or temporary working resident, I have a Social Security Number.</label><br />
<input id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SocialSecurity_list_1" type="radio" name="p$lt$ctl03$pageplaceholder$p$lt$ctl00$On_lineForm$viewBiz$SocialSecurity$list" value="Due to my international student status, my residency status, or my specific visa type, I do not have a Social Security Number." />
<label for="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SocialSecurity_list_1">Due to my international student status, my residency status, or my specific visa type, I do not have a Social Security Number.</label>
</span>

</div></div>

<div class="field SSN">
<label id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SSN_lb" class="EditingFormLabel" for="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SSN_txtText">Social Security Number</label> 
<div id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_ncpssn" class="EditingFormControlNestedControl editing-form-control-nested-control">
<input name="p$lt$ctl03$pageplaceholder$p$lt$ctl00$On_lineForm$viewBiz$SSN$txtText" type="text" maxlength="9" id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SSN_txtText" class="form-control" />
</div> </div>

$('.field.SocialSecurity input[type=radio]').on("change", function() {
  switch ($(this).val()) {
    case 'As a U.S. Citizen, permanent resident, or temporary working resident, I have a Social Security Number.':
      $('.field.SSN').show();
      $('.field.SSN input').focus();
      break;

    case 'Due to my international student status, my residency status, or my specific visa type, I do not have a Social Security Number.':
      $('.field.SSN').hide();
      break;
  }
});


//Here is the SS format validation section

function validateSSN() {
  if (!validateRequiredTextField('SSN', 'Social Security Number'))
    return false;

  var value = $('.field.SSN input').val();

  if (!isInteger(value) ||
    (value.length != 9) ||
    (value == '000000000') ||
    (value == '111111111') ||
    (value == '222222222') ||
    (value == '333333333') ||
    (value == '444444444') ||
    (value == '555555555') ||
    (value == '666666666') ||
    (value == '777777777') ||
    (value == '888888888') ||
    (value == '999999999') ||
    (value == '123456789')) {
    $('.field.SSN input').focus();
    alert("Invalid: Social Security Number");
    return false;
  }

  return true;
}

//overall form validation - section on SSN
function validateForm()

if (!validateSSN())
  return false;

Ответы [ 3 ]

0 голосов
/ 17 февраля 2020

Обновите функцию validateform (), как показано ниже

function validateForm()
{
if($("#p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SocialSecurity_list_0").is(':checked'))
{
    if($(".field.SSN input").val().trim() == "")
    {
        alert("You must provide SSN!");
        // Instead of alert, you can also apply some style to textBox e.g. red borders
        return false;
    }
    else if (!validateSSN())
    {
        return false;
    }
}
}
0 голосов
/ 17 февраля 2020

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

Решение:

  1. Используйте встроенную проверку браузера, добавив к полям атрибуты required и pattern. Простой шаблон Rx = [0-9]{9} позаботится о вашем требовании проверки 9 целых чисел. Не забудьте повторно проверить серверную часть после отправки формы.
  2. Используя JavaScript (/ jQuery), прослушайте изменения в поле SocialSecurity, а затем установите поле SSN * Атрибут 1017 * для true или false до включает или отключает в зависимости от выбранного значения SocialSecurity. Если вы не хотите, чтобы отключенное поле SSN было видимым, вы можете JS скрыть его родительский контейнер. Обратите внимание, что, пока поле имеет свойство disabled, оно не будет проверяться или отправляться независимо от того, является ли оно видимым или нет.

Демо-версия Woking:

$(function() {
  var $ssn = $(".SSN");
  //add and enable and disable custom event:
  $ssn.on("enable", function() {
    $(this).show().find("input").attr("disabled", false);
  }).on("disable", function() {
    $(this).hide().find("input").attr("disabled", true);
  })
  //set initial state to disabled:
  $ssn.trigger("disable");
  //listen for changes and change the $ssn state accordingly
  $("input[name='havessn']").on("change", function() {
    var val = $(this).val();
    if (val === 'nope') {
      $(".SSN").trigger("disable");
    } else {
      $(".SSN").trigger("enable");
    }
  })
});
input:required:valid {
  border: green solid 3px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
  <div class="field SocialSecurity">
    <span>Do you have a Social Security Number?</span>
    <div>
      <label><input type="radio" name="havessn" value="yup" required="required" />As a U.S. Citizen, permanent resident, or temporary working resident, I have a Social Security Number.</label><br />
      <label><input type="radio" name="havessn" value="nope" required="required" />Due to my international student status, my residency status, or my specific visa type, I do not have a Social Security Number.</label>
    </div>

    <div class="field SSN">
      <label>Social Security Number <input name="ssn" type="text" required="required" length="9" pattern="[0-9]{9}" title="Please provide a 9 digit SSN" />
</label>
    </div>
    <input type="submit" />
</form>

Демонстрация для вашего заданного c сценария использования с неповоротливыми громоздкими именами классов:

$(function() {
  var $ssn = $(".SSN");
  //add and enable and disable custom event:
  $ssn.on("enable", function() {
    $(this).show().find("input").attr("disabled", false);
  }).on("disable", function() {
    $(this).hide().find("input").attr("disabled", true);
  })
  //set initial state to disabled:
  $ssn.trigger("disable");
  //listen for changes and change the $ssn state accordingly
  $("input[name='p$lt$ctl03$pageplaceholder$p$lt$ctl00$On_lineForm$viewBiz$SocialSecurity$list']").on("change", function() {
    var val = $(this).val();
    if (val === "Due to my international student status, my residency status, or my specific visa type, I do not have a Social Security Number.") {
      $(".SSN").trigger("disable");
    } else {
      $(".SSN").trigger("enable");
    }
  })
});
input:required:valid {
  border: green solid 3px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="field SocialSecurity">
<span id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SocialSecurity_lb" class="EditingFormLabel">Do you have a Social Security Number?</span> 
<div id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_ncpsocialsecurity" class="EditingFormControlNestedControl editing-form-control-nested-control">
<span id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SocialSecurity_list" class="radio radio-list-vertical">
<input id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SocialSecurity_list_0" type="radio" name="p$lt$ctl03$pageplaceholder$p$lt$ctl00$On_lineForm$viewBiz$SocialSecurity$list" required="required" value="As a U.S. Citizen, permanent resident, or temporary working resident, I have a Social Security Number." />
<label for="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SocialSecurity_list_0">As a U.S. Citizen, permanent resident, or temporary working resident, I have a Social Security Number.</label><br />
<input id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SocialSecurity_list_1" type="radio" name="p$lt$ctl03$pageplaceholder$p$lt$ctl00$On_lineForm$viewBiz$SocialSecurity$list" required="required" value="Due to my international student status, my residency status, or my specific visa type, I do not have a Social Security Number." />
<label for="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SocialSecurity_list_1">Due to my international student status, my residency status, or my specific visa type, I do not have a Social Security Number.</label>
</span>

</div></div>

<div class="field SSN">
<label id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SSN_lb" class="EditingFormLabel" for="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SSN_txtText">Social Security Number</label> 
<div id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_ncpssn" class="EditingFormControlNestedControl editing-form-control-nested-control">
<input name="p$lt$ctl03$pageplaceholder$p$lt$ctl00$On_lineForm$viewBiz$SSN$txtText" type="text" required="required" length="9" pattern="[0-9]{9}" title="Please provide a 9 digit SSN" id="p_lt_ctl03_pageplaceholder_p_lt_ctl00_On_lineForm_viewBiz_SSN_txtText" class="form-control" />
</div></div>
0 голосов
/ 17 февраля 2020

вы должны создать логическое значение, которое имеет значение true, только если у пользователя есть SSN. И затем вызывайте свою функцию проверки, только если логическое значение истинно.

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