Встановіть спеціальне повідомлення для перевірки необхідного поля HTML5


113

Необхідна перевірка спеціального поля

У мене є одна форма з багатьма полями введення. Я поставив перевірку html5

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

коли я надсилаю форму, не заповнюючи це текстове поле, воно показує повідомлення за замовчуванням

"Please fill out this field"

Чи може хто-небудь допомогти мені відредагувати це повідомлення?

У мене є код JavaScript для редагування, але він не працює

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


Перевірка спеціальних повідомлень електронною поштою

У мене є така форма HTML

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


Повідомлення про валідацію, які мені подобаються.

Обов’язкове поле: Будь ласка, введіть електронну адресу
Неправильна електронна адреса: 'testing @ .com' не є дійсною електронною адресою. ( тут введена електронна адреса, відображена у текстовому полі )

Я спробував це.

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

Ця функція не працює належним чином. Чи є у вас інший спосіб це зробити? Було б вдячно.


1
Що означає «не працює»? Це помилка? Відкрийте інструменти для розробників Chrome або Firebug Firefox і перевірте, чи є помилка JavaScript.
Осіріс

чи є ще якийсь спосіб зробити це?
Суміт Біджвані

Чи можете ви опублікувати більше коду? Те, що ви опублікували, недостатньо, щоб вам допомогти. І в якому браузері ви це тестуєте?
Леві Ботелхо

@LeviBotelho Я опублікував цілий код, і я тестую це у Firefox та chrome
Sumit Bijvani

3
@SumitBijvani Що ви маєте на увазі під «Шукати кращих відповідей»? Я вдосконалю свою відповідь, якби ви сказали мені, які частини неправильні / недостатні.
ComFreek

Відповіді:


117

Фрагмент коду

Оскільки ця відповідь отримала дуже багато уваги, ось приємний настроюваний фрагмент, який я придумав:

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

Використання

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

Детальніше

  • defaultText відображається спочатку
  • emptyText відображається, коли вхід порожній (очищено)
  • invalidText відображається, коли браузер позначає як недійсний вхід (наприклад, якщо це не дійсна адреса електронної пошти)

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

Сумісність

Тестується в:

  • Chrome Canary 47.0.2
  • IE 11
  • Microsoft Edge (використовуючи оновлену версію станом на 28.08.2015)
  • Firefox 40.0.3
  • Opera 31.0

Стара відповідь

Ви можете побачити стару редакцію тут: https://stackoverflow.com/reitions/16069817/6


1
спасибі ... ваша спеціальна перевірка для неправильної електронної пошти працює, але, для обов'язкового поля, покажіть мені повідомлення, чи please fill out this fieldможете ви змінити це повідомлення наPlease enter email address
Sumit Bijvani

@SumitBijvani Немає проблем, така поведінка виникає через те, що ми встановлюємо setCustomValidity()порожні електронні листи лише після того, як подія розмивання буде запущена один раз, тому нам просто потрібно викликати її під час завантаження DOM. Дивіться оновлений приклад / jsFiddle.
ComFreek

@SumitBijvani Я також усунув деякі недоліки, будь ласка, дивіться свої коментарі до коду. Не соромтеся задавати питання;)
ComFreek

1
дякую за оновлений jsFiddle, перевірки працюють нормально, але є одна проблема, коли я ввожу справжню адресу електронної пошти, то також підтвердження говорить, що електронна адреса недійсна
Sumit Bijvani

