Ustaw niestandardowy komunikat weryfikacji wymaganego pola HTML5

113

Wymagana niestandardowa walidacja pola

Mam jeden formularz z wieloma polami wejściowymi. Umieściłem walidacje html5

<input type="text" name="topicName" id="topicName" required />

kiedy wysyłam formularz bez wypełniania tego pola tekstowego, wyświetla się domyślny komunikat, taki jak

"Please fill out this field"

Czy ktoś może mi pomóc w edycji tej wiadomości?

Mam kod javascript do edycji, ale nie działa

$(document).ready(function() {
    var elements = document.getElementsByName("topicName");
    for (var i = 0; i < elements.length; i++) {
        elements[i].oninvalid = function(e) {
            e.target.setCustomValidity("");
            if (!e.target.validity.valid) {
                e.target.setCustomValidity("Please enter Room Topic Title");
            }
        };
        elements[i].oninput = function(e) {
            e.target.setCustomValidity("");
        };
    }
})


Wyślij niestandardowe weryfikacje pocztą e-mail

Mam następujący formularz HTML

<form id="myform">
    <input id="email" name="email" type="email" />
    <input type="submit" />
</form>


Wiadomości z walidacją, które mi się podobają.

Wymagane pole: Wprowadź adres e-mail
Nieprawidłowy adres e-mail: „testing @ .com” nie jest prawidłowym adresem e-mail. ( tutaj wprowadzony adres e-mail wyświetlany w polu tekstowym )

Próbowałem tego.

function check(input) {  
    if(input.validity.typeMismatch){  
        input.setCustomValidity("'" + input.value + "' is not a Valid Email Address.");  
    }  
    else {  
        input.setCustomValidity("");  
    }                 
}  

Ta funkcja nie działa poprawnie, czy masz inny sposób, aby to zrobić? Byłoby to docenione.

Sumit Bijvani
źródło
1
Co masz na myśli mówiąc „nie działa”? Czy podaje błąd? Otwórz narzędzia programistyczne Chrome lub Firebug Firefoksa i sprawdź, czy wystąpił błąd JavaScript.
Ozyrys
czy jest jakiś inny sposób, aby to zrobić?
Sumit Bijvani,
Czy możesz wysłać więcej kodu? To, co opublikowałeś, nie wystarczy, aby Ci pomóc. W jakich przeglądarkach to testujesz?
Levi Botelho
@LeviBotelho Opublikowałem cały kod i testuję to w Firefoksie i Chrome
Sumit Bijvani
3
@SumitBijvani Co masz na myśli mówiąc „Szukasz lepszych odpowiedzi”? Poprawię swoją odpowiedź, jeśli powiesz mi, które części są złe / niewystarczające.
ComFreek

Odpowiedzi:

117

Fragment kodu

Ponieważ ta odpowiedź przyciągnęła bardzo dużo uwagi, oto ładny konfigurowalny fragment, który wymyśliłem:

/**
  * @author ComFreek <https://stackoverflow.com/users/603003/comfreek>
  * @link https://stackoverflow.com/a/16069817/603003
  * @license MIT 2013-2015 ComFreek
  * @license[dual licensed] CC BY-SA 3.0 2013-2015 ComFreek
  * You MUST retain this license header!
  */
(function (exports) {
    function valOrFunction(val, ctx, args) {
        if (typeof val == "function") {
            return val.apply(ctx, args);
        } else {
            return val;
        }
    }

    function InvalidInputHelper(input, options) {
        input.setCustomValidity(valOrFunction(options.defaultText, window, [input]));

        function changeOrInput() {
            if (input.value == "") {
                input.setCustomValidity(valOrFunction(options.emptyText, window, [input]));
            } else {
                input.setCustomValidity("");
            }
        }

        function invalid() {
            if (input.value == "") {
                input.setCustomValidity(valOrFunction(options.emptyText, window, [input]));
            } else {
               input.setCustomValidity(valOrFunction(options.invalidText, window, [input]));
            }
        }

        input.addEventListener("change", changeOrInput);
        input.addEventListener("input", changeOrInput);
        input.addEventListener("invalid", invalid);
    }
    exports.InvalidInputHelper = InvalidInputHelper;
})(window);

Stosowanie

jsFiddle

<input id="email" type="email" required="required" />
InvalidInputHelper(document.getElementById("email"), {
  defaultText: "Please enter an email address!",

  emptyText: "Please enter an email address!",

  invalidText: function (input) {
    return 'The email address "' + input.value + '" is invalid!';
  }
});

