在.each()函数内的函数仅被调用一次

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() 函数应该针对每个输入元素进行调用,但实际上只被调用了一次。
我为了调试目的包含了一个计数器变量(甚至在 each 循环内部记录了 $(this)),但循环似乎没问题。即使如此,validateParameter() 仍然只会针对循环中的第一个元素进行调用。 validateParameter() 函数不涉及 ajax 调用,它只是一堆赋值和 if/else 语句。事实上,我甚至尝试删除整个函数体并使用以下内容:
function validateParameter()
{
    console.log('meh');
    return false;
}

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

什么会导致这个问题?


你能创建一个 jsFiddle 吗? - j08691
1
@ValerioBulla:如果您想针对每个元素运行验证方法,但也想能够指示表格是否有任何验证失败,则需要略微更改循环以始终执行该方法,并仅在返回false时记录它。我已经在我的答案中添加了该实现示例。 - Nope
3个回答

1

逻辑与(&&)运算符会返回isFormValid,如果它可以转换为false,则返回validateParameter($(this))

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

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


引用来自链接文档:

运算符
逻辑与 (&&)

用法
expr1 && expr2

描述
如果可以将expr1转换为false,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,&& 如果两个操作数都为true,则返回true;否则,返回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;
}

1
谢谢,这是很棒的信息。我不知道如果第一个操作数为假它会停止评估。我已经更新了我的函数,现在它可以正常工作了。干杯! - Valerio Bulla

0

你的 validateParameter 函数返回了 false。

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

在第一次遍历后,isFormValid变为false(第一次时,它是true&validateParameter => 结果为false并将其存储在isFormValid中)
在第二次遍历中
isFormValid = isFormValid && validateParameter( $(this) );

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

这就是问题所在。从 validateParameter 返回 true,你会看到它按照你的期望工作。

祝好! Suj


0

因为您将isFormValid值重置为false(在validateParameter中使用"return false;")

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接