Özel HTML5 gerekli alan doğrulama mesajı ayarlayın


113

Gerekli alan özel doğrulaması

Birçok giriş alanına sahip bir formum var. Html5 doğrulamalarını koydum

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

formu bu metin kutusunu doldurmadan gönderdiğimde varsayılan mesajı gösteriyor

"Please fill out this field"

Biri bu mesajı düzenlememe yardım edebilir mi?

Düzenlemek için bir javascript kodum var ama çalışmıyor

$(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("");
        };
    }
})


E-posta özel doğrulamaları

Aşağıdaki HTML formum var

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


Beğenmek istediğim doğrulama mesajları.

Gerekli alan: Lütfen E-posta Adresini Girin
Yanlış E-posta: 'testing @ .com' Geçerli bir E-posta Adresi değil. ( burada, metin kutusunda görüntülenen girilen e-posta adresi )

Bunu denedim.

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

Bu işlev düzgün çalışmıyor, bunu yapmanın başka bir yolu var mı? Takdir edilecektir.


1
Ne demek 'çalışmıyor'? Hata mı veriyor? Chrome'un geliştirici araçlarını veya Firefox'un Firebug'ını açın ve bir JavaScript hatası olup olmadığına bakın.
Osiris

Bunu yapmanın başka bir yolu var mı?
Sumit Bijvani

Daha fazla kod gönderebilir misin? Gönderdikleriniz size yardımcı olmak için yeterli değil. Ve bunu hangi tarayıcılarda test ediyorsunuz?
Levi Botelho

@LeviBotelho Kodun tamamını gönderdim ve bunu Firefox ve
chrome'da

3
@SumitBijvani 'Daha iyi cevaplar aramak' ile neyi kastediyorsunuz? Bana hangi kısımların yanlış / yetersiz olduğunu söylerseniz cevabımı iyileştireceğim.
ComFreek

Yanıtlar:


117

Kod parçacığı

Bu cevap çok dikkat çektiğinden, işte bulduğum güzel bir yapılandırılabilir pasaj:

