Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.04.2020, 20:18
Кандидат Javascript-наук
Отправить личное сообщение для Lefseq Посмотреть профиль Найти все сообщения от Lefseq
 
Регистрация: 19.04.2019
Сообщений: 124

Выделение инпутов и сообщения о необходимости заполнить пустые поля
Здравствуйте. Помогите пожалуйста решить следующую задачу. Имеется два инпута один для ввода имени, другой для фамилии. Если пользователь игнорит ввод данных и сразу жмет на кнопку, появляется сообщение о необходимости заполнить поля. В данном коде реализовано лишь выделение одного пустого инпута красной рамкой. А нужно чтобы оба поля выделялись рамками и над каждым из них появлялось сообщение о необходимости заполнить поля.

<p>
    <input id="inp" class="name" autocomplete="name" name="name" placeholder="Ваше имя" required />
</p>
  <p>
  <input id="inp" class="lastname" autocomplete="lastname" name="lastname" placeholder="Ваша фамилия" required />
</p> 
 
    <button id="openwindow">Отправить</button>
 
    <div id="window9">  
        <p>Содержимое окна</p>
        <button onclick="show('none')" id="closewindow9">X</button>
    </div>


"use strict";
 
        let inp = document.getElementById("inp");
 
        inp.addEventListener("mousedown", () => {
            inp.classList.remove("isNotValid");
        });
        
        inp.addEventListener("blur", valid.bind(null, inp));
 
        document.getElementById("openwindow").addEventListener("click", () => {
            if (!valid(inp)) return false;
            show("block");
 
        });
 
        function valid(inp) {
            if (!inp.value) {
                inp.classList.add("isNotValid");
                return false;
            }
            return true;
        }
 
        function show(state) {
          // if (state === "block") {
          //   timer = window.setTimeout(move, 0);
          // } else {
          //   clearTimeout(timer);
          // }
          document.getElementById('window9').style.display = state;
          // document.getElementById('wrap9').style.display = state;
          
        }


Код:
                 #window9 {
                    width: 500px;
                    height: 300px;
                    margin: auto;
                    display: none;
                    background: #fff;
                    border: 1px solid #365E97;
                    z-index: 200;
                    position: fixed;
                    left: 0;
                    right: 0;
                    top: 0;
                    bottom: 0;
                    padding: 15px 30px 30px 30px;
                    vertical-align:middle;
                    -webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);
                    box-shadow:0 5px 15px rgba(0,0,0,.5);
                }
         
         
                #closewindow9 {
                    background-color: red;
                    position: absolute;
                    right: 0;
                    top: 0;
                }
                
                .name {
                     border: 1px solid #eeeeee;
                }
 
                .isNotValid {
                    border: 2px solid #ff0000;
                }
Ответить с цитированием
  #2 (permalink)  
Старый 06.04.2020, 20:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Lefseq,
валидация формы
пример правильно оформленной формы
Ответить с цитированием
  #3 (permalink)  
Старый 07.04.2020, 09:13
Кандидат Javascript-наук
Отправить личное сообщение для Lefseq Посмотреть профиль Найти все сообщения от Lefseq
 
Регистрация: 19.04.2019
Сообщений: 124

рони, а как сделать, чтобы еще и рамки инпутов подсвечивались красным?
https://javascript.ru/forum/css-html...tml#post512953
Ответить с цитированием
  #4 (permalink)  
Старый 07.04.2020, 09:44
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

:required:invalid {
    border стили
}
Ответить с цитированием
  #5 (permalink)  
Старый 07.04.2020, 10:05
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от Lefseq
рамки инпутов подсвечивались красным?
строка 45 и 138

<style>

form {
    max-width: 20em;
    padding: 1em;
    margin: auto;
    font: 1em system-ui;
}

form > * {
    display: flex;
    flex-direction: column;
    margin-bottom: 1em;
}

input, button, select, textarea { font: inherit; }

textarea { resize: vertical; }

fieldset {
    border: 1px solid #f1f1f1;
    border-radius: 0.5em;
    flex-direction: row;
}

input:not([type]), input[type="tel"], input[type="email"], input[type="date"], input[type="number"], textarea {
    border: none;
    border-radius: 0.5em;
    background: #f1f1f1;
    padding: 0.5em;
}

span.error-message {
    padding: 0.5em;
    border-radius: 0.5em;
    color: #F44336;
    font-size: 80%;
    font-weight: bold;
    display: block;
}

:valid + span.error-message {
    display: none;
}
.err input:invalid {
    border: 2px solid #FF0000;
   }
</style>

