表单输入实时反馈

Posted

技术标签:

【中文标题】表单输入实时反馈【英文标题】:Form input realtime feedback 【发布时间】:2019-10-17 02:57:35 【问题描述】:

我正在构建一个带有用户名输入字段的表单。我想使用正则表达式将用户名限制为很小范围的字符,根据输入的有效性与用户键入时的正则表达式相比,将文本的颜色从红色更改为绿色。

到目前为止,尽管对正则表达式进行了积极测试,但它没有选择任何无效的字符。

https://regex101.com/r/XPFy6c/1/

/^[A-Z0-9 -]+$/igm

这是代码,带有 JSFiddle here。

const form = document.querySelector('form');
const input = document.querySelector('input');

const check = /^[A-Z0-9 -]+$/ig;

form.addEventListener("input", e => 
    const checkName = check.test(input.value);
    if(!check) 
        input.classList.add('invalid-name');
        input.classList.remove('valid-name');
     else 
        input.classList.add('valid-name');
        input.classList.remove('invalid-name');
    
)
.invalid-name 
  color: red;


.valid-name 
  color: green;
<form id="form">
    <input class="col-12 edit-name-field" id="name" name="edit-name" maxlength="12" autocomplete="off">
</form>

更新:虽然这个问题已经解决,但如果您尝试代码,您会注意到正则表达式交替真/假仍然存在问题。这个问题的解决方法是here。

【问题讨论】:

【参考方案1】:

如果你只关心现代浏览器,你甚至不需要 javascript

input  border: 2px solid #DDD; 
input:invalid  border-color: red; 
input:valid  border-color: green; 
&lt;input type="text" pattern="^[A-Z0-9 -]1,12$"&gt;

【讨论】:

【参考方案2】:

在您的事件侦听器中,您正在测试该值,但是,之后您的条件基于持有正则表达式的引用而不是测试结果。即check 而不是checkName。由于正则表达式将始终评估为 truthy 值,因此您的条件的 else 部分将被执行。尝试您的代码进行以下更改:

form.addEventListener("input", e => 
    const checkName = check.test(input.value);
    if(!checkName) 
        input.classList.add('invalid-name');
        input.classList.remove('valid-name');
     else 
        input.classList.add('valid-name');
        input.classList.remove('invalid-name');
    
);

此外,您还应该考虑使用更具体的选择器选择表单和输入。现在您的选择器基本上返回正文中的“第一个输入字段”或“第一个表单”,这可能并不总是您期望的元素。

【讨论】:

谢谢,这是我犯的愚蠢错误!【参考方案3】:

我认为你需要使用 checkName 变量

    const checkName = check.test(input.value);
    if(!checkName)

【讨论】:

【参考方案4】:

您的代码有两个问题:

    input 事件在inputselecttextarea 标签上触发,而不是form。因此,addEventListener 位于错误的元素上 当您验证RegExp 是否与test 一起使用时,返回值是一个布尔值,指示是否可以使用,而不是RegExp 本身。因此,if 语句需要调整。

更正下面的sn-p:

const form = document.querySelector('form');
const input = document.querySelector('input');

const check = /^[A-Z0-9 -]+$/ig;

input.addEventListener("input", e => 
    const checkName = check.test(input.value);
    if(!checkName) 
        input.classList.add('invalid-name');
        input.classList.remove('valid-name');
     else 
        input.classList.add('valid-name');
        input.classList.remove('invalid-name');
    
)
.invalid-name 
  color: red;


.valid-name 
  color: green;
<form id="form">
    <input class="col-12 edit-name-field" id="name" name="edit-name" maxlength="12" autocomplete="off">
</form>

【讨论】:

关于第一个问题,'input' 事件在 DOM 树中冒泡。因此,通过将“输入”事件处理程序附加到包含表单,当然可以捕获子输入上的所有输入事件。我没有在旧浏览器中尝试过,但至少在现代浏览器中这似乎是正确实现的。

以上是关于表单输入实时反馈的主要内容,如果未能解决你的问题,请参考以下文章

AngularJs的表单验证

Bootstrap 4表单验证在使用无效反馈时不起作用,即使输入'is-valid'

基于其他输入值的表单输入实时计算

创建表单输入的实时预览

当另一个字段有反馈时,为啥 bootstrap-4 输入组会拉伸?

Swift IOS在实时jquery中捕获html表单输入