HTML5 formu gerekli özelliği. Özel doğrulama mesajı belirlensin mi?


326

Aşağıdaki HTML5 formunu aldım: http://jsfiddle.net/nfgfP/

<form id="form" onsubmit="return(login())">
<input name="username" placeholder="Username" required />
<input name="pass"  type="password" placeholder="Password" required/>
<br/>Remember me: <input type="checkbox" name="remember" value="true" /><br/>
<input type="submit" name="submit" value="Log In"/>

Şu anda ikisi de boşken enter tuşuna bastığımda, "Lütfen bu alanı doldurun" yazan bir açılır kutu görünür. Bu varsayılan mesajı "Bu alan boş bırakılamaz" olarak nasıl değiştirebilirim?

EDIT: Ayrıca parola türü hata iletisinin türü olduğunu unutmayın *****. Bunu yeniden oluşturmak için kullanıcı adına bir değer verin ve gönder'e basın.

EDIT : Test için Chrome 10 kullanıyorum. Lütfen aynısını yapın


1
Ah, deli boş şifre doğrulama mesajı için +1 = / Bu KG'yi nasıl geçti, merak ediyorum ...
David Monica'yı

3
Neden yalnızca tarayıcı varsayılan mesajını kabul etmiyorsunuz? Kullanıcıların ziyaret ettikleri diğer her site için gördükleri budur, standart olmayan bir mesaj oluşturarak kullanıcılarınızı karıştıracaksınız. (Google, bu ifadeyi sizden belirlemede muhtemelen daha fazla UX değerlendirme ve testini yönetmiştir!).
ChrisV

12
@ChrisV Çok dilli siteler ne olacak?
inemanja

1
Benim durumumda göndermeden önce değerin bir sayı olup olmadığını kontrol etmek istiyorum ama (nedenlerle) type = "number" özniteliğini kullanamıyorum Bu yüzden desen özniteliği iletiyi veren sayıları ve isteğe bağlı ondalık sayıları denetlemek için ayarlayın , "Lütfen istenen biçimle eşleştirin" hatası verdi. "Bize bir numara bucko hediye etmelisin" demeyi tercih ederim.
Kristopher

Yanıtlar:


267

Kullanım setCustomValidity:

document.addEventListener("DOMContentLoaded", function() {
    var elements = document.getElementsByTagName("INPUT");
    for (var i = 0; i < elements.length; i++) {
        elements[i].oninvalid = function(e) {
            e.target.setCustomValidity("");
            if (!e.target.validity.valid) {
                e.target.setCustomValidity("This field cannot be left blank");
            }
        };
        elements[i].oninput = function(e) {
            e.target.setCustomValidity("");
        };
    }
})

Ben vanilya JavaScript değiştirildi önerdiği gibi Mootools gelen @itpastorn yorumlarında, ancak gerekirse eşdeğer Mootools çalışmak gerekir.

Düzenle

Ben setCustomValidityaslında cevap zaman ne anlamak biraz farklı çalışır gibi burada kodu güncelledim . Eğer setCustomValidityboş dize dışında bir yapmaya hazır durumda geçersiz kabul edilecek alanın neden olur; bu nedenle geçerliliği test etmeden önce temizlemelisiniz, sadece ayarlayıp unutamazsınız.

Daha fazla düzenleme

Aşağıdaki @ thomasvdb'nin yorumunda belirtildiği gibi, invalidaksi takdirde bazı olaylarda özel geçerliliği temizlemeniz gerekir, aksi takdirde oninvalidtemizlemek için işleyiciden fazladan bir geçiş olabilir .


Bunu denedim ama hala bir hata var. Alanı boş bırakırsanız mesajı gösterir, sonra alana bir şey girin ancak şimdi boş bir mesaj gösterir ve işlem yürütülmez. Şimdi düğmeyi tekrar tıklarsanız, geçecektir.
thomasvdb

1
@thomasvdb inputEtkinlikteki boş bir dizeye özel geçerlilik ayarlamayı deneyin . Şu anda sadece invalidolay ateşlendiğinde temizleniyor .
robertc

Gerçekten çözüm budur. @Hleinone çözeltisi ile öğrendim. Yanıtınız için teşekkürler!
thomasvdb

4
Yukarıdaki çözüm, belgenin yüklenmesini beklemek için yalnızca JQuery kullanır. Diğer her şey saf JS ve DOM. SetCustomValidity'i destekleyecek kadar modern bir tarayıcı DOMContentLoaded olayını da desteklemelidir; başka bir şey için kullanılmıyorsa, JQuery gerekli değildir.
itpastorn

