Необхідний атрибут форми HTML5. Встановити спеціальне повідомлення про перевірку?


326

У мене така форма HTML5: 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"/>

На даний момент, коли я натискаю клавішу Enter, коли вони обоє порожні, з'являється спливаюче вікно із написом "Будь ласка, заповніть це поле". Як я можу змінити це повідомлення за замовчуванням на "Це поле не можна залишати порожнім"?

РЕДАКТУВАННЯ: Також зверніть увагу, що повідомлення про помилку поля введення пароля просто***** . Щоб відтворити це, дайте ім’я користувача значення та натисніть кнопку "Надіслати".

EDIT : Я використовую Chrome 10 для тестування. Будь ласка, зробіть те саме


1
Ой, +1 за божевільне повідомлення про підтвердження порожнього пароля = / Як це пройшло QA, мені цікаво ...
Девід каже, що відновити Моніку

3
Чому б просто не прийняти повідомлення за замовчуванням у веб-переглядачі? Ось що бачать користувачі для кожного іншого веб-сайту, який вони відвідують, ви просто заплутаєте своїх користувачів, створивши нестандартне повідомлення. (Google, ймовірно, керував більшою оцінкою та тестуванням UX для визначення цього формулювання, ніж у вас!).
ChrisV

12
@ChrisV Що з багатомовними сайтами?
inemanja

1
У моєму випадку я хочу перевірити, що значення є числом перед публікацією, але я не можу використовувати атрибут type = "number" (з причин.). Тому я встановлюю атрибут шаблону, щоб перевірити наявність чисел та необов'язкових десяткових знаків, що дає повідомлення , "Будь ласка, відповідайте запитуваному формату" за помилкою. Я вважаю за краще сказати: "Ви повинні подарувати нам кілька букків".
Крістофер

Відповіді:


267

Використання 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("");
        };
    }
})

Я змінив JavaScript на ванільний з Mootools, як запропонував @itpastorn в коментарях, але ви повинні мати можливість розробити еквівалент Mootools, якщо це необхідно.

Редагувати

Я оновив тут код, оскільки він setCustomValidityпрацює трохи інакше, ніж те, що я зрозумів, коли первісно відповів. Якщо setCustomValidityвстановлено щось інше, ніж порожній рядок, це призведе до того, що поле вважатиметься недійсним; тому ви повинні очистити його перед тестуванням дійсності, ви не можете просто встановити його і забути.

Подальше редагування

Як зазначено в коментарі @ thomasvdb нижче, вам потрібно очистити дійсну дійсність у деяких випадках поза, invalidінакше може бути додатковий пропуск через oninvalidобробник, щоб очистити його.


Я спробував це, але все ж є помилка. Якщо ви залишите поле порожнім, воно показує повідомлення, а потім введіть щось у поле, але тепер воно показує порожнє повідомлення, і дія не виконується. Якщо зараз знову натиснути кнопку, вона пройде.
thomasvdb

1
@thomasvdb Спробуйте встановити власну дійсність на порожній рядок inputподії. Наразі це стає зрозумілим лише у invalidвипадку звільнення події.
robertc

Це справді рішення. З'ясував це за допомогою розчину @hleinone. Дякуємо за відповідь!
thomasvdb

4
Наведене вище рішення використовує лише JQuery для очікування завантаження документа. Все інше - чисто JS та DOM. Браузер, достатньо сучасний для підтримки setCustomValidity, також повинен підтримувати подію DOMContentLoaded, тобто JQuery не потрібен, якщо він не використовується ні для чого іншого.
itpastorn

1
@ Lai32290, оскільки ви не маєте доступу до фактичного об’єкта DOM. $("")повертає масив об'єктів, навіть якщо є лише один. $("")[i]швидше за все, що ви хочете.
Ной Пассалакква

288

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

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

Ця частина важлива, оскільки вона приховує повідомлення про помилку, коли користувач вводить нові дані:

oninput="this.setCustomValidity('')"

Відмінно працює на Firefox 29.0 та Chrome 34.0.1847.137.
Фернандо Кош

ідеально і досі у FF 38. Виправлена ​​помилка перевірки електронної пошти, якщо використовується лише oninvalid ().
andrew

Не працює в Safari в iPad та iPhone. Працює, як очікувалося, на робочому столі Chrome.
Набіль

2
@ somnath-kadam Це помилка чи ви навмисно зробили oninput = "setCustomValidity ('')" замість oninput = "this.setCustomValidity ('')"
tormuto

3
Дякуємо за позначення oninput = "setCustomValidity ('')" як найважливішого. Це врятувало мені день.
singhpradeep

99

Керувати користувацькими повідомленнями за допомогою HTML5події дуже простоoninvalid

Ось код:

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

Це найважливіше:

onvalid="this.setCustomValidity('')"

3
Також перевірте інші перевірки, такі як шаблон, значення мінімуму
Jaider

10
Це спричиняє помилку у Firefox, де вона перевіряється при оновленні, але не дає змоги зміни та виправлення.
Райан Чармлі

12
@RyanCharmley, використовуючи onchange="this.setCustomValidity('')"помилку, не буде. Перевірте мою відповідь нижче.
Салар

4
Якщо це не працює (це, наприклад, не в Safari), використовуйте oninputзамість onvalid.
Джимофій

2
@Jimothy вірно з цього приводу, oninputце більш універсальне рішення, onvalidне працювало навіть у Chrome для мене.
ThisGuyCantEven

68

Примітка. Це більше не працює в Chrome, не тестується в інших браузерах. Див. Правки нижче. Ця відповідь залишається тут для історичного ознайомлення.

