【问题标题】:HTML input attribute "pattern" enforcing pattern even when blank即使为空白,HTML 输入属性“模式”也会强制执行模式
【发布时间】:2020-06-24 02:01:47
【问题描述】:

我的浏览器(Chrome,Mac 上)有一个这样呈现的输入元素。注意空白的pattern 属性

<input aria-labelledby="Amount Given" type="text" pattern="" inputmode="" field="[object Object]" data-qa="Amount Given" placeholder="$0.00" variant="default" metadata="[object Object]" class="sc-fznzOf dIIJtr" value="" style="text-align: right;">

According to MDN:

如果模式属性存在但未指定或无效,则不应用正则表达式并完全忽略此属性。如果模式属性有效且非空值与模式不匹配,则约束验证将阻止表单提交。

据此,我的输入元素应该忽略pattern 属性,因为pattern 被赋予空字符串值。相反,约束验证阻止了表单提交,并且我收到有关模式不匹配的原生 html 工具提示警告。

让这更令人困惑的是,这个元素是由一个 React 组件呈现的,该组件完全正常运行,并且在我组织的其他地方使用,没有这个障碍。

其他需要注意的事项:如果我在开发工具中手动完全删除了该属性,提交不会被阻止(这意味着它肯定是这个属性在执行)。在 UI 中,如果我将字段完全留空,则不再阻止提交(这意味着我通过了模式匹配约束)。

因此,似乎实际发生的是空白pattern 属性在我的字段上强制执行“空”模式(与required 属性相反)。这与 MDN 文档或我能找到的任何其他文档中描述的不同。

但是,事实上,这个 React 组件在其他地方呈现完全相同的 HTML 而没有这个问题,我觉得 HTML 表单 DOM 约束系统的其他一些功能是强制空白模式,这在我能找到的文档。

【问题讨论】:

  • pattern(而不是pattern="")也会发生这种情况吗?
  • 实际上pattern 是它在开发工具中的显示方式,但是当我从那里复制它并粘贴到这里时,它就变成了这样pattern=""。我理解这两种语法来向浏览器表示相同的东西。

标签: javascript html forms validation


【解决方案1】:

当您(或 REACT)使用 javascript 修改 DOM 时,检查器中的更改并不总是很明显,即使它们已经发生了。我猜想在呈现页面后使用 javascript 设置模式属性,但您只是看到所述页面的初始呈现。尝试右键单击检查器中的元素并选择“在控制台中使用”。然后在控制台中查看pattern属性是什么。我的猜测是它会有所不同。

【讨论】:

  • 感谢您的回复。当我右键单击检查器中的输入元素时,我没有看到“在控制台中使用”选项。我尝试悬停,然后在控制台中用 $0 打印它,我得到了和以前完全相同的东西
  • 在 Firefox 中,它是“在控制台中使用”。在 Chrome 中,相当于“存储为全局变量”。它可能会将其存储为 temp1。然后你在控制台执行这个命令,看看属性值是什么:temp1.getAttribute("pattern")
  • 嗯,好的。这与使用 $0 访问相同。没变。 ``` ```
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2015-11-27
  • 2021-03-21
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多