/**
  * @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);

kullanım

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!';
  }
});

Daha fazla detay

  • defaultText başlangıçta görüntülenir
  • emptyText giriş boş olduğunda görüntülenir (silindi)
  • invalidText giriş tarayıcı tarafından geçersiz olarak işaretlendiğinde görüntülenir (örneğin, geçerli bir e-posta adresi olmadığında)

Üç özelliğin her birine bir dize veya işlev atayabilirsiniz.
Bir işlev atarsanız, giriş öğesine (DOM düğümü) bir başvuruyu kabul edebilir ve daha sonra hata mesajı olarak görüntülenen bir dize döndürmesi gerekir .

uygunluk

Test edilen yer:

  • Chrome Canary 47.0.2
  • IE 11
  • Microsoft Edge (28/08/2015 tarihinden itibaren güncel sürümü kullanarak)
  • Firefox 40.0.3
  • Opera 31.0

Eski cevap

Eski revizyonu burada görebilirsiniz: https://stackoverflow.com/revisions/16069817/6


1
teşekkürler ... yanlış e-posta için özel doğrulamanız çalışıyor, ancak gerekli alan için bana mesajı göster please fill out this fieldbu mesajı şu şekilde değiştirebilir misinizPlease enter email address
Sumit Bijvani

@SumitBijvani Sorun değil, bu davranış, setCustomValidity()yalnızca bulanıklık olayı bir kez tetiklendikten sonra boş e-postaları ayarladığımız için ortaya çıkıyor, bu nedenle onu DOM yüklemede de çağırmamız gerekiyor. Güncellenmiş example / jsFiddle'a bakın.
ComFreek

@SumitBijvani Bazı kusurları da düzelttim, lütfen kod yorumlarıma bakın. Soru sormaktan çekinmeyin;)
ComFreek

1
Güncellenen jsFiddle için teşekkürler, doğrulamalar sorunsuz çalışıyor, ancak gerçek e-posta adresini girdiğimde bir sorun oluşuyor, ardından doğrulama da diyor ki, e-posta adresi geçersiz
Sumit Bijvani

1
Bu harika çalışıyor. HTML5 "gerekli" işlevinin yalnızca gönderilen boşluk karakterlerine karşı da doğrulamasını istedim (oysa varsayılan olarak yalnızca gönderilen boş bir dizeye göre doğrulama yapar). Bu yüzden iki satırı ile değiştirdim, if (input.value == "") {bunun yerine okumak için if (input.value.trim() == "") {- hile benim için.
Jaza

56

Bunu geçersiz bir özniteliği kullanarak kolayca başarabilirsiniz, bu demo kodunu kontrol edin

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

görüntü açıklamasını buraya girin

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


13
lol, herkes kod sayfalarını atıyor, çok tembelim ve satır içi bir tane arıyordum, teşekkürler @akshay khale cevabınız en iyisi.
Dheeraj Thedijje

1
Yardımcı olmaktan mutluluk duyarım @Thedijje
Akshay Khale

10
Lütfen setCustomValidity'nin aşağıdaki gibi bir şeyle sıfırlanması gerektiğini unutmayın oninput="setCustomValidity('')": stackoverflow.com/a/16878766/1729850
Leia

2
Bu cevabı tamamladığınız için teşekkürler @Leia. Maalesef radyo düğmeleri için çalışmaz. Yani bir düğmede geçersiz olanı tetiklerseniz, özel dize eklenir. Daha sonra farklı bir radyo düğmesini tıklarsanız, ilkindeki cutomValidity dizesini temizlemeyecektir. Öyleyse, ilgili tüm radyo düğmelerinden herhangi bir setCustomValidity öğesini dinlemek ve temizlemek için biraz javascript gerekecek gibi görünüyor.
ryan2johnson9

2
Kabul edilen cevap bu olmalıdır. Basitlik en iyi çözümdür.
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;
}

Demo:

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


Bu benim için çalışan tek kişi. Teşekkürler Rikin.
Bashar Ghadanfar

Diğer gelişmiş yaklaşımları denemek istemedim. E-posta doğrulaması için benim için çalışan tek basit şey buydu. Teşekkürler!
Mycodingproject

16

Bunu dene:

$(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");
        };
    }
})

Bunu Chrome ve FF'de test ettim ve her iki tarayıcıda da çalıştı.


1
Zengin HTML içeriğini kullanma şansınız var mı? Görünüşe göre sadece metni destekliyor, gibi etiket yok <b>Error: </b> Incorrect email address.
Ωmega

Bildiğim kadarıyla henüz mümkün değil. Sonucu CSS ile buna göre biçimlendirebilirsiniz, ancak bunun elbette sınırları vardır ve sizin durumunuz için geçerli değildir. Her halükarda, teknoloji hala oldukça yenidir ve çoğu kişi için yeterince geniş çapta desteklenmemektedir, bu yüzden benim görüşüme göre uygulamanız ne olursa olsun, şimdilik alternatif bir çözüm kullanmanız daha iyi olacaktır.
Levi Botelho

Diyelim ki bazen (diğer girişlere bağlıdır), böyle bir giriş alanının boş değerine izin vermek istiyorum. O halde varsayılan doğrulama mesajını nasıl kapatabilirim? Atamak setCustomValidity("")yardımcı olmuyor. Ayarlanması gereken başka bir parametre var mı? Tavsiye lütfen.
Ωmega

8

Dostum, bunu HTML 5'te hiç yapmadım ama deneyeceğim. Bu kemana bir bak .

Bazı jQuery, HTML5 yerel etkinlikleri ve özellikleri ile giriş etiketinde özel bir öznitelik kullandım (kodunuzu doğrulamaya çalışırsanız bu, soruna neden olabilir). Tüm tarayıcılarda test etmedim ama işe yarayabileceğini düşünüyorum.

Bu, jQuery ile alan doğrulama JavaScript kodudur:

$(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 : "");
        };
    });
});

Güzel. İşte basit form 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>

Özellik requiredmessage, bahsettiğim özel özelliktir. Mesajınızı, jQuery hata mesajını görüntülediğinde ondan alacağı için gerekli her alan için ayarlayabilirsiniz. Her alanı doğrudan JavaScript'te ayarlamanız gerekmez, jQuery bunu sizin için yapar. Bu normal ifade iyi görünüyor (en azından testing@.com! Haha'nızı engelliyor )

Fiddle'da görebileceğiniz gibi, form gönderme olayı için fazladan doğrulama yapıyorum ( bu da document.ready için geçerli ):

$("#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;
        }
    }
});

Umarım bu işe yarar veya size yardımcı olur.


Standart olmayan öznitelikten kaçınmak için standart data-ön eki kullanabilirsiniz ; ör data-requiredMessage. JQuery ile buna şununla erişilebilir $(element).data('requiredMessage'); Aklıma gelen standart DOM arayüzünü bilmiyorum.
IMSoP

@IMSoP tabii, geçerli!
DontVoteMeDown

6

Bu benim için iyi çalışıyor:

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.");
                }
            }
        }
    }
});

ve birlikte kullandığım form (kesilmiş):

<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>

görüntü açıklamasını buraya girin


5

Bunu, ihtiyaç duyduğunuz şeye bağlı olarak, aynı türdeki tüm girişlerde veya yalnızca bir tanesinde 'geçersiz' için bir olay dinleyicisi ayarlayabilir ve ardından uygun mesajı ayarlayabilirsiniz.

[].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);
    });

Komut dosyasının ikinci parçası olan geçerlilik mesajı sıfırlanacaktır, çünkü aksi takdirde formu göndermek mümkün olmayacaktır: örneğin bu, e-posta adresi düzeltildiğinde bile mesajın tetiklenmesini önler.

Ayrıca, girişi yazmaya başladığınızda 'geçersiz' tetikleneceğinden, giriş alanını gerektiği gibi ayarlamanız gerekmez.

İşte bunun için bir keman: http://jsfiddle.net/napy84/U4pB7/2/ Yardımcı olacağını umuyoruz!


5

Her giriş etiketinde "başlık" özelliğini kullanın ve üzerine bir mesaj yazın


4

Sadece öğeyi almanız ve setCustomValidity yöntemini kullanmanız yeterlidir.

Misal

var foo = document.getElementById('foo');
foo.setCustomValidity(' An error occurred');

3

this.setCustomValidity () eventListener ile sadece oninvalid = " özelliğini kullanabilirsiniz!

İşte demo kodlarım! (Kontrol etmek için çalıştırabilirsiniz!) görüntü açıklamasını buraya girin

<!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="xgqfrms@email.xyz" required="" autocomplete="" autofocus="" oninvalid="this.setCustomValidity(`This is a customlised invalid warning info!`)">
        <input type="submit" value="Submit">
    </form>
</body>
</html>

referans bağlantısı

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

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


setCustomValidity ()
xgqfrms

1

Bu komut dosyasını kendi mesajınızı göstermek için ekleyebilirsiniz.

 <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>

Örüntü uyuşmazlığı gibi diğer doğrulama için, aksi takdirde koşul ekleyebilirsiniz.

sevmek

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

rangeOverflow, rangeUnderflow, stepMismatch, typeMismatch, valid gibi başka geçerlilik koşulları vardır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.