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

Ski*_*zit 291 html javascript forms validation html5

我有以下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"/>
Run Code Online (Sandbox Code Playgroud)

目前当我在空白时点击输入时,会出现一个弹出框,上面写着"请填写此字段".如何将该默认消息更改为"此字段不能留空"?

编辑:另请注意,类型密码字段的错误消息很简单*****.要重新创建此项,请为用户名提供值并点击提交.

编辑:我正在使用Chrome 10进行测试.请这样做

Som*_*dam 243

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

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

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

oninput="this.setCustomValidity('')"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在这种情况下,您甚至可以省略“this.”,因为内联事件处理程序[使用“with(this)”运行](/sf/answers/3993364721/)(并不是说您应该这样做) (4认同)
  • 感谢oninput ="setCustomValidity('')"作为最重要的标记.这节省了我的一天. (3认同)
  • @somnath-kadam 这是一个错误还是你故意做 oninput="setCustomValidity('')" 而不是 oninput="this.setCustomValidity('')" (2认同)

rob*_*rtc 239

用途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("");
        };
    }
})
Run Code Online (Sandbox Code Playgroud)

我按照@itpastorn在评论中的建议从Mootools 改为vanilla JavaScript,但是你应该能够在必要时计算Mootools的等价物.

编辑

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

进一步编辑

正如@ thomasvdb在下面的评论中指出的那样,你需要在某些事件之外清除自定义有效性,invalid否则可能需要额外通过oninvalid处理程序来清除它.

  • 上面的解决方案只使用JQuery等待文档加载.其他一切都是纯粹的JS和DOM.现代足以支持setCustomValidity的浏览器也应该支持DOMContentLoaded事件,这意味着不需要JQuery,如果它不用于其他任何事情. (4认同)

小智 93

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

这是代码:

<input id="UserID"  type="text" required="required"
       oninvalid="this.setCustomValidity('Witinnovation')"
       onvalid="this.setCustomValidity('')">
Run Code Online (Sandbox Code Playgroud)

这是最重要的:

onvalid="this.setCustomValidity('')"
Run Code Online (Sandbox Code Playgroud)

  • 这导致firefox中的一个错误,它在刷新时验证,但在更改和更正时失败. (10认同)
  • @RyanCharmley使用`onchange ="this.setCustomValidity('')"`bug将会消失.检查我的答案如下. (9认同)
  • 还要检查其他验证,例如模式,最小/最大值等... http://sanalksankar.blogspot.com/2010/12/custom-validation-message.html (3认同)
  • @Jimothy 是对的,`oninput` 是更通用的解决方案,`onvalid` 即使在 Chrome 中对我来说也不起作用。 (3认同)
  • 如果这不起作用(例如,在Safari中不起作用),请使用“ oninput”而不是“ onvalid”。 (2认同)

kzh*_*kzh 66

注意:这不再适用于Chrome,未在其他浏览器中测试过.请参阅下面的编辑.这个答案留待这里作为历史参考.

如果您认为验证字符串确实不应该由代码设置,则可以将输入元素的title属性设置为"此字段不能留空".(适用于Chrome 10)

title="This field should not be left blank."
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/kaleb/nfgfP/8/

在Firefox中,您可以添加以下属性:

x-moz-errormessage="This field should not be left blank."
Run Code Online (Sandbox Code Playgroud)

编辑

自从我最初写这个答案以来,这似乎已经改变了.现在添加标题不会更改有效性消息,它只是添加了消息的附录.上面的小提琴仍然适用.

编辑2

Chrome现在不对Chrome 51的title属性执行任何操作.我不确定此更改的版本.

  • 我的错误,OP指定Chrome 10,我在FF5上.删除了downvote,道歉.哇,Chrome中的错误信息是我见过的最丑陋的**. (3认同)
  • 在我测试它的时候. (2认同)
  • 对于Firefox中的声明性错误消息,请使用以下属性:`x-moz-errormessage ="此字段不应留空." (2认同)
  • 这会在"请填写此字段"下添加描述性消息. (2认同)

hle*_*one 36

我创建了一个小型库来简化更改和翻译错误消息.您甚至可以按错误类型更改文本,目前title在Chrome或x-moz-errormessageFirefox中无法使用.去看看GitHub上,并提出反馈意见.

它的使用方式如下:

<input type="email" required data-errormessage-value-missing="Please input something">
Run Code Online (Sandbox Code Playgroud)

jsFiddle有一个演示版.


小智 36

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

这是代码:

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

  • 一旦控制显示输入,则需要将有效性消息设置为空白否则将显示所有字段的第一个执行的有效性消息.每当调用setCustomValidity()时,添加oninput ="setCustomValidity('')".给索姆纳特的答案+1. (4认同)

Sal*_*lar 36

通过setCustomValidity在正确的时间设置和取消设置,验证消息将完美地工作.

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

我使用onchange而不是oninput更通用的,并且即使通过JavaScript在任何条件下更改值也会发生.


Rik*_*tel 21

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

HTML:

<form id="myform">
    <input id="email" 
           oninvalid="InvalidMsg(this);" 
           oninput="InvalidMsg(this);"
           name="email"  
           type="email" 
           required="required" />
    <input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

演示:

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

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

Col*_*ite 10

我发现最简单,最干净的方法是使用数据属性来存储自定义错误.测试节点的有效性并使用一些自定义html处理错误.在此输入图像描述

le javascript

if(node.validity.patternMismatch)
        {
            message = node.dataset.patternError;
        }
Run Code Online (Sandbox Code Playgroud)

和一些超级HTML5

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

  • 尽管错误只说字母,但模式允许空格和撇号?此外,`Az`允许'[','\',']','^','_'和'`'. (3认同)

And*_*ard 8

防止在输入每个符号时出现 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>
Run Code Online (Sandbox Code Playgroud)


Car*_*ard 6

如果您的错误消息是单一的,请尝试以下操作。

<input oninvalid="this.setCustomValidity('my error message')"
       oninput="this.setCustomValidity('')">  <!--  don't forget it. -->
Run Code Online (Sandbox Code Playgroud)

要处理多个错误,请尝试以下操作

<input oninput="this.setCustomValidity('')">
<script>
inputElem.addEventListener("invalid", ()=>{
    if (inputElem.validity.patternMismatch) {
      return inputElem.setCustomValidity('my error message')
    }
    return inputElem.setCustomValidity('') // default message
})
</script>
Run Code Online (Sandbox Code Playgroud)

例子

您可以测试输入非法文件名valueMissing

<form>
<input pattern="[^\\/:\x22*?<>|]+"
       placeholder="input file name"       
       oninput="this.setCustomValidity('')"
       required
>
  <input type="submit">
</form>

<script>
  const form = document.querySelector("form")

  const inputElem = document.querySelector(`input`)

  inputElem.addEventListener("invalid", ()=>{   
    if (inputElem.validity.patternMismatch) {
      return inputElem.setCustomValidity('Illegal Filename Characters \\/:\x22*?<>|')
    }
    return inputElem.setCustomValidity('') // return default message according inputElem.validity.{badInput, customError, tooLong, valueMissing ...}
  })

  form.onsubmit = () => {
    return false
  }
</script>
Run Code Online (Sandbox Code Playgroud)


ber*_*rdh 5

我有一个更简单的 vanilla js 解决方案:

对于复选框:

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

对于输入:

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