1
@ Lai32290 çünkü gerçek DOM nesnesine erişmiyorsunuz. $("")yalnızca bir tane olsa bile bir nesne dizisi döndürür. $("")[i]büyük olasılıkla istediğiniz şeydir.
Noah Passalacqua

290

HTML5'te Özel Hata İletisini işlemek için kod

<input type="text" id="username" required placeholder="Enter Name"
    oninvalid="this.setCustomValidity('Enter User Name Here')"
    oninput="this.setCustomValidity('')"  />

Bu bölüm önemlidir, çünkü kullanıcı yeni veri girdiğinde hata mesajını gizler:

oninput="this.setCustomValidity('')"

Firefox 29.0 ve Chrome 34.0.1847.137'de mükemmel çalışır.
Fernando Kosh

mükemmel ve şimdiye kadar FF 38'de. Yalnızca oninvalid () kullanılırsa e-posta doğrulamasındaki hatayı düzeltir.
andrew

İPad'de veya iPhone'da Safari'de çalışmıyor. Yine de Chrome masaüstünde beklendiği gibi çalışıyor.
Nabeel

2
@ somnath-kadam Bir hata mı yoksa kasıtlı olarak oninput = "this.setCustomValidity ('')" yerine oninput = "setCustomValidity ('')"
yaptınız

3
Oninput = "setCustomValidity ('')" olarak işaretlediğiniz için teşekkür ederiz. Bu benim günümü kurtardı.
singhpradeep

99

HTML5Etkinlik yardımıyla özel mesajları kontrol etmek çok basitoninvalid

İşte kod:

<input id="UserID"  type="text" required="required"
       oninvalid="this.setCustomValidity('Witinnovation')"
       onvalid="this.setCustomValidity('')">

Bu çok önemlidir:

onvalid="this.setCustomValidity('')"

3
Ayrıca desen, min / maks değerler, vb. Gibi
Jaider

10
Bu, firefox'ta yenileme sırasında doğruladığı, ancak değişiklik ve düzeltme sırasında başarısız olduğu bir hataya neden olur.
Ryan Charmley

12
@RyanCharmley onchange="this.setCustomValidity('')"hata kullanarak gidecek. Cevabımı aşağıdan kontrol edin.
Salar

