Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.12.2021, 19:59
Новичок на форуме
Отправить личное сообщение для Paulsw01 Посмотреть профиль Найти все сообщения от Paulsw01
 
Регистрация: 02.07.2021
Сообщений: 7

Валидация полей для ввода
Как реализовать что бы при потере фокуса происходила проверка на корректность введённого значения и замена его на корректное при необходимости по следующим правилам:
Из строки значения должны удаляться все символы, кроме допустимых.
Пробелы и дефисы в начале и конце значения должны удаляться.
Несколько идущих подряд пробелов или дефисов должны заменяться на один.
Первая буква должна приводиться к верхнему регистру, а все остальные — к нижнему.

В настоящее время реализован только перевод первой буквы в верхний регистр и запрещен ввод латиницы.

<form id="form" onsubmit="return false;">
    <input type="text" class="validation" id='surname' placeholder="Фамилия" />
    <input type="text" class="validation" id='name' placeholder="Имя" />
    <input type="text" class="validation" id='patronymic' placeholder="Отчество" />
    <button id="button" class="btn btn-success" >Отправить</button>
  </form>


let surname = document.getElementById("surname")
let inputName = document.getElementById("name")
let patronymic = document.getElementById("patronymic")
let button = document.getElementById("button")
let form = document.getElementById("form")

let p = document.createElement('p');

let inp = document.querySelector('.validation')

let surnameStr = inp.textContent


function validation(inp) {

inp.addEventListener('input', function () {
  this.value = this.value.replace(/[^А-Яа-яЁё -]/g, '')

  function changeStr(surnameStr) {
    surnameStr.replace(/\s+/g, ' ')
    surnameStr.replace(/^([-=\s]*)([a-zA-Z0-9])/gm, "$2")

    if (!surnameStr) return surnameStr;
    return surnameStr[0].toUpperCase() + surnameStr.slice(1)
  }

  changeStr()
})
}

validation(surname)
validation(inputName)
validation(patronymic)

document.forms[0].addEventListener('change', function (e) {
  if (e.target.tagName = 'INPUT') e.target.value = e.target.value.charAt(0).toUpperCase() + e.target.value.slice(1)
})

button.onclick = function() {
  let text = surname.value + ' ' + inputName.value + ' ' +  patronymic.value;
  p.innerHTML = text;
  form.append(p)
};
Ответить с цитированием
  #2 (permalink)  
Старый 17.12.2021, 20:58
Аватар для ksa
ksa ksa на форуме
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,210

Сообщение от Paulsw01
Пробелы и дефисы в начале и конце значения должны удаляться.
Как вариант...
const val = '  -пример ---'
const re = /^[\s-]*|[\s-]*$/g
alert(val.replace(re, ''))
Ответить с цитированием
  #3 (permalink)  
Старый 17.12.2021, 21:11
Аватар для ksa
ksa ksa на форуме
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,210

Сообщение от Paulsw01
Несколько идущих подряд пробелов или дефисов должны заменяться на один.
Как вариант...
const val = '> -  - пример ---'
let re = /(\s){2,}/g
alert(val.replace(re, '$1'))
re = /(-){2,}/g
alert(val.replace(re, '$1'))
Ответить с цитированием
  #4 (permalink)  
Старый 17.12.2021, 21:12
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,743

replace не меняет исходную строку, а возвращает новую с заменами
Строки 20 - 21 должны быть так
surnameStr = surnameStr
      .replace(/\s+/g, ' ')
      .replace(/^([-=\s]*)([a-zA-Z0-9])/gm, "$2")

Для удаления пробелов вначале и конце trim()
Ответить с цитированием
  #5 (permalink)  
Старый 17.12.2021, 21:13
Аватар для ksa
ksa ksa на форуме
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,210

Сообщение от Paulsw01
Из строки значения должны удаляться все символы, кроме допустимых.
Как вариант...
const val = '> -  - пример 123 NG ---'
const re = /[123NG]/g
alert(val.replace(re, ''))
Ответить с цитированием
  #6 (permalink)  
Старый 17.12.2021, 21:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

валидация формы
Paulsw01,

<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
    </style>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            const form = document.getElementById("form");
            function validation(input) {
                let txt = input.value.trim();
                let reg = /(^[^А-Яа-яЁё]+)|([^А-Яа-яЁё]+$)/g;
                txt = txt.replace(reg, '');
                reg = /[-\s]+/g;
                txt = txt.replace(reg, ([a, ...b]) => a);
                reg = /[^А-Яа-яЁё\s-]/g;
                txt = txt.replace(reg, '');
                txt = txt.toLowerCase();
                reg = /^./;
                txt = txt.replace(reg, a => a.toUpperCase());
                if (txt !== input.value) input.value = txt;
                return !!txt.length;
            }
            form.addEventListener("focusout", function({
                target
            }) {
                if (target = target.closest(".validation")) validation(target)
            })
            let timer;
            form.addEventListener("submit", function(event) {
                event.preventDefault();
                let inputs = Array.from(this.querySelectorAll(".validation"));
                let validate = inputs.every(validation);
                let txt = "Не все поля заполнены правильно!"
                if (validate) txt = inputs.map(({
                    value
                }) => value).join(" ");
                out.innerHTML = txt;
                window.clearTimeout(timer);
                if (!validate) timer = window.setTimeout(_ => out.innerHTML = "", 10000)
            })
        });
    </script>
</head>
<body>
    <p id="out"></p>
    <form id="form" >
        <input type="text" class="validation" id='surname' placeholder="Фамилия" />
        <input type="text" class="validation" id='name' placeholder="Имя" />
        <input type="text" class="validation" id='patronymic' placeholder="Отчество" />
        <button id="button" class="btn btn-success">Отправить</button>
    </form>
</body>
</html>

Последний раз редактировалось рони, 17.12.2021 в 21:47.
Ответить с цитированием
  #7 (permalink)  
Старый 17.12.2021, 21:36
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,743

Ну нельзя же так!

рони, не учи плохому.

Показывать сообщение на 2 сек!
А что, человек не имеет права отвернуться? глаза прикрыть после тяжкого ввода?
Моргнул, не увидел сообщения и довольный сидишь ждешь до посинения.
Ответить с цитированием
  #8 (permalink)  
Старый 17.12.2021, 21:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

voraa,
что мешает время показа увеличить(строка 41 параметр 2000) или отменить(закомментируйте строки 40-41), сделав свой вывод ошибок. )))
Ответить с цитированием
  #9 (permalink)  
Старый 17.12.2021, 21:44
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,743

рони, Ничего не мешает.
Просто, имея больший опыт, не надо показывать такие примеры.
Вообще грамотным интерфейсам надо учить и учить.
А то столько кошмара приходится видеть.
Ответить с цитированием
  #10 (permalink)  
Старый 17.12.2021, 21:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

voraa,
не понимаю, увеличил время показа до 10 секунд.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Checkbox ajax unchecked не передает значение katalizator AJAX и COMET 10 05.04.2020 09:08
Форма отследить событие ввода в одной из полей Sergey1986 AJAX и COMET 4 30.05.2018 22:55
Разработать скрипт для ввода строки и поиска в ней фиксированной последовательности с marc Общие вопросы Javascript 2 02.12.2017 09:59
Регулярка для поля ввода числа Bab Общие вопросы Javascript 14 08.04.2017 19:11
Как заполнить значения для скрытых полей из <input type=”text”> ? Surlik jQuery 2 13.11.2012 00:43