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键时,会出现一个弹出框,提示“请填写此字段”。如何将默认消息更改为“此字段不能为空”?

编辑:还请注意,类型密码字段的错误消息很简单*****。要重新创建此名称,请为用户名指定一个值,然后单击“提交”。

编辑:我正在使用Chrome 10进行测试。请同样


1
哦,为疯狂的空密码验证消息+1 = /那是如何通过质量检查的,我想知道...
大卫说,请恢复莫妮卡(Monica)

3
为什么不只接受浏览器默认消息?这就是用户在访问的每个其他网站上看到的内容,您只会通过创建非标准消息来使用户感到困惑。(在确定措辞方面,Google可能比您管理了更多的用户体验评估和测试!)。
ChrisV 2011年

12
@ChrisV多语言网站呢?
inemanja

1
在我的情况下,我想在发布前检查值是否为数字,但是由于某种原因,我不能使用type =“ number”属性。因此,我将pattern属性设置为检查数字和可选的小数,从而给出消息,“请匹配请求的格式”,错误。我宁愿这样说:“是的,我们必须送给我们几巴克。”
克里斯托弗

Answers:


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

我已根据@itpastorn在评论中的建议,从Mootools 更改为Vanilla JavaScript,但如有必要,您应该可以算出Mootools的等效版本。

编辑

我在这里更新了代码,其setCustomValidity工作方式与我最初回答时所了解的略有不同。如果setCustomValidity设置为空字符串以外的任何其他值,则将导致该字段被视为无效;因此,您必须在测试有效性之前清除它,而不能只是设置它而忘记。

进一步编辑

如下面@thomasvdb的注释中所指出的,您需要在某些事件之外清除自定义有效性,invalid否则可能需要通过oninvalid处理程序进行额外的清除。


我试过了,但是仍然有错误。如果将该字段保留为空,则显示消息,然后在该字段中输入内容,但现在显示为空消息,并且未执行该操作。如果现在再次单击该按钮,它将通过。
thomasvdb 2012年

1
@thomasvdb尝试在input事件上将自定义有效性设置为空字符串。目前,只有在invalid事件被触发时才会被清除。
robertc 2012年

这确实是解决方案。通过@hleinone解决方案找到了它。感谢您的回复!
thomasvdb 2012年

4
上面的解决方案仅使用JQuery等待文档加载。其他所有内容都是纯JS和DOM。足以支持setCustomValidity的现代浏览器也应支持DOMContentLoaded事件,这意味着不需要JQuery(如果未将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上完美运行。
Fernando Kosh 2014年

完美,到目前为止在FF 38中 修复了仅使用oninvalid()时电子邮件验证中的错误。
andrew

无法在iPad和iPhone的Safari中使用。虽然可以在Chrome桌面上正常工作。
Nabeel

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
还检查其他的验证以及诸如图案,最小/最大值等... sanalksankar.blogspot.com/2010/12/...
Jaider

10
这会在firefox中引起一个错误,该错误会在刷新时生效,但在更改和更正时失败。
Ryan Charmley 2013年

12
@RyanCharmley通过使用onchange="this.setCustomValidity('')"该错误将消失。在下面检查我的答案。
撒拉族(Salar)

4
如果这不起作用(例如,在Safari中不起作用),请使用oninput代替onvalid
Jimothy

2
@Jimothy对此是正确的,oninput是更通用的解决方案,onvalid即使对于我来说,在Chrome中也无法使用。
ThisGuyCantEven

68

注意:此功能不再适用于Chrome浏览器,也未经其他浏览器测试。请参见下面的修改。这个答案留在这里供历史参考。

如果您认为验证字符串确实不应该由代码设置,则可以将输入元素的title属性设置为“此字段不能为空”。(适用于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 51开始,Chrome现在对title属性不执行任何操作。我不确定这在哪个版本中进行了更改。


1
这不会更改实际的消息内容。
Wesley Murch

2
在我测试的时候。
2011年

3
我的错误是OP指定的是Chrome 10,当时我使用的是FF5。删除downvote,我很抱歉。哇,Chrome中的错误消息是我见过的最丑的东西。
Wesley Murch

2
对于Firefox中的声明性错误消息,请使用以下属性:x-moz-errormessage="This field should not be left blank."
robertc 2011年

2
这将在“请填写此字段”下添加一个描述性消息。
Magne 2013年

41

在的帮助下控制自定义消息非常简单 HTML5 oninvalid事件

这是代码:

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

4
输入控制指令后,必须将有效性消息设置为空白,否则将为所有字段显示首次执行的有效性消息。每当调用setCustomValidity()时,添加oninput =“ setCustomValidity('')”。+1为Somnath的答案。
Tarang 2015年

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。在Safari 11.0(13604.1.38.1.6)的macOS 10.13.2中工作。在Chrome浏览器66.0.3359.158中的Android 4.4.4中工作。对于那些寻找JSX方法的人:onInvalid={(e) => { e.target.setCustomValidity('foo') }} onChange={(e) => { e.target.setCustomValidity('') }}
GuiRitter

附录:e可能为null,例如,当从“反应选择”字段中删除选项时。别忘了检查一下。
GuiRitter

勘误表:要与React Select一起使用,您必须通过onChangeonInvalid通过inputProps={{ onInvalid: …, onChange: …, }}
GuiRitter

附录:type='email'处理起来有些困难,因为即使输入有效,也使用setCustomValidityset 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 2012年

很高兴,因为OP使用的是Google Chrome浏览器;我认为这在IE Edge中
不起作用

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/


嘿....不错的解决方案,但type = email在Safari浏览器中不起作用。看看w3schools.com/html/html_form_input_types.asp
Bhawna Malhotra

2
是的,Safari浏览器不支持此功能,但是我为设置自定义验证消息提供了答案。
Rikin Patel

10

我找到的最简单最干净的方法是使用数据属性存储您的自定义错误。测试节点的有效性,并使用一些自定义html处理错误。在此处输入图片说明

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

根据Salar对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

只需在字段中加上“ title”即可轻松处理:

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

这不会更改显示的错误消息。悬停时,它仅在输入上显示标题。
Mathieu Dumoulin

这不是“标题”对输入字段显示某些警报的正确可用性。
sajad saderi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.