3

我有这个代码:

function paramsFormValidate()
{
    isFormValid = true;
    var counter = 0;
    $('.par-item input[type="number"]').each(function() {
        isFormValid = isFormValid && validateParameter( $(this) );
        counter++;
    });
    console.log(counter);
    return isFormValid;
}

这是我必须构建的自定义验证。问题是,validateParameter()应该为每个输入元素调用该函数,但只调用一次。

我已经包含了一个counter用于调试目的的变量(甚至记录$(this)each循环中),但循环似乎很好。仍然validateParameter()只会为循环的第一个元素调用。

validateParameter()函数不涉及 ajax 调用,它只是一堆赋值和 if/else 语句。事实上,我什至尝试删除整个函数体并改用它:

function validateParameter()
{
    console.log('meh');
    return false;
}

但当然它只会记录一个“meh”。

什么可能导致这个问题?

4

3 回答 3

1

逻辑 AND(&&)isFormValid如果可以转换为假则返回否则返回validateParameter($(this))

第一次循环isFormValidtrue, 因此validateParameter($(this))被执行并返回结果。在这种情况下false,分配给isFormValid.

循环执行的任何连续时间isFormValid都是false,因此它被立即使用并且validateParameter($(this))不会再次执行。


从链接的文档中引用:

运算符
逻辑与 (&&)

使用
expr1 && expr2

说明
如果 expr1 可以转换为 false,则返回;否则,返回 expr2。因此,当与布尔值一起使用时,如果两个操作数都为真,则 && 返回真;否则,返回 false。

编辑

..validateParameter()应该为每个输入元素调用该函数

在这种情况下,您需要类似的东西:

function paramsFormValidate() {
    isFormValid = true;

    $('.par-item input[type="number"]').each(function () {
        // Validate each element...
        if(!validateParameter($(this)){
           // validation has failed on an element, indicate the form is invalid
           isFormValid = false;
        }

        // optionally, continue or exit if isformIsValid === false
    });

    return isFormValid;
}
于 2013-03-20T17:43:52.417 回答
0

因为您正在将 isFormValid 值重置为 false ( "return false;" in validateParameter)

isFormValid && validateParameter( $(this) ); validateParameter只有当 isFormValid 为真时才会执行。

于 2013-03-20T17:35:10.133 回答
0

您的 validateParameter 函数返回 false。

isFormValid = isFormValid && validateParameter( $(this) );

第一次通过后,isFormValid 变为 false(第一次为 true & validateParameter => 导致 false 并将其存储在 isFormValid 中)

在第二遍

isFormValid = isFormValid && validateParameter( $(this) );

不会调用 validateParameter,因为 isFormValid 已经为 false,并且评估不会评估 validateParameter。

那就是问题所在。从 validateParameter 返回 true,您将看到它以您期望的方式工作。

干杯! 苏杰

于 2013-03-20T17:38:47.430 回答