Więcej szczegółów

  • defaultText jest wyświetlany początkowo
  • emptyText jest wyświetlany, gdy wejście jest puste (zostało wyczyszczone)
  • invalidText jest wyświetlany, gdy dane wejściowe są oznaczone przez przeglądarkę jako nieprawidłowe (na przykład, gdy nie jest to prawidłowy adres e-mail)

Do każdej z trzech właściwości można przypisać ciąg znaków lub funkcję.
Jeśli przypiszesz funkcję, może ona zaakceptować odniesienie do elementu wejściowego (węzła DOM) i musi zwrócić ciąg, który jest następnie wyświetlany jako komunikat o błędzie.

Zgodność

Przetestowano w:

  • Chrome Canary 47.0.2
  • IE 11
  • Microsoft Edge (przy użyciu aktualnej wersji z 28.08.2015)
  • Firefox 40.0.3
  • Opera 31.0

Stara odpowiedź

Możesz zobaczyć starą wersję tutaj: https://stackoverflow.com/revisions/16069817/6

ComFreek
źródło
1
dzięki ... Twój walidacja zwyczaj niewłaściwego email działa, ale, na wymagane pole to pokaż mi wiadomość please fill out this fieldmożna zmienić tę wiadomośćPlease enter email address
Sumit Bijvani
@SumitBijvani Nie ma problemu, takie zachowanie występuje, ponieważ ustawiamy setCustomValidity()puste wiadomości e-mail tylko po jednokrotnym wywołaniu zdarzenia rozmycia, więc musimy po prostu wywołać to również podczas ładowania DOM. Zobacz zaktualizowany przykład / jsFiddle.
ComFreek
@SumitBijvani Naprawiłem również kilka błędów, zobacz komentarze do mojego kodu. Zapraszam do zadawania pytań;)
ComFreek
1
dzięki za zaktualizowanej jsFiddle, walidacje są w porządku pracy, ale jest jeden problem, gdy wchodzę prawdziwy adres e-mail, a następnie także walidacja mówi, adres e-mail jest nieprawidłowy
Sumit Bijvani
1
To działa świetnie. Chciałem, aby funkcja „wymagana” HTML5 sprawdzała się również pod kątem przesyłanych tylko białych znaków (podczas gdy domyślnie sprawdza się tylko w odniesieniu do przesłanego pustego ciągu). Więc zmieniłem dwie linie if (input.value == "") {, aby zamiast tego przeczytać if (input.value.trim() == "") {- załatwia sprawę dla mnie.
Jaza
56

Możesz to po prostu osiągnąć za pomocą oninvalid atrybutu, sprawdź ten kod demonstracyjny

<form>
<input type="email" pattern="[^@]*@[^@]" required oninvalid="this.setCustomValidity('Put  here custom message')"/>
<input type="submit"/>
</form>

wprowadź opis obrazu tutaj

Demo Codepen: https://codepen.io/akshaykhale1992/pen/yLNvOqP

Akshay Khale
źródło
13
lol, wszyscy wyrzucają strony kodu, jestem taki leniwy i szukałem jednego w tekście, dzięki @akshay khale, twoja odpowiedź jest najlepsza.
Dheeraj Thedijje
1
Chętnie pomogę @Thedijje
Akshay Khale
10
Pamiętaj, że setCustomValidity musi zostać zresetowane za pomocą czegoś takiego jak oninput="setCustomValidity('')": stackoverflow.com/a/16878766/1729850
Leia
2
Dzięki @Leia za uzupełnienie tej odpowiedzi. Niestety nie działa dla przycisków radiowych. tj. jeśli aktywujesz nieprawidłowy na jednym przycisku, dodawany jest niestandardowy ciąg. Następnie kliknięcie innego przycisku opcji nie usunie ciągu cutomValidity na pierwszym. Wygląda więc na to, że do odsłuchania i wyczyszczenia dowolnego setCustomValidity wszystkich powiązanych przycisków radiowych potrzebny byłby skrypt javascript.
ryan2johnson9
2
To powinna być akceptowana odpowiedź. Prostota to najlepsze rozwiązanie.
Keno Clayton
19

HTML:

<form id="myform">
    <input id="email" oninvalid="InvalidMsg(this);" name="email" oninput="InvalidMsg(this);"  type="email" required="required" />
    <input type="submit" />
</form>

JAVASCRIPT:

function InvalidMsg(textbox) {
    if (textbox.value == '') {
        textbox.setCustomValidity('Required email address');
    }
    else if (textbox.validity.typeMismatch){{
        textbox.setCustomValidity('please enter a valid email address');
    }
    else {
       textbox.setCustomValidity('');
    }
    return true;
}

Próbny :

http://jsfiddle.net/patelriki13/Sqq8e/

Rikin Patel
źródło
To jedyny, który działał dla mnie. Dzięki, Rikin.
Bashar Ghadanfar
Nie chciałem próbować innych zaawansowanych podejść. To był jedyny prosty, który zadziałał dla mnie w zakresie weryfikacji adresu e-mail. Dzięki!
Mycodingproject
16

Spróbuj tego:

$(function() {
    var elements = document.getElementsByName("topicName");
    for (var i = 0; i < elements.length; i++) {
        elements[i].oninvalid = function(e) {
            e.target.setCustomValidity("Please enter Room Topic Title");
        };
    }
})

Przetestowałem to w Chrome i FF i zadziałało w obu przeglądarkach.

Levi Botelho
źródło
1
Jakaś szansa na użycie bogatej zawartości HTML? Wydaje się, że obsługuje tylko tekst, bez tagów, takich jak <b>Error: </b> Incorrect email address.
Ωmega
O ile wiem, nie jest to jeszcze możliwe. Możesz odpowiednio dostosować wynik za pomocą CSS, ale to oczywiście ma swoje ograniczenia i nie dotyczy twojego przypadku. W każdym razie technologia jest wciąż dość nowa i nie jest wystarczająco szeroko obsługiwana dla większości, więc niezależnie od implementacji, moim zdaniem, na razie lepiej będzie korzystać z alternatywnego rozwiązania.
Levi Botelho
Powiedzmy czasami (zależy od innych danych wejściowych), chcę zezwolić na pustą wartość takiego pola wejściowego. Jak mogę wtedy wyłączyć domyślny komunikat walidacji? Przypisywanie setCustomValidity("")nie pomaga. Czy jest jakiś inny parametr, który należy ustawić? Proszę doradź.
Ωmega
8

Człowieku, nigdy nie robiłem tego w HTML 5, ale spróbuję. Spójrz na to skrzypce.

Użyłem niektórych jQuery, natywnych zdarzeń i właściwości HTML5 oraz niestandardowego atrybutu w tagu wejściowym (może to spowodować problem, jeśli spróbujesz zweryfikować swój kod). Nie testowałem we wszystkich przeglądarkach, ale myślę, że to może działać.

To jest kod JavaScript do walidacji pola z jQuery:

$(document).ready(function()
{
    $('input[required], input[required="required"]').each(function(i, e)
    {
        e.oninput = function(el)
        {
            el.target.setCustomValidity("");

            if (el.target.type == "email")
            {
                if (el.target.validity.patternMismatch)
                {
                    el.target.setCustomValidity("E-mail format invalid.");

                    if (el.target.validity.typeMismatch)
                    {
                         el.target.setCustomValidity("An e-mail address must be given.");
                    }
                }
            }
        };

        e.oninvalid = function(el)
        {
            el.target.setCustomValidity(!el.target.validity.valid ? e.attributes.requiredmessage.value : "");
        };
    });
});

Miły. Oto prosty formularz html:

<form method="post" action="" id="validation">
    <input type="text" id="name" name="name" required="required" requiredmessage="Name is required." />
    <input type="email" id="email" name="email" required="required" requiredmessage="A valid E-mail address is required." pattern="^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9]+$" />

    <input type="submit" value="Send it!" />
</form>

Atrybut requiredmessagejest atrybutem niestandardowym, o którym mówiłem. Możesz ustawić swoją wiadomość dla każdego wymaganego pola, ponieważ jQuery pobierze z niego, gdy wyświetli komunikat o błędzie. Nie musisz ustawiać każdego pola bezpośrednio w JavaScript, jQuery zrobi to za Ciebie. To wyrażenie regularne wydaje się być w porządku (przynajmniej blokuje twoje [email protected]! Haha)

Jak widać na skrzypcach, wykonuję dodatkową walidację zdarzenia formularza przesyłania ( dotyczy to również document.ready ):

$("#validation").on("submit", function(e)
{
    for (var i = 0; i < e.target.length; i++)
    {
        if (!e.target[i].validity.valid)
        {
            window.alert(e.target.attributes.requiredmessage.value);
            e.target.focus();
            return false;
        }
    }
});

Mam nadzieję, że to zadziała lub pomoże ci w tym.

DontVoteMeDown
źródło
Aby uniknąć niestandardowego atrybutu, możesz użyć standardowego data-przedrostka; np data-requiredMessage. W jQuery jest to dostępne za pomocą $(element).data('requiredMessage'); Nie znam standardowego interfejsu DOM od początku mojej głowy.
IMSoP,
@IMSoP jasne, jest ważne!
DontVoteMeDown
6

To działa dobrze dla mnie:

jQuery(document).ready(function($) {
    var intputElements = document.getElementsByTagName("INPUT");
    for (var i = 0; i < intputElements.length; i++) {
        intputElements[i].oninvalid = function (e) {
            e.target.setCustomValidity("");
            if (!e.target.validity.valid) {
                if (e.target.name == "email") {
                    e.target.setCustomValidity("Please enter a valid email address.");
                } else {
                    e.target.setCustomValidity("Please enter a password.");
                }
            }
        }
    }
});

i formularz, z którym go używam (obcięty):

<form id="welcome-popup-form" action="authentication" method="POST">
    <input type="hidden" name="signup" value="1">
    <input type="email" name="email" id="welcome-email" placeholder="Email" required></div>
    <input type="password" name="passwd" id="welcome-passwd" placeholder="Password" required>
    <input type="submit" id="submitSignup" name="signup" value="SUBMIT" />
</form>

wprowadź opis obrazu tutaj

davidcondrey
źródło
5

Możesz to zrobić, ustawiając detektor zdarzeń dla „nieprawidłowego” dla wszystkich wejść tego samego typu lub tylko jednego, w zależności od tego, czego potrzebujesz, a następnie skonfiguruj odpowiednią wiadomość.

[].forEach.call( document.querySelectorAll('[type="email"]'), function(emailElement) {
    emailElement.addEventListener('invalid', function() {
        var message = this.value + 'is not a valid email address';
        emailElement.setCustomValidity(message)
    }, false);

    emailElement.addEventListener('input', function() {
        try{emailElement.setCustomValidity('')}catch(e){}
    }, false);
    });

Drugi element skryptu, wiadomość dotycząca ważności, zostanie zresetowana, ponieważ w innym przypadku nie będzie możliwe przesłanie formularza: na przykład zapobiega to wywołaniu wiadomości nawet po poprawieniu adresu e-mail.

Nie musisz też konfigurować pola wejściowego zgodnie z wymaganiami, ponieważ „nieprawidłowe” zostanie uruchomione, gdy zaczniesz wpisywać dane wejściowe.

Oto skrzypce do tego: http://jsfiddle.net/napy84/U4pB7/2/ Mam nadzieję, że to pomoże!

Mimo
źródło
5

Użyj atrybutu „tytuł” ​​w każdym znaczniku wejściowym i napisz na nim wiadomość

eduardo a
źródło
4

Wystarczy pobrać element i użyć metody setCustomValidity.

Przykład

var foo = document.getElementById('foo');
foo.setCustomValidity(' An error occurred');
LuisRBarreras
źródło
3

możesz po prostu użyć atrybutu oninvalid = " , z bingingiem this.setCustomValidity () eventListener!

Oto moje kody demo! (Możesz je uruchomić, aby sprawdzić!) wprowadź opis obrazu tutaj

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>oninvalid</title>
</head>
<body>
    <form action="https://www.google.com.hk/webhp?#safe=strict&q=" method="post" >
        <input type="email" placeholder="[email protected]" required="" autocomplete="" autofocus="" oninvalid="this.setCustomValidity(`This is a customlised invalid warning info!`)">
        <input type="submit" value="Submit">
    </form>
</body>
</html>

link referencyjny

http://caniuse.com/#feat=form-validation

https://www.w3.org/TR/html51/sec-forms.html#sec-constraint-validation

xgqfrms
źródło
setCustomValidity ()
xgqfrms
1

Możesz dodać ten skrypt do wyświetlania własnej wiadomości.

 <script>
     input = document.getElementById("topicName");

            input.addEventListener('invalid', function (e) {
                if(input.validity.valueMissing)
                {
                    e.target.setCustomValidity("Please enter topic name");
                }
//To Remove the sticky error message at end write


            input.addEventListener('input', function (e) {
                e.target.setCustomValidity('');
            });
        });

</script>

W przypadku innych weryfikacji, takich jak niezgodność wzorca, możesz dodać dodatkowy warunek if else

lubić

else if (input.validity.patternMismatch) 
{
  e.target.setCustomValidity("Your Message");
}

istnieją inne warunki ważności, takie jak rangeOverflow, rangeUnderflow, stepMismatch, typeMismatch, valid

Inżynier
źródło