Чи можу я позначити поле як недійсне з JavaScript?


94

Читаючи цю публікацію, я виявив, що існують деякі псевдокласи для "дійсних" та "недійсних" вхідних значень, введені в HTML5.

Чи можу я позначити поле введення як недійсне / дійсне з javascript? Або як альтернативу, чи можу я замінити використаний метод перевірки?


Ви завжди можете подвоїти "недійсний" клас, але було б дуже цікаво дізнатися, що є кращий спосіб.
Пойнті

1
Так, звичайно, але це було б нудно;)
Свіш

1
Свіш, ти можеш переоцінити відповіді нижче? Схоже, dajavax надав відповідь, яка робить саме те, що ви хотіли. Іншим відвідувачам може бути корисно, якщо ви позначили відповідь dajavax прийнятою.
Кодос Джонсон,

@KodosJohnson Безумовно, спасибі за голови 🙂
Svish

Відповіді:


160

Для цього ви можете використовувати функцію customValidity.

Якщо додати повідомлення customValidity до поля, воно стає недійсним. Коли ви встановлюєте повідомлення як порожній рядок, воно знову стає дійсним (якщо воно недійсне з інших причин).

field.setCustomValidity("Invalid field."); зробить поле недійсним.

field.setCustomValidity(""); зробить поле дійсним, якщо воно не відповідає обмеженню HTML5.


1
Приголомшливо Дякую. Додано до codepen.io/kevinSuttle/post/the-current-state-of-web-forms
Кевін

4
Крім того, якщо ви хочете, щоб з'явилося повідомлення про дію браузера inputабо blurви можете використовувати field.reportValidity () відразу після.
Сем Карлтон,

4

Редагувати : Хтось пояснив, що ви шукаєте "дійсні" "недійсні" атрибути для DOM.

Я б додав атрибути до кожного тегу за допомогою dom_object.setAttribute("isvalid", "true"). Ви також можете мати функцію центральної перевірки, яка кожен раз оновлює ці атрибути (і використовує dom_object.getAttribute("isvalid")кожен раз).

Ви можете запускати цю функцію щоразу, коли елемент втрачає фокус, або коли завгодно.

Не зовсім елегантно, але, на жаль, зараз немає підтримки "псевдо" з JavaScript і HTML5.


Якщо я розумію ваше запитання, ви можете зробити перевірку за допомогою Javascript. Однак зауважте, що дуже легко обійти перевірку на стороні клієнта, особливо перевірку JavaScript . Ніколи не слід довіряти клієнтським даним і завжди перевіряти на стороні сервера.

Наприклад, я міг легко знайти ідентифікатори елементів, перевіривши вихідний код, а потім зробити, document.getElementById('some_id').setAttribute('max', new_number)щоб змінити максимальне значення (це був один із записів із вашого посилання).

Існують різні способи зробити це, тому я спробую дати вам загальну ідіому.

Ви можете захопити значення, виконавши document.getElementById('form_element_id').value(переконайтеся, що ви надаєте форму, nameяка надсилається на сервер, і idяку використовує javascript). Для текстових областей ви можете використовувати .innerHTML.

Тоді у вас є значення у змінній, є різні способи перевірити це.

Наприклад, ви могли б це зробити if (parseInt(my_value) < 0) //error. Ви також можете використовувати регулярні вирази, я не буду все це пояснювати, але ви можете розпочати тут http://www.w3schools.com/jsref/jsref_obj_regexp.asp . Я знаю, що w3schools - не найкраще джерело, але я вважаю, що це нормальне місце для початку.

Тепер щодо частини перевірки: додайте onsubmit="return validateForm()до тегу форми, де validateForm () - це функція, яка виконує всі перевірки. І функція просто повертається, trueякщо дійсне та falseінше. Це замінює функцію перевірки за замовчуванням (яка за замовчуванням нічого не робить).

Отже, у наведеному вище прикладі //errorбуде замінено на return false. Ви можете робити й інші речі; такі як попередження про помилку, а потім повернення false. Ви також можете використовувати javascript для виділення недійсних полів (не впевнений, що це те, що ви маєте на увазі під " позначення поля вводу як недійсного / дійсного з javascript ")

Звичайно, якщо ви не хочете перевіряти всі поля, вам потрібно повернути true, лише якщо певні проходять. Знову ж таки, не варто на це покладатися, але якщо ви хочете лише стримати пересічних людей, то це просте рішення.


9
Ви повністю праві, але я не думаю, що ви повністю зрозуміли питання. У HTML5 існують різні способи додавання значень атрибутів до розмітки HTML, що передбачають вбудовані правила перевірки. Коли браузер застосовує ці правила, поле введення буде відповідати псевдокласам ": valid" або ": invalid" у CSS. Таким чином, ви можете писати HTML із цими атрибутами, а CSS із селекторами ": valid" та ": invalid" із правилами та надавати візуальний зворотний зв'язок без будь-якого JavaScript. Питання в тому, чи доступний статус ": допустимий" як атрибут DOM.
Пойнті

-17

Чи можу я позначити поле введення як недійсне / дійсне з javascript?

На жаль, ви не можете стилізувати псевдокласи в JavaScript, оскільки вони не є реальними елементами, вони не існують у фактичному DOM.

З ванільним JavaScript ви використовуєте API перевірки .

У jQuery ви можете просто зробити це, http://jsfiddle.net/elclanrs/Kak6S/

if ( $input.is(':invalid') ) { ... }

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

Якщо ви використовуєте перевірку HTML5, дотримуйтесь розмітки. В іншому випадку ви можете вимкнути перевірку HTML5 за $form.attr('novalidate', 'novalidate')допомогою JS і перевірити ваші поля, а потім додавати validабо invalidкласи, де це потрібно. Я створив плагін, який працює так, щоб підтримувати браузери, що не підтримують HTML5.


Що ви маєте на увазі, що не можете їх укласти? Я це вже роблю. input:invalid + label::after{content: " INVALID";color: red;}Додає червоний шматок НЕВІЛЬНОГО тексту після мітки, яку я маю поруч із полем введення, якщо поле є недійсним (наприклад, якщо в полі електронної пошти є невірний електронний лист)
Свіш,

11
"Чи можу я позначити поле введення як недійсне / дійсне з javascript?" "На жаль, ви не можете стилізувати псевдокласи з JavaScript". Це не питання.
mikemaccana

Ви повинні мати можливість використовувати CSSOM для динамічного визначення нового класу з псевдокласом ...
Бретт Замір,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.