1
Це чудово працює. Я хотів, щоб функціонал HTML5 "вимагав" також перевіряти лише представлені символи пробілів (тоді як за замовчуванням він підтверджує лише поданий порожній рядок). Тож я змінив два рядки на if (input.value == "") {, замість того, щоб прочитати if (input.value.trim() == "") {- чи це фокус для мене.
Джаза

56

Ви можете просто досягти цього, використовуючи атрибут oninvalid, оформити цей демо-код

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

введіть тут опис зображення

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


13
хаха, всі викидають сторінки коду, я так лінивий, і я шукав вбудований, дякую @akshay khale, найкраща відповідь.
Dheeraj Thedijje

1
Радий допомогти @Thedijje
Акшай Khale

10
Будь ласка, майте на увазі, що setCustomValidity має бути скинутий таким чином oninput="setCustomValidity('')": stackoverflow.com/a/16878766/1729850
Leia

2
Дякую @Leia за доповнення цієї відповіді. На жаль, не працює для перемикачів. тобто якщо ви запустили недійсну на одній кнопці, додається власна рядок. Тоді якщо ви натиснете іншу радіо-кнопку, вона не очистить рядок cutomValidity на першій. Таким чином, схоже, що для прослуховування та очищення будь-якого набору настроюваного програмного забезпечення для всіх відповідних радіо кнопок потрібен якийсь JavaScript.
ryan2johnson9

2
Це має бути прийнятою відповіддю. Простота - найкраще рішення.
Кено Клейтон

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

Демонстрація:

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


Це єдиний, хто працював на мене. Спасибі, Рікіне.
Башар Гаданфар

Я не хотів пробувати інші передові підходи. Це був єдиний простий, який працював на мене для перевірки електронної пошти. Дякую!
Mycodingproject

16

Спробуйте це:

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

Я перевірив це в Chrome і FF, і це працювало в обох браузерах.


1
Будь-який шанс використовувати багатий HTML-вміст? Здається, він підтримує лише текст, без тегів, наприклад <b>Error: </b> Incorrect email address.
Оммега

Наскільки я знаю, це ще не можливо. Ви можете відповідно стилізувати результат за допомогою CSS, але це, звичайно, має свої межі і не стосується вашого випадку. У будь-якому випадку, ця технологія все ще є досить новою та недостатньо широко підтримуваною для більшості, так що, на мою думку, ви все ще краще використовувати альтернативне рішення.
Леві Ботелхо

Скажімо, іноді (залежить від інших входів), я хочу дозволити порожнє значення такого поля введення. Як потім вимкнути повідомлення про перевірку за замовчуванням? Призначення setCustomValidity("")не допомагає. Чи є якийсь інший параметр, який потрібно встановити? Порадьте, будь ласка.
Оммега

8

Людина, я ніколи цього не робив у HTML 5, але спробую. Погляньте на цю загадку.

Я використовував деякі події та властивості jQuery, HTML5 та власні атрибути в тезі введення (це може спричинити проблеми, якщо ви спробуєте перевірити свій код). Я не проходив тестування у всіх браузерах, але, думаю, це може працювати.

Це код JavaScript для перевірки поля з 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 : "");
        };
    });
});

Приємно. Ось проста форма 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>

Атрибут requiredmessage- це спеціальний атрибут, про який я говорив. Ви можете встановити своє повідомлення для кожного необхідного поля, оскільки jQuery отримає від нього, коли воно відобразить повідомлення про помилку. Не потрібно встановлювати кожне поле прямо на JavaScript, jQuery робить це за вас. Цей регулярний вираз здається нормальним (принаймні, він блокує ваш testing@.com! Ха-ха)

Як ви бачите на скрипці, я роблю додаткову валідацію події форми подання ( це стосується і документа. Вже ):

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

Я сподіваюся, що це спрацює чи допоможе вам у будь-якому випадку.


Щоб уникнути нестандартного атрибута, ви можете використовувати стандартний data-префікс; напр data-requiredMessage. За допомогою jQuery це доступно за допомогою $(element).data('requiredMessage'); Я не знаю стандартного інтерфейсу DOM вгорі голови.
IMSoP

@IMSoP впевнений, це дійсно!
DontVoteMeDown

6

Це добре для мене:

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

і форму, з якою я його використовую (усічений):

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

введіть тут опис зображення


5

Ви можете виконати налаштування прослуховувача подій для "недійсного" на всіх входах одного типу або лише одного, залежно від того, що вам потрібно, а потім налаштувати відповідне повідомлення.

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

У другому фрагменті сценарію повідомлення про дійсність буде скинуто, оскільки в іншому випадку не вдасться подати форму: наприклад, це запобігає ініціюванню повідомлення, навіть коли адресу електронної пошти було виправлено.

Крім того, вам не потрібно встановлювати поле для введення, як потрібно, оскільки "недійсне" буде запущено, коли ви почнете вводити вхід.

Ось загадка для цього: http://jsfiddle.net/napy84/U4pB7/2/ Сподіваюся, що це допомагає!


5

Використовуйте атрибут "title" у кожному вхідному тезі та напишіть на ньому повідомлення


4

Просто потрібно отримати елемент і використовувати метод setCustomValidity.

Приклад

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

3

ви можете просто просто скористатися атрибутом oninvalid = " , використовуючи bingding цей event.setCustomValidity () eventListener!

Ось мої демо-коди! (Ви можете запустити його, щоб перевірити!) введіть тут опис зображення

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

посилання на посилання

http://caniuse.com/#feat=form- валідація

https://www.w3.org/TR/html51/sec-forms.html#sec-constraint- валідація


setCustomValidity ()
xgqfrms

1

Ви можете додати цей сценарій для показу власного повідомлення.

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

Для інших перевірок, таких як невідповідність шаблону, ви можете додати додаткові, якщо інша умова

подібно до

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

Є й інші умови дійсності, такі як rangeOverflow, rangeUnderflow, stepMismatch, typeMismatch, valid

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