<form>
    <label>
        Фамилия
        <input name="family" required autocomplete="family-name" minlength="1" pattern="\s*\S([\s\S]*\S)?\s*"
            data-custom-validity="Введите свою фамилию!">
    </label>

    <label>
        Имя
        <input name="name" required autocomplete="given-name" minlength="1" pattern="\s*\S([\s\S]*\S)?\s*"
            data-custom-validity="Введите своё имя!">
    </label>

    <label>
        Телефон
        <input name="phone" type="tel" required autocomplete="tel"
            data-custom-validity="Введите свой номер телефона!">
    </label>

    <label>
        Э-почта
        <input name="mail" type="email" required autocomplete="email"
            data-custom-validity="Введите свой Email!">
    </label>

    <label>
        Дата отправки
        <input name="date" type="date" required
            data-custom-validity="Введите дату!">
    </label>

    <fieldset>
        <legend>Подтверждение</legend>
        <label>
            <input name="check" type="checkbox" required
            data-custom-validity="Подтвердите!">
            Согласен с условиями
        </label>
    </fieldset>


    <fieldset>
        <legend>Пол</legend>
        <label>
            <input name="radio" type="radio" value="male" required autocomplete="sex"
            data-custom-validity="Выберите свой пол!">
            Мужчина
        </label>
        <label>
            <input name="radio" type="radio" value="female" required autocomplete="sex"
            data-custom-validity="Выберите свой пол!">
            Женщина
        </label>
    </fieldset>

    <label>
        Сообщение
        <textarea name="text" required minlength="10" maxlength="1500"
            data-custom-validity="Заполните поле (от 10 до 1500 символов)!"></textarea>
    </label>

    <label>
        Год рождения
        <input name="select" type="number" min="1880" max="2001" step="1" required autocomplete="bday-year" size="4"
            data-custom-validity="Введите год рождения (18+)">
    </label>

    <button>Отправить</button>
</form>

<script>

    addEventListener("change", ({ target }) => {
        target.checkValidity()
    });

    for(const element of document.querySelector("form").elements) {
        element.addEventListener("invalid", event => {
            event.preventDefault();

            for(const label of event.target.labels) {
                for(const errorMessage of label.querySelectorAll(".error-message"))
                    errorMessage.remove();

                const errorMessage = document.createElement("span");
                errorMessage.className = "error-message";
                errorMessage.textContent = event.target.dataset.customValidity || event.target.validationMessage;
                label.append(errorMessage); 
                label.classList.toggle("err", !event.target.validity.valid)
            }
        });
    }

</script>
Ответить с цитированием
  #6 (permalink)  
Старый 07.04.2020, 10:07
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

laimas,
а как изначально не выделять без скрипта?
Ответить с цитированием
  #7 (permalink)  
Старый 07.04.2020, 10:34
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от рони
а как изначально не выделять без скрипта?
Не понял. Если не заполняли еще? Можно отображать бордюр только по фокусу.

Последний раз редактировалось laimas, 07.04.2020 в 10:46.
Ответить с цитированием
  #8 (permalink)  
Старый 07.04.2020, 10:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от laimas
Не понял.
как убрать рамку при заходе на страницу?

<!DOCTYPE html>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  :required:invalid {
   border: 2px solid #FF0000;
   }
  </style>

</head>
<body>
<form>
    <label>
        Фамилия
        <input name="family" required autocomplete="family-name" minlength="1" pattern="\s*\S([\s\S]*\S)?\s*"
            data-custom-validity="Введите свою фамилию!">
    </label>
</form>
</body>
</html>
Ответить с цитированием
  #9 (permalink)  
Старый 07.04.2020, 11:00
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

<style>
:required:focus:invalid {
    border: 1px solid #f00;
}
</style>
<input required="" placeholder="number" pattern="\d+" />
Ответить с цитированием
  #10 (permalink)  
Старый 07.04.2020, 14:14
Кандидат Javascript-наук
Отправить личное сообщение для Lefseq Посмотреть профиль Найти все сообщения от Lefseq
 
Регистрация: 19.04.2019
Сообщений: 124

рони,
Спасибо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как заполнить данными из массива динамические поля prog77 jQuery 8 19.07.2017 12:47
Как заполнить поля VK? veg Events/DOM/Window 1 17.11.2016 10:08
Заполнить поля формы из таблицы Frost-56rus Общие вопросы Javascript 1 05.11.2015 01:25
Резиновые дивы с прокруткой Java Script Mary-Jay Элементы интерфейса 10 24.07.2013 17:51
callback получить и заполнить 2 поля Viper jQuery 3 01.09.2009 14:20