Czy mogę oznaczyć pole jako nieprawidłowe z javascript?


96

Czytając ten post odkryłem, że istnieje kilka pseudoklas dla „prawidłowych” i „nieprawidłowych” wartości wejściowych wprowadzonych do HTML5.

Czy istnieje sposób, aby oznaczyć pole wejściowe jako nieprawidłowe / prawidłowe w javascript? Lub alternatywnie, czy mogę zastąpić użytą metodę walidacji?


Zawsze możesz podwoić klasę „niepoprawną”, ale byłoby naprawdę interesujące dowiedzieć się, że istnieje lepszy sposób.
Pointy

1
Tak, oczywiście, ale to byłoby nudne;)
Svish

1
Svish, czy możesz ponownie ocenić poniższe odpowiedzi? Wygląda na to, że dajavax podał odpowiedź, która robi dokładnie to, czego chciałeś. Może być pomocne dla innych odwiedzających, jeśli zaznaczyłeś odpowiedź dajavax jako zaakceptowaną.
Kodos Johnson,

@KodosJohnson Zdecydowanie, dzięki za ostrzeżenia 🙂
Svish

Odpowiedzi:


163

W tym celu możesz użyć funkcji customValidity.

Jeśli dodasz komunikat customValidity do pola, stanie się on nieprawidłowy. Gdy ustawisz wiadomość jako pusty ciąg, stanie się ponownie ważna (chyba że jest nieważna z innych powodów).

field.setCustomValidity("Invalid field."); sprawi, że pole będzie nieprawidłowe.

field.setCustomValidity(""); sprawi, że pole będzie prawidłowe, chyba że nie spełni ograniczenia HTML5.



6
Ponadto, jeśli chcesz, aby komunikat o poprawności przeglądarki pojawił się na inputlub blurmożesz użyć field.reportValidity () zaraz po.
Sam Carlton

4

Edycja : ktoś wyjaśnił, że szukasz „prawidłowych” „nieprawidłowych” atrybutów DOM.

Dodałbym atrybuty do każdego tagu za pomocą dom_object.setAttribute("isvalid", "true"). Możesz również mieć centralną funkcję walidacji, która aktualizuje te atrybuty za każdym razem (i za dom_object.getAttribute("isvalid")każdym razem).

Możesz uruchomić tę funkcję za każdym razem, gdy element traci fokus lub kiedy chcesz.

Niezupełnie eleganckie, ale niestety nie ma teraz wsparcia „pseudo” w javascript i HTML5.


Jeśli rozumiem Twoje pytanie, możesz przeprowadzić walidację za pomocą JavaScript. Należy jednak pamiętać, że bardzo łatwo jest ominąć weryfikację po stronie klienta, zwłaszcza walidację javascript . Nigdy nie powinieneś ufać danym klienta i zawsze sprawdzaj po stronie serwera.

Na przykład, mogłem łatwo znaleźć identyfikatory elementów, sprawdzając kod źródłowy, a następnie document.getElementById('some_id').setAttribute('max', new_number)zmienić wartość maksymalną (był to jeden z wpisów z twojego linku).

Można to zrobić na różne sposoby, więc spróbuję podać ogólny idiom.

Możesz pobrać wartość, robiąc document.getElementById('form_element_id').value(upewnij się, że podałeś formularz, namektóry jest wysyłany na serwer i idktóry jest używany przez javascript). W przypadku obszarów tekstowych możesz użyć .innerHTML.

Następnie masz wartość w zmiennej, są różne sposoby, aby to sprawdzić.

Na przykład możesz to zrobić if (parseInt(my_value) < 0) //error. Możesz także użyć wyrażeń regularnych, nie wyjaśnię wszystkiego, ale możesz zacząć tutaj http://www.w3schools.com/jsref/jsref_obj_regexp.asp . Wiem, że w3schools nie jest najlepszym źródłem, ale uważam, że to dobre miejsce na rozpoczęcie.

A teraz część dotycząca walidacji: dodaj onsubmit="return validateForm()do swojego tagu formularza, gdzie validateForm () jest funkcją, która wykonuje wszystkie sprawdzenia. Funkcja po prostu zwraca, truejeśli jest prawidłowa i falsenie. To zastępuje domyślną funkcję walidacji (który domyślnie nic nie robi).

Więc w powyższym przykładzie //errorzostanie zastąpiony przez return false. Możesz też robić inne rzeczy; takie jak ostrzeżenie o błędzie, a następnie zwróć false. Możesz również użyć javascript, aby podświetlić nieprawidłowe pola (nie wiesz, czy to właśnie masz na myśli, mówiąc „ oznacz pole wejściowe jako nieprawidłowe / prawidłowe z javascript ”)

Oczywiście, jeśli nie chcesz sprawdzać wszystkich pól, musisz zwrócić prawdę tylko wtedy, gdy niektóre z nich przejdą pomyślnie. Ponownie, nie powinieneś na tym polegać, ale jeśli chcesz tylko odstraszyć przeciętnych ludzi, to jest to łatwe rozwiązanie.


9
Masz całkowitą rację, ale nie sądzę, że całkowicie zrozumiałeś pytanie. W HTML5 istnieją różne sposoby dodawania wartości atrybutów do znaczników HTML, które implikują wbudowane reguły walidacji. Kiedy przeglądarka stosuje te reguły, pole wejściowe będzie pasowało do pseudoklasy „: valid” lub „: invalid” w CSS. W ten sposób możesz pisać HTML z tymi atrybutami, a CSS z selektorami „: valid” i „: invalid” z regułami i przekazywać wizualną informację zwrotną bez żadnego JavaScript. Pytanie brzmi, czy stan „: prawidłowy” jest w zasadzie dostępny jako atrybut DOM.
Pointy

-17

Czy istnieje sposób, aby oznaczyć pole wejściowe jako nieprawidłowe / prawidłowe w javascript?

Niestety, w JavaScript nie można stylizować pseudoklas, ponieważ nie są one prawdziwymi elementami, nie istnieją w rzeczywistym modelu DOM.

Z waniliowym JavaScriptem użyjesz walidacyjnego API .

W jQuery możesz to po prostu zrobić, http://jsfiddle.net/elclanrs/Kak6S/

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

Lub alternatywnie, czy mogę zastąpić użytą metodę walidacji?

Jeśli korzystasz z walidacji HTML5, trzymaj się znaczników. W przeciwnym razie możesz wyłączyć walidację HTML5 $form.attr('novalidate', 'novalidate')i użyć JS do walidacji pól, a następnie dodać validlub invalidklasy w razie potrzeby. Stworzyłem wtyczkę, która działa w ten sposób, aby obsługiwać przeglądarki inne niż HTML5.


Co masz na myśli mówiąc, że nie możesz ich stylizować? Już to robię. input:invalid + label::after{content: " INVALID";color: red;}Dodaje czerwony fragment NIEPRAWIDŁOWEGO tekstu po etykiecie, którą mam obok pola wejściowego, jeśli pole jest nieprawidłowe (na przykład, jeśli pole e-mail zawiera nieprawidłowy adres e-mail)
Svish

11
„Czy istnieje sposób, aby oznaczyć pole wejściowe jako nieprawidłowe / prawidłowe w javascript?” „Niestety, nie można stylizować pseudoklas z JavaScript”. Nie o to chodziło w pytaniu.
mikemaccana

Powinieneś móc użyć CSSOM do dynamicznego zdefiniowania nowej klasy z pseudoklasą ...
Brett Zamir
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.