全局变量设置在JavaScript验证中失败

全局变量设置在JavaScript验证中失败,javascript,validation,global-variables,Javascript,Validation,Global Variables,在函数内部设置全局变量标志时出错 全局变量声明 var flag = false; 验证文本框的函数 //To validate Product Name field function Name() { var pName = document.getElementById('addPName').value; if (pName == "") { $('#productNameError').text('Prod

在函数内部设置全局变量标志时出错

全局变量声明

    var flag = false;
验证文本框的函数

    //To validate Product Name field
    function Name() {
        var pName = document.getElementById('addPName').value;
        if (pName == "") {
            $('#productNameError').text('Product Name is required');
            flag = false;
        }
        else {
            $('#productNameError').text('');
            flag = true;
        }
    }
用于验证数量的函数

     //To validate Product Quantity Field
     function Quantity() {
        var pQty = document.getElementById('addPQty').value;
        if (pQty != "") {

            var regex = /^[1-9]\d*(((,\d{3}){1})?(\.\d{0,2})?)$/;
            if (regex.test(pQty)) {
                $('#productQtyError').text('');
                flag = true;
            }
            else {
                $('#productQtyError').text('Enter Quantity of the Product');
                flag = false;
            }
        }
        else {
            $('#productQtyError').text('Quantity is required');
            flag = false;
        }
    }
//验证摘要

    function validate() {
        if (flag == true) {
            $('#validationSummary').text('');
            return true;
        }
        else {
            $('#validationSummary').text('Please fill out required fields.');
            return false; 
       }
    }

我在textbox的onfocusout事件上调用前两个函数,在单击按钮时调用validate()函数。我所面临的问题是:在Quantity()标志中没有设置为false。尽管字段仍然为空,但会插入记录。

如果在validate()中获得flag=true,则可能首先调用Quantity(),它将设置flag false,然后调用Name(),这将把flag设置为true,从而绕过validate()函数。

这不是正确的方法,您正在尝试实现验证。考虑场景,当用户在第一个字段中输入正确的值时,标记将被设置为true,因为第二个字段是空的,AMD表单将被提交并且保持真的反之亦然。 如果希望通过这种方式实现,请保留尽可能多的标志变量作为字段数,并在验证中检查所有这些变量

或者,使用“.each”迭代每个元素并对其进行验证,并继续向dom对象追加验证表


谢谢不要使用全局变量

如果你使用全局变量,你会有一段糟糕的时光,你可以使用暴露模块模式来封装一些混乱

我的建议如下:

var app = app || {};
app.product =  app.product || {};
app.product.validate = app.product.validate || {};

app.product.validate.isValid = false;

app.product.validate.name = function(){
    var pName = document.getElementById('addPName').value;

    if (pName == "") {
        $('#productNameError').text('Product Name is required');
        app.product.validation.flag = false;
    } else {
        $('#productNameError').text('');
        app.product.validation.flag = true;
    }
}


app.product.validate.quantity = function() {
    var pQty = document.getElementById('addPQty').value;

    if (pQty != "") {

        var regex = /^[1-9]\d*(((,\d{3}){1})?(\.\d{0,2})?)$/;

        if (regex.test(pQty)) {

            $('#productQtyError').text('');
            app.product.validate.flag = true;

        } else {
            $('#productQtyError').text('Enter Quantity of the Product');
            app.product.validate.flag = false;
        }
    } else {
        $('#productQtyError').text('Quantity is required');
        app.product.validate.flag = false;
    }
}
console.log是你的朋友

尝试将
控制台.log
放在其中一些方法中,我猜您的问题是调用的顺序与您期望的顺序不符,并将标志设置为您不期望的值


Can do console.log语句,如
console.log
如果打开开发人员控制台,应显示控制台的输出

“我收到一个错误”。。。。您是否报告了实际的错误?如果是这样,那是什么?可能是同步问题,你可以尝试使用承诺,看看这篇文章:虽然我非常喜欢承诺,但只有当你调用的函数是异步的,而这些函数不是异步的时,承诺才真正有用。