Где моя функция проверки не работает для выбора

3 года в js, и я не могу использовать простые библиотеки валидатора. Поэтому я решил создать свой собственный. он работает, добавляя атрибут просто обязан ко всем входам, select, textarea и т. д. (еще не пробовал на радио). функция проверяет, является ли ввод пустым, и возвращает true. код функции, как показано ниже

он работает, вызывая функцию с формой, являющейся ее вводом функции Проблема в том, что он не работает на моем выбранном входе.
вот мой пример кода

function jempty_form(x) {
  var n = false;
  $(x).find("[jmust]").each(function() {
    if ($(this).val() != "") {
      $(this).css("border", "none").css("border", "1px solid grey");
    } else {
      $(this).css("border", "1px solid red").addClass("animated shake");
      n = true;
      // alert("An input is Empty")
    }
  })
  return n;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select class = " form-control " id = "gender" jmust name = "gender">
  <option disabled selected>Select Gender</option>
  <option value = "female">Female</option>
  <option value = "male">Male</option>
</select>
<script>
  jempty_form("#myformid");
</script>

Спасибо..!

Вам следует рассмотреть возможность использования атрибутов data-* вместо пользовательских (недействительных) атрибутов.

Steve T 20.03.2019 07:33

пожалуйста, объясните больше

MJob 20.03.2019 07:35
jmust не является допустимым атрибутом для HTML-тегов. Если вам нужны пользовательские атрибуты, вы должны добавить к ним префикс data-: w3schools.com/tags/att_global_data.asp.
Steve T 20.03.2019 07:40

в вашем примере значение select равно disable, поэтому всегда будет false

Shibon 20.03.2019 07:42

вы можете просто добавить общий класс для всех входных данных и выбрать в своей форме вместо использования пользовательского атрибута или $(x).find("input,select").each(function(){

Deepak A 20.03.2019 07:53

ты прав @SteveT. Моя первая ошибка там

MJob 20.03.2019 08:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваше условие $(this).val() != "" не работает для пустых выборок, потому что пустая строка не равна null в JS.

Вместо этого вы можете просто проверить, является ли значение правдивый. Это делается путем простого тестирования $(this).val(), которое будет преобразовано в логическое значение при оценке в контексте условия.

Я бы также рекомендовал:

  • используя атрибуты data- (здесь data-jmust) вместо недопустимых атрибутов,
  • использование класса CSS для состояния ошибки вместо ручной настройки CSS (таким образом вы можете легко восстановить ввод в исходное состояние и не путать стиль с функциональностью).

Демо:

function jempty_form(x) {
  var valid = true;
  
  $(x).find('[data-jmust]').each(function () {
    var action = $(this).val() ? 'removeClass' : 'addClass';
    valid = valid && !!$(this).val();
    $(this)[action]('invalid animated shake');
  });
  
  // For debugging purposes
  console.info(valid ? 'valid form' : 'invalid form');
  
  return valid;
}

jempty_form('#myformid');

$(function () {
  $(':input').on('change', function (e) {
    jempty_form('#myformid');
  });
});
.invalid { border: 1px solid red; }
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id = "myformid">
  <select data-jmust class = "form-control" id = "gender" name = "gender">
    <option disabled selected>Select Gender</option>
    <option value = "female">Female</option>
    <option value = "male">Male</option>
  </select>
</form>

Просто небольшое пояснение по строке valid = valid && !!$(this).val();, это быстрый способ сказать: «форма действительна, если она уже действительна (до текущего поля), и значение текущего ввода также не пусто».

Использование !! преобразует значение в логическое значение, указывающее, является ли оно правдивый или нет.

<form id = "myformid" action = "" method = "POST"> 
    <select class = " form-control " id = "gender"  jmust name = "gender">
        <option  disabled selected>Select Gender</option>
        <option value = "female" >Female</option>
        <option value = "male">Male</option>
    </select>

</form> 
<script
    src = "http://code.jquery.com/jquery-3.3.1.slim.min.js"
    integrity = "sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E = "
crossorigin = "anonymous"></script>
<script language = "JavaScript">

    function jempty_form(x) {
        var n = false;
        $(x).find("[jmust]").each(function () {
            if ($(this).val()) {
                $(this).css("border", "none").css("border", "1px solid grey");
            } else {
                $(this).css("border", "1px solid red").addClass("animated shake");
                n = true;
                // alert("An input is Empty")
            }
        })
        return n;
    }

    console.info(jempty_form("#myformid"));

</script>
</body>
</html>

Я сделал небольшое изменение,

if ($(this).val()) { 

на месте

if ($(this).val() != ""){

if ($(this).val()) и if ($(this).val() != "") оба работают одинаково в его случае

Deepak A 20.03.2019 07:56

нет, проверьте еще раз, оба показывают разные результаты, цвет границы меняется

Shoyeb Sheikh 20.03.2019 07:58

хотя не рекомендуется использовать пользовательский атрибут, такой как «jmust»

Deepak A 20.03.2019 11:07

Лучше иметь атрибут данных или что-то в этом роде

Shoyeb Sheikh 20.03.2019 11:43

Другие вопросы по теме