Якщо ви вважаєте, що рядок перевірки дійсно не повинен встановлюватися кодом, ви можете встановити вам атрибут заголовка елемента вводу, щоб він читав "Це поле не може залишатися порожнім". (Працює в Chrome 10)

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

Подивитися http://jsfiddle.net/kaleb/nfgfP/8/

І в Firefox ви можете додати цей атрибут:

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

Редагувати

Це, мабуть, змінилося з моменту, коли я написав цю відповідь. Тепер додавання заголовка не змінює дійсне повідомлення, воно просто додає доповнення до повідомлення. Загадка вище все ще діє.

Редагувати 2

Зараз Chrome нічого не робить з атрибутом заголовка, як у Chrome 51. Я не впевнений, у якій версії це змінилося.


1
Це не змінює фактичний вміст повідомлення.
Wesley Murch

2
У той час, коли я тестував, це робив.
кж

3
Моя помилка, OP вказав Chrome 10, я був на FF5. Вилучені знімки, мої вибачення. Нічого собі, це повідомлення про помилку в Chrome - це найгірша річ, яку я коли-небудь бачив.
Веслі Мерч

2
Для повідомляльних повідомлень про помилки у Firefox використовуйте атрибут:x-moz-errormessage="This field should not be left blank."
robertc

2
Це додає описове повідомлення у розділі "Будь ласка, заповніть це поле".
Магне

41

Керувати користувацькими повідомленнями за допомогою HTML5 oninvalidподії дуже просто

Ось код:

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

4
Потрібно встановити повідомлення про дійсність на порожнє, як тільки контроль виявить введення, перше виконане повідомлення про дійсність буде показано для всіх полів. Додайте oninput = "setCustomValidity ('')" при кожному виклику setCustomValidity (). +1 до відповіді Сомната.
Таранг

41

Якщо встановити та зняти значення setCustomValidityв потрібний час, повідомлення перевірки буде працювати бездоганно.

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

Я використовував onchangeзамість цього oninputбільш загальний характер і виникає, коли значення змінюється в будь-якому стані навіть через JavaScript.


Це має бути прийнятою відповіддю. Працював у Windows 10 1709 у таких браузерах: Chrome 66.0.3359.139 64 біт, Firefox 59.0.3 (64-бітний), Internet Explorer 11.431.16299.0, Edge 41.16299.402.0. Працював у macOS 10.13.2 в Safari 11.0 (13604.1.38.1.6). Працював в Android 4.4.4 в Chrome 66.0.3359.158. Для тих , хто шукає шляхи JSX: onInvalid={(e) => { e.target.setCustomValidity('foo') }} onChange={(e) => { e.target.setCustomValidity('') }}.
GuiRitter

Додаток: eможе бути недійсним, наприклад, коли параметр видалено з поля React Select. Не забудьте перевірити це.
GuiRitter

Errata: щоб скористатися цією onChangeonInvalidinputProps={{ onInvalid: …, onChange: …, }}
функцією

Додаток: type='email'трохи важче лікувати, так як з допомогою setCustomValidityнаборів customError: trueдля e.target.validityнавіть якщо вхід активний. Я намагаюся знайти спосіб це виправити.
GuiRitter

@GuiRitter Ви це зрозуміли?
EvilJordan

39

Я створив невелику бібліотеку для полегшення зміни та перекладу повідомлень про помилки. Ви навіть можете змінити тексти за типом помилок, які наразі недоступні для використання titleв Chrome або x-moz-errormessageFirefox. Перейдіть на GitHub і дайте відгуки.

Він використовується так:

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

Там в демо доступні на jsFiddle .


Дякую! Вирішив мій маленький помилок, згаданий як коментар у прийнятій відповіді.
thomasvdb

Гарна відповідь, оскільки OP використовує Google Chrome; ти не буде працювати в IE Edge
CoderHawk

23

Спробуйте цю, її кращу і перевірену:

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

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

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


Гей .... приємне рішення, але тип = електронна пошта не працює в браузері сафарі. подивіться w3schools.com/html/html_form_input_types.asp
Bhawna Malhotra

2
Так, він не підтримується для сафарі, але я дав відповідь на встановлене повідомлення про валідацію.
Rikin Patel

10

Найпростіший і найпростіший спосіб, який я знайшов, - це використовувати атрибут даних для зберігання власної помилки. Перевірте правильність вузла та обробіть помилку, скориставшись спеціальним html.введіть тут опис зображення

le javascript

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

і кілька супер HTML5

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

3
Незважаючи на помилку, говорячи лише про літери, шаблон дозволяє простір та апостроф? Також A-zдозволяє '[', '\', ']', '^', '_' та '' '.
Лоуренс Дол

5

Рішення щодо запобігання повідомлень про помилки Google Chrome при введенні кожного символу:

<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

У мене є більш просте рішення з ванільним js:

Для прапорців:

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

Для входів:

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

1

Пристосовуючи відповідь Салара до JSX та React, я помітив, що React Select не поводиться так, як <input/>поле щодо перевірки. Мабуть, потрібно декілька обхідних шляхів, щоб показати лише спеціальне повідомлення та не відображати його у незручний час.

Я порушив тут питання , якщо це щось допомагає. Ось CodeSandbox з робочим прикладом, і тут відтворений найважливіший код:

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

Гаразд, oninvalid працює добре, але він показує помилку, навіть якщо користувач ввів дійсні дані. Тому я використовував нижче, щоб вирішити цю проблему, сподіваюся, що вона буде працювати і для вас,

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


-7

Можна легко впоратися, просто вписавши поле з заголовком:

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

Це не змінює відображене повідомлення про помилку. Він відображає лише назву на вході, коли клацніть курсор миші.
Матьє

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