а.) В настоящее время у меня есть форма 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 ужасны, как показано выше.
Помощь будет оценена по достоинству.
@ProfessorAbronsius - Пожалуйста, посмотрите d.) Вот о чем я спрашиваю.
Пробовали ли вы проверить значение текстовой области по регулярному выражению? Какую проблему вы обнаружили? Пожалуйста, покажите нам этот код (SO не является службой первоначального кодирования, но мы будем рады рассмотреть код, вызывающий проблемы).
@AHaworth - я тестирую решения, предложенные ниже, а также другие фрагменты. Я слаб в JS :-) Буду продолжать шлифовать.
Вы спрашиваете, как заставить элемент быть :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, который может реализовать проверку содержимого текстовой области по регулярному выражению, поскольку текстовая область не имеет встроенной поддержки шаблонов.
Кроме того, почему нам нужно запрашивать сервер через Ajax для проверки содержимого текстовой области?
Не имеет значения, вы можете проверить в функции checkOnServer
все, что захотите, включая длину и регулярные выражения, клиентские или серверные. Перенесите сюда свою логику. Или переместите логику setCustomValidity
в функцию проверки.
Однако оцените ваши усилия.
У меня сложилось впечатление, что вы хотели проверить на сервере. Но опять же, все, что имеет значение, это то, что, если оно действительно, сделайте setCustomValidity('')
, а если недействительное, сделайте setCustomValidity('error msg')
.
Когда событие изменения происходит в элементе текстовой области, вы можете установить то же значение для скрытого элемента ввода, имеющего атрибут шаблона.
// 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 Я не говорю, что мой путь - единственный, но не связывайтесь с событием отправки, если вы не используете AJAX и т. д. Используйте некоторые другие события для обработки логики формы, например change
, invalid
и input
события и т. д.
Добавление проверки шаблона в текстовое поле
Элемент 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')
узнает, какой цвет следует применить: зеленый (действительный) или красный (недействительный)?
Спасибо. Я отмечаю это как принятый ответ. У меня не было времени, чтобы сделать это, но я думаю, что это наиболее близко к тому, что я хочу сделать. Спасибо х 3000.
На самом деле вы не задали вопрос и не указали, какие у вас проблемы, кроме
"...this ONLY checks minlength / maxlength and not the content..."
~ это просьба о помощи с вашим Javascript или CSS?