4
Bu işe yaramazsa (örneğin Safari'de çalışmazsa) oninputyerine kullanın onvalid.
Jimothy

2
@Jimothy bu konuda doğru oninput, daha evrensel bir çözüm, onvalidbenim için Chrome'da bile işe yaramadı.
ThisGuyCantEven

68

Not: Bu artık Chrome'da çalışmaz, diğer tarayıcılarda test edilmez. Aşağıdaki düzenlemelere bakın. Bu cevap tarihsel referans için burada bırakılıyor.

Doğrulama dizesinin gerçekten kodla ayarlanmaması gerektiğini düşünüyorsanız, giriş öğesinin başlık niteliğini "Bu alan boş bırakılamaz" olarak ayarlayabilirsiniz. (Chrome 10'da çalışır)

title="This field should not be left blank."

Bkz. Http://jsfiddle.net/kaleb/nfgfP/8/

Ve Firefox'ta bu özelliği ekleyebilirsiniz:

x-moz-errormessage="This field should not be left blank."

Düzenle

Aslında bu cevabı yazdığımdan beri bu değişmiş gibi görünüyor. Şimdi bir başlık eklemek geçerlilik mesajını değiştirmez, sadece mesaja bir ek ekler. Yukarıdaki keman hala geçerlidir.

Düzenle 2

Chrome artık Chrome 51'den itibaren title özelliğiyle hiçbir şey yapmıyor. Bunun hangi sürümde değiştiğinden emin değilim.


1
Bu gerçek mesaj içeriğini değiştirmez.
Wesley Murch

2
Test ettiğim zaman.
kzh

3
Benim hatam OP, Chrome 10'u belirtti, FF5'teydim. Özür dilerim kaldırıldı. Vay be, Chrome'daki bu hata mesajı şimdiye kadar gördüğüm en çirkin şey.
Wesley Murch

2
Firefox'taki x-moz-errormessage="This field should not be left blank."
bildirici

2
Bu, "Lütfen bu alanı doldurun" altına açıklayıcı bir mesaj ekler.
Magne

41

HTML5 oninvalidEtkinlik yardımıyla özel mesajları kontrol etmek çok basit

İşte kod:

User ID 
<input id="UserID"  type="text" required 
       oninvalid="this.setCustomValidity('User ID is a must')">

4
kontrol tüm girişler için ilk çalıştırılan geçerlilik mesajı görüntülenecek şekilde girişi onayladıktan sonra geçerlilik mesajının boş olarak ayarlanması gerekir. SetCustomValidity () öğesini her çağırdığınızda oninput = "setCustomValidity ('')" öğesini ekleyin. Somnath'ın cevabına +1.
Tarang

41

setCustomValidityDoğru zamanda ayarlanarak ve ayarın kaldırılmasıyla doğrulama mesajı kusursuz bir şekilde çalışacaktır.

<input name="Username" required 
oninvalid="this.setCustomValidity('Username cannot be empty.')" 
onchange="this.setCustomValidity('')" type="text" />

Bunun onchangeyerine oninputdaha genel kullandım ve değer JavaScript aracılığıyla bile herhangi bir koşulda değiştirildiğinde ortaya çıkar.


Bu kabul edilen cevap olmalı. Windows 10 1709'da aşağıdaki tarayıcılarda çalıştı: Chrome 66.0.3359.139 64 bit, Firefox 59.0.3 (64 bit), Internet Explorer 11.431.16299.0, Edge 41.16299.402.0. Safari 11.0'da (13604.1.38.1.6) macOS 10.13.2'de çalıştı. Chrome 4.4.0.3359.158'de Android 4.4.4'te çalıştı. JSX yolu arayanlar için: onInvalid={(e) => { e.target.setCustomValidity('foo') }} onChange={(e) => { e.target.setCustomValidity('') }}.
GuiRitter

Ek: eörneğin, bir Reaksiyon Seçimi alanından bir seçenek kaldırıldığında boş olabilir. Bunu kontrol etmeyi unutma.
GuiRitter 17:18

Hatalar: Bu kullanmak için seçin Tepki, sen geçmek zorunda onChangeve onInvalidolarakinputProps={{ onInvalid: …, onChange: …, }}
GuiRitter

Zeyilname: type='email'kullanarak beri, biraz daha zor tedavi etmektir setCustomValiditysetleri customError: trueiçin e.target.validitygiriş geçerli olsa bile. Bunu düzeltmenin bir yolunu bulmaya çalışıyorum.
GuiRitter

@GuiRitter Bunu anladınız mı?
EvilJordan

39

Hata mesajlarını değiştirmeyi ve çevirmeyi kolaylaştırmak için küçük bir kütüphane yaptım. Metinleri title, Chrome'da veya x-moz-errormessageFirefox'ta şu anda kullanılamayan hata türüne göre bile değiştirebilirsiniz . Git GitHub'dan üzerinde kontrol ve geri bildirimde bulunun.

Gibi kullanılır:

<input type="email" required data-errormessage-value-missing="Please input something">

JsFiddle'da bir demo var .


Teşekkürler! Kabul edilen cevapta bir yorum olarak belirtilen benim küçük hata çözüldü.
thomasvdb

OP, Google Chrome'u kullandığından çok iyi; bunun IE Edge'de çalışmayacağını
düşündüm

23

Bunu deneyin, daha iyi ve test edilmiş:

HTML:

<form id="myform">
    <input id="email" 
           oninvalid="InvalidMsg(this);" 
           oninput="InvalidMsg(this);"
           name="email"  
           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/


hey .... güzel bir çözüm ama type = email safari tarayıcısında çalışmıyor. bir göz atın w3schools.com/html/html_form_input_types.asp
Bhawna Malhotra

2
Evet, safari için desteklenmiyor, ancak ayarlanan özel doğrulama mesajı için bir cevap verdim.
Rikin Patel

10

Bulduğum en kolay ve en temiz yol, özel hatanızı saklamak için bir veri özelliği kullanmaktır. Düğümü geçerlilik açısından test edin ve bazı özel html kullanarak hatayı işleyin.resim açıklamasını buraya girin

le javascript

if(node.validity.patternMismatch)
        {
            message = node.dataset.patternError;
        }

ve bazı süper HTML5

<input type="text" id="city" name="city" data-pattern-error="Please use only letters for your city." pattern="[A-z ']*" required>

3
Sadece harf söyleme hatasına rağmen, desen boşluk ve kesme işareti veriyor mu? Ayrıca, A-z'[', '\', ']', '^', '_' ve '' 'öğelerine izin verir.
Lawrence Dol

5

Her bir sembolün girişinde Google Chrome hata mesajlarını önlemenin çözümü:

<p>Click the 'Submit' button with empty input field and you will see the custom error message. Then put "-" sign in the same input field.</p>
<form method="post" action="#">
  <label for="text_number_1">Here you will see browser's error validation message on input:</label><br>
  <input id="test_number_1" type="number" min="0" required="true"
         oninput="this.setCustomValidity('')"
         oninvalid="this.setCustomValidity('This is my custom message.')"/>
  <input type="submit"/>
</form>

<form method="post" action="#">
  <p></p>
  <label for="text_number_1">Here you will see no error messages on input:</label><br>
  <input id="test_number_2" type="number" min="0" required="true"
         oninput="(function(e){e.setCustomValidity(''); return !e.validity.valid && e.setCustomValidity(' ')})(this)"
         oninvalid="this.setCustomValidity('This is my custom message.')"/>
  <input type="submit"/>
</form>


3

Daha basit bir vanilya js sadece çözüm var:

Onay kutuları için:

document.getElementById("id").oninvalid = function () {
    this.setCustomValidity(this.checked ? '' : 'My message');
};

Girişler için:

document.getElementById("id").oninvalid = function () {
    this.setCustomValidity(this.value ? '' : 'My message');
};

1

Uyarlanması Salar JSX için cevabını ve tepki, ben Seç sadece böyle davranmaz Tepki fark <input/>geçerliliği hususunda alanında. Görünüşe göre, yalnızca özel mesajı göstermek ve uygunsuz zamanlarda gösterilmesini engellemek için birkaç geçici çözüm gerekiyor.

Burada herhangi bir şey olursa, bir sorunla karşılaştım . İşte çalışan bir örneği olan bir CodeSandbox ve orada en önemli kod burada üretilir:

Hello.js

import React, { Component } from "react";
import SelectValid from "./SelectValid";

export default class Hello extends Component {
  render() {
    return (
      <form>
        <SelectValid placeholder="this one is optional" />
        <SelectValid placeholder="this one is required" required />
        <input
          required
          defaultValue="foo"
          onChange={e => e.target.setCustomValidity("")}
          onInvalid={e => e.target.setCustomValidity("foo")}
        />
        <button>button</button>
      </form>
    );
  }
}

SelectValid.js

import React, { Component } from "react";
import Select from "react-select";
import "react-select/dist/react-select.css";

export default class SelectValid extends Component {
  render() {
    this.required = !this.props.required
      ? false
      : this.state && this.state.value ? false : true;
    let inputProps = undefined;
    let onInputChange = undefined;
    if (this.props.required) {
      inputProps = {
        onInvalid: e => e.target.setCustomValidity(this.required ? "foo" : "")
      };
      onInputChange = value => {
        this.selectComponent.input.input.setCustomValidity(
          value
            ? ""
            : this.required
              ? "foo"
              : this.selectComponent.props.value ? "" : "foo"
        );
        return value;
      };
    }
    return (
      <Select
        onChange={value => {
          this.required = !this.props.required ? false : value ? false : true;
          let state = this && this.state ? this.state : { value: null };
          state.value = value;
          this.setState(state);
          if (this.props.onChange) {
            this.props.onChange();
          }
        }}
        value={this && this.state ? this.state.value : null}
        options={[{ label: "yes", value: 1 }, { label: "no", value: 0 }]}
        placeholder={this.props.placeholder}
        required={this.required}
        clearable
        searchable
        inputProps={inputProps}
        ref={input => (this.selectComponent = input)}
        onInputChange={onInputChange}
      />
    );
  }
}

1

Tamam, oninvalid iyi çalışıyor ancak kullanıcı geçerli veriler girmiş olsa bile hata gösteriyor. Bu yüzden aşağıda mücadele etmek için kullandım, umarım sizin için de çalışır,

oninvalid="this.setCustomValidity('Your custom message.')" onkeyup="setCustomValidity('')"


-7

Sadece alana 'başlık' koyarak kolayca idare edilebilir:

<input type="text" id="username" required title="This field can not be empty"  />

Bu görüntülenen hata mesajını değiştirmez. Yalnızca fareyle üzerine geldiğinizde giriş üzerinde bir başlık gösterir.
Mathieu Dumoulin

Bu, giriş alanı için bazı uyarılar göstermek için "başlık" ın doğru kullanılabilirliği değildir.
sajad saderi
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.