Javascript 表单验证代码循环

标签 javascript validation loops

以下代码在页面加载时循环,我不明白为什么会这样做。是焦点问题吗?

 alert("JS is working");

function validateFirstName() {
    alert("validateFirstName was called");
    var x = document.forms["info"]["fname"].value;
    if (x == "") {
        alert("First name must be filled out");
        //return false;
    }
}

function validateLastName()
{
    alert("validateLastName was called");
    var y = document.forms["info"]["lname"].value;
    if (y == "") {
        alert("Last name must be filled out");
        //return false;
    }
}

var fn = document.getElementById("fn");
var ln = document.getElementById("ln");

fn.onfocus = validateFirstName();
alert("in between");
ln.onfocus = validateLastName();

最佳答案

您为实现此目的而采取的方法存在一些问题,但您遇到的“循环”行为是因为您结合使用了 alertonFocus。当您将注意力集中在输入字段上并触发警报时,当您消除警报时,浏览器将(默认情况下)重新聚焦先前具有焦点的元素。因此,在您的情况下,您会集中注意力,收到警报,它会自动重新集中焦点,因此会重新触发警报,等等。

更好的方法是使用 input 事件。这样,用户在有机会填写字段之前就不会收到错误消息提示。仅当他们清除字段中的值,或者稍后在代码中调用 validateRequiredField 函数(例如,在表单提交时)时,才会出现提示。

我还更改了您的验证函数,因此您不必为表单上的每个输入创建一个验证函数,该函数执行完全相同的操作,除了吐出略有不同的消息之外。您还应该抽象定义对验证函数之外的每个错误执行什么操作的功能 - 这是出于可测试性和可重用性的目的。

如果您有任何疑问,请告诉我。

function validateRequiredField(fieldLabel, value) {
    var errors = "";
    if (value === "") {
        //alert(fieldLabel + " must be filled out");
        errors += fieldLabel + " must be filled out\n";
    }
    return errors;
}

var fn = document.getElementById("fn");
var ln = document.getElementById("ln");

fn.addEventListener("input", function (event) {
    var val = event.target.value;
    var errors = validateRequiredField("First Name", val);
    if (errors !== "") {
        alert(errors);
    }
    else {
        // proceed
    }
});

ln.addEventListener("input", function (event) {
    var val = event.target.value;
    var errors = validateRequiredField("Last Name", val);
    if (errors !== "") {
        alert(errors);
    }
    else {
        // proceed
    }
});
<form name="myForm">
  <label>First Name: <input id="fn" /></label><br/><br/>
  <label>Last Name: <input id="ln"/></label>
</form>

关于Javascript 表单验证代码循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43721320/

相关文章:

javascript - 计算使用 API 观看的 YouTube 视频的百分比

javascript - 使用 jquery 从一列拖放到另一列

spring - 如何获取Hibernate Validator的ValidationException的插值消息

angular - angular2 中的条件验证

asp.net-mvc - 修正错误后,ValidationSummary 仍然可见吗?

Python循环遍历一组列表

python - 找到该幂函数的循环不变量

javascript - 使用 IE Javascript 泄漏检测器有困难

javascript - 将 if 语句与创建映射变量结合使用 (Javascript)

programming-languages - 编写尽可能长的循环