当前位置: 首页 > 知识库问答 >
问题:

为什么在输入(Chrome65)时忽略setCustomValality(")

边国安
2023-03-14

注:据我所知,该问题不是以下问题的重复问题:

  • HTML5:为什么我的“oninvalid”属性让模式失败
  • HTML5表单必需属性。设置自定义验证消息
  • 如何更改或删除HTML5表单验证默认错误消息

给定一个字段:

  • 为验证设置了模式属性,例如对于4个字符的十六进制字符串输入设置了“[a-f,0-9]{4}”

下面是一个示例,说明了这一点:

/* jshint esnext: true */
const form   = document.querySelector("#form");
const field  = document.querySelector("#field");
const output = document.querySelector("#output");

form.addEventListener('submit', (e) => {
  console.log("SUBMIT");
  output.textContent = field.value;
  e.preventDefault(); // Prevent default POST request
});

field.oninvalid = (event) => {
  console.log("INVALID");
  event.target.setCustomValidity('must be valid 4 hex characters');
}

field.oninput = (event) => {
  console.log("INPUT");
  event.target.setCustomValidity('');
}
Output: <span id="output">No output</span>
<form id="form">
  <label for="field">Enter 4 character hex code: </label>
  <input id="field" type="text" pattern="[a-f,0-9]{4}" autocomplete=off>
</form>

验证工作几乎与预期一样,除非用户输入无效条目,然后继续尝试并编辑它,其以下输入状态仍然无效:

此时,既不使用在oninvalid中定义的自定义setCustomValidity消息,也不使用在onInput中定义的空消息。

相反,只要字段处于无效状态且不模糊,默认的请与请求的格式匹配 消息出现。

这到底是怎么回事?在控制台中,每次都调用onininin事件,因此每次都调用event.target.setCustomValality('');

那么,为什么我们仍然看到通用的默认验证消息呢?不应该setCustomValidity(“”)禁用它吗?

此处可接受的答案应显示以下内容:

  • 参数字段用于验证。
  • 当且仅当用户试图提交无效字段时,而不是当他们随后立即修改输入时,任何验证消息都会出现。
  • 默认的请匹配请求的格式。消息永远不会出现。

共有2个答案

袁子瑜
2023-03-14

当多个输入组合无效时,将使用setCustomValality。这就是为什么它必须在之后手动重置为空字符串。其他方面,应该使用title属性。

编辑输入后试图隐藏验证错误是可以理解的,但这违背了HTML5的形式哲学。只要输入无效,就应该显示它。

添加maxlong可以帮助用户不越过上限。

如果您真的希望您的要点得到满足,请不要使用HTML5表单验证,而是使用自定义的东西。

因此,即使setCustomValidity设置为空字符串,也会显示工具提示的原因是,根据模式属性,输入元素仍然无效。

<form id="form">
  <label for="field">Enter 4 character hex code: </label>
  <input id="field" type="text" pattern="[a-f,0-9]{4}" maxlength="4" minlength="4" autocomplete="off" title="must be valid 4 hex characters">
</form>

JS

const form   = document.querySelector("#form");
const field  = document.querySelector("#field");
const output = document.querySelector("#output");

form.addEventListener('submit', (e) => {
  console.log("SUBMIT");
  output.textContent = field.value;
  e.preventDefault(); // Prevent default POST request
});

field.oninvalid = (event) => {
  console.log("INVALID");
}

field.oninput = (event) => {
  console.log("INPUT");
}
施默
2023-03-14

这似乎是windows中Chrome 65的一个bug。

使用setCustomValality(")中的onindin应该禁用输入上出现的默认验证消息。

以下变通方法适用于我:

/* jshint esnext: true */
const form   = document.querySelector("#form");
const field  = document.querySelector("#field");
const output = document.querySelector("#output");

const pattern = field.getAttribute("pattern");

form.addEventListener('submit', (e) => {
  console.log("SUBMIT");
  output.textContent = `User submitted: ${field.value}`;
  e.preventDefault(); // Prevent default POST request
});

field.oninvalid = (event) => {
  console.log("INVALID");
  event.target.setCustomValidity('must be valid 4 hex characters');
}

field.oninput = (event) => {
  console.log("INPUT");
  event.target.setCustomValidity('');
  event.target.removeAttribute("pattern");
}

field.onchange = (event) => {
  console.log("CHANGE");
  event.target.setAttribute("pattern", pattern);
}
  Output: <span id="output">No output</span>
  <form id="form">
    <label for="field">Enter 4 character hex code: </label>
    <input id="field" type="text" pattern="[a-f,0-9]{4}" autocomplete=off>
  </form>
 类似资料:
  • 我对iOS布局约束的机制有误解。请参阅下面列出的我放在viewDidLoad中的代码。 在我看来,我的意图是明确的。我想在设备屏幕的中央看到一个按钮。但我只能看到下面的图片。 我在项目控制台中有一个输出,非常可怕,我无法从中理解任何东西。 无法同时满足约束。可能以下列表中至少有一个约束是您不想要的。尝试以下方法:(1)查看每个约束,并尝试找出您不期望的约束;(2) 查找添加了一个或多个不需要的约束

  • 问题内容: 我有一个带有关系的实体,我想通过一个查询来检索它,因此使用。有时,Hibernate不尊重它,而是发出N + 1 秒。随着 有时 我的意思是,因为我不知道是什么触发它,我有案件对不同的查询,这可能发生,或者不一样的类。 这是带有我使用的注释的简化实体: 用 我希望单个查询能够同时获取其及其内容,例如 相反,我得到了第一选择所有N S和那么N 献给所有S(考虑没有缓存)。 我发现了许多类

  • 问题内容: 与这两个帖子@iMohammad有关, 在单击JButtonJava时使用JButton增加/减少textArea内的字体大小并在单击JButton Java时更改字体样式 …,我面临着一个非常有趣的问题,该问题来自于on 作为参数传递屏幕 请如何动态调整大小取决于,与我在sscce中尝试过的另一个JComponent正常工作一样 问题答案: 我调试了您的SSCCE,并且传递给的值为空

  • null 对于第二个选项,我使用MessageHandler: 每当我的模型(函数)返回适当的标记时,我想输入其中一个ConversationHandlers,但不知道如何执行。

  • 我已经用FilesystemMetadataProvider基于此实现了:https://github.com/vdenotaris/spring-boot-security-saml-sample 为了使 SSL 握手适用于工件绑定,我必须将 IDP 的 CA 证书放在 keyManager 使用的 java 密钥库中。 我宁愿使用jre上的cacerts,以防IDP更改CA,但是我还没有找到任