TextArea — проверка Javascript с использованием псевдокласса CSS и регулярного выражения

а.) В настоящее время у меня есть форма php/html с проверкой ввода с использованием шаблонов ввода HTML. б.) Чтобы показать, что введенные данные верны, я использую псевдосвойство CSS user-invalid/user-valid через класс check_valid, как показано ниже;

input.check_valid:user-invalid     { border: 4px dotted red;   }
input.check_valid:user-valid       { border: 4px solid  green; }

в.) Проблема связана с текстовыми областями и отсутствием поддержки шаблонов. Что у меня есть, так это;

textarea.check_valid:user-invalid  { border: 4px dotted red;   }
textarea.check_valid:user-valid    { border: 4px solid  green; }

Однако это ТОЛЬКО проверяет минимальную/максимальную длину содержимого в текстовой области, а не содержимое в текстовой области.

Однако у меня есть проверка на стороне сервера (в php), которая проверяет содержимое текстовой области и работает нормально. Но я хотел бы добавить зеленую/красную рамку, подобную этой, в других полях ввода, когда содержимое соответствует шаблону (который содержит регулярное выражение)

d.) Я ищу фрагмент JavaScript, который будет имитировать поведение check_valid:user-invalid/check_valid:user-valid, когда пользователь покидает текстовую область после ввода некоторого контента. Фрагмент javascript должен проверять содержимое на соответствие регулярному выражению (это обеспечивает поддержку шаблонов для текстовой области).

Это то, что у меня есть (неполное) на данный момент;

const textArea1 = document.getElementById("textarea1");

textArea1.addEventListener("change", (event) => {

  let patternTextArea1 = ~^[a-zA-Z0-9:\s,.'&()/\-]{10,550}$~; 
   
  if ( // test textarea content against the regex ) {
  
      // apply user-valid - green border
    
  } else {
  
     // apply user-invalid - red dotted line
    
  }
  
});

Мои навыки работы с Javascript ужасны, как показано выше.

Помощь будет оценена по достоинству.

На самом деле вы не задали вопрос и не указали, какие у вас проблемы, кроме "...this ONLY checks minlength / maxlength and not the content..." ~ это просьба о помощи с вашим Javascript или CSS?

Professor Abronsius 27.04.2024 10:31

@ProfessorAbronsius - Пожалуйста, посмотрите d.) Вот о чем я спрашиваю.

MarcoZen 27.04.2024 13:33

Пробовали ли вы проверить значение текстовой области по регулярному выражению? Какую проблему вы обнаружили? Пожалуйста, покажите нам этот код (SO не является службой первоначального кодирования, но мы будем рады рассмотреть код, вызывающий проблемы).

A Haworth 27.04.2024 14:40

@AHaworth - я тестирую решения, предложенные ниже, а также другие фрагменты. Я слаб в JS :-) Буду продолжать шлифовать.

MarcoZen 27.04.2024 17:08
Поведение ключевого слова "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
4
80
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы спрашиваете, как заставить элемент быть :user-valid или другим :user-invalid. Это возможно? Да. Используя inputField.setCustomValidity(msg). Ну, на самом деле это будет работать для :valid и :invalid, но для этого мы можем изменить CSS и переключить класс .user-interacted, чтобы он проверял валидность только при взаимодействии с пользователем.

Итак, это две вещи: setCustomValidity и добавление .user-interacted.

textarea.addEventListener("input", checkOnServer)

function checkOnServer(ev) {
  var elem = ev.target

  // this of course will use AJAX to query server
  setTimeout(function() {
    elem.classList.add("user-interacted")
    var value = elem.value
    var msg = value.length > 3 ? '' : 'Length must be longer than 3 chars'
    elem.setCustomValidity(msg)
  }, 100)

}
textarea.check_valid.user-interacted:invalid {
  border: 4px dotted red;
}

textarea.check_valid.user-interacted:valid {
  border: 4px solid green;
}

textarea {
  outline: none;
}
<p>let's assume valid is > 3 chars</p>
<textarea id = "textarea" class = "check_valid" cols = "80" rows = "5"></textarea>

Привет @IT Goldman. Я прошу фрагмент JS, который может реализовать проверку содержимого текстовой области по регулярному выражению, поскольку текстовая область не имеет встроенной поддержки шаблонов.

MarcoZen 27.04.2024 13:44

Кроме того, почему нам нужно запрашивать сервер через Ajax для проверки содержимого текстовой области?

