HTML5表单必填属性。设置自定义验证消息?

2020/10/02 13:21 · javascript ·  · 0评论

我有以下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进行测试。请同样

用途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处理程序进行额外的清除操作。

这是处理HTML5中的自定义错误消息的代码

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

这部分很重要,因为它在用户输入新数据时隐藏了错误消息:

oninput="this.setCustomValidity('')"

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

这是代码:

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

这是最重要的:

onvalid="this.setCustomValidity('')"

注意:此功能在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属性不执行任何操作。我不确定这在哪个版本中进行了更改。

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

这是代码:

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

通过setCustomValidity在正确的时间设置和取消设置,验证消息将正常工作。

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

我使用onchange代替oninput它是更通用的方法,它发生在即使通过JavaScript在任何条件下都更改了值的情况下。

我做了一个小库,以方便更改和翻译错误消息。您甚至可以按错误类型更改文本,这title在Chrome或x-moz-errormessageFirefox中目前不可用GitHub查看它,并提供反馈。

它的用法如下:

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

jsFiddle提供了一个演示

试试这个,它更好并经过测试:

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/

我发现的最简单最干净的方法是使用数据属性存储您的自定义错误。测试节点的有效性,并使用一些自定义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>

防止在输入每个符号时出现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>

我有一个更简单的纯香草js解决方案:

对于复选框:

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

对于输入:

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

适应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}
      />
    );
  }
}

好的,oninvalid效果很好,但是即使用户输入了有效数据,它也会显示错误。所以我在下面用它来解决它,希望它也能为您服务,

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

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

<input type="text" id="username" required title="This field can not be empty"  />
本文地址:http://javascript.askforanswer.com/html5biaodanbitianshuxingshezhizidingyiyanzhengxiaoxi.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!