MarcoZen 27.04.2024 13:47

Не имеет значения, вы можете проверить в функции checkOnServer все, что захотите, включая длину и регулярные выражения, клиентские или серверные. Перенесите сюда свою логику. Или переместите логику setCustomValidity в функцию проверки.

IT goldman 27.04.2024 13:48

Однако оцените ваши усилия.

MarcoZen 27.04.2024 13:48

У меня сложилось впечатление, что вы хотели проверить на сервере. Но опять же, все, что имеет значение, это то, что, если оно действительно, сделайте setCustomValidity(''), а если недействительное, сделайте setCustomValidity('error msg').

IT goldman 27.04.2024 13:52

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

// stop the default invalid message from showing
document.forms.form01.addEventListener('invalid', e => {
  e.preventDefault();
}, true);

document.forms.form01.addEventListener('change', e => {
  let form = e.target.form;
  if (e.target.dataset.name) {
    // set the input to have the same value as the textarea
    form[e.target.dataset.name].value = e.target.value;
    // set class name according to validity
    e.target.classList.add('valid');
    if (!form[e.target.dataset.name].validity.valid) {
      e.target.classList.replace('valid', 'invalid');
    }
  }
});

document.forms.form01.addEventListener('submit', e => {
  e.preventDefault();
  let data = new FormData(e.target);
  console.info(...data);
});
form {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}

textarea.invalid {
  border: 4px dotted red;
}

textarea.valid {
  border: 4px solid green;
}

input:user-invalid {
  border: 4px dotted red;
}

input:user-valid {
  border: 4px solid green;
}
<form name = "form01">
  <input type = "text" name = "other" pattern = ".{2,10}" required>
  <textarea data-name = "longtext" name = ""></textarea>
  <input type = "text" name = "longtext"
    pattern = "[a-zA-Z0-9:\s,\.'&\(\)/\-]{10,550}"
    style = "display:none" required>
  <button type = "submit">Submit</button>
</form>

Интересно, но это выше моего понимания. Однако оцените ваши усилия. Я не собираюсь менять код отправки формы.

MarcoZen 27.04.2024 13:38

@MarcoZen Я не говорю, что мой путь - единственный, но не связывайтесь с событием отправки, если вы не используете AJAX и т. д. Используйте некоторые другие события для обработки логики формы, например change, invalid и input события и т. д.

chrwahl 27.04.2024 14:51
Ответ принят как подходящий

Добавление проверки шаблона в текстовое поле

Элемент textarea не имеет атрибута шаблона, но вы можете добавить его, используя атрибут данных .

В событии изменения вы можете протестировать шаблон и использовать setCustomValidity, чтобы добавить сообщение проверки.

Браузер автоматически отобразит пользовательское сообщение так же, как он проверяет минимальную, максимальную длину и требуемые значения.

Примечания: Существуют псевдоклассы для состояний :invalid и :valid, которые работают автоматически. Кроме того, пользовательские ошибки проверки выражаются на фиксированном языке, в отличие от ошибок стандартного шаблона. Интернационализация потребует дополнительного кода (не показано).

Фрагмент кода Пример был очень простым, чтобы показать, как он работает.

const textarea = document.querySelector('textarea')

textarea.addEventListener('input', () => {
  const reg = new RegExp(textarea.dataset.pattern, 'gmi');
  textarea.setCustomValidity('');
  if (!reg.test(textarea.value)) {
    textarea.setCustomValidity('Invalid characters in text');
  }
  textarea.reportValidity(); // optional - displays popup
})
textarea {
  height: 2rem;
  padding: 0.5rem;
  border: 4px dotted black;
  outline: none;
}

textarea:valid {
  border-color: green;
}

textarea:invalid {
  border-color: red;
}

textarea:focus::placeholder {
  opacity: 0;
}
<textarea 
  required 
  minlength = "10" 
  maxlength = "500" 
  placeholder = "type some text here"
  data-pattern = "(?<!\n)^[()\w\s]+$(?!\n)">
</textarea>

Как textarea.classList.add('check_valid') узнает, какой цвет следует применить: зеленый (действительный) или красный (недействительный)?

MarcoZen 27.04.2024 17:19

Спасибо. Я отмечаю это как принятый ответ. У меня не было времени, чтобы сделать это, но я думаю, что это наиболее близко к тому, что я хочу сделать. Спасибо х 3000.

MarcoZen 17.05.2024 13:38

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