函数里面.each()只被调用一次

时间:2013-03-20 17:32:58

标签: jquery function loops each

我有这段代码:

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'。

可能导致此问题的原因是什么?

3 个答案:

答案 0 :(得分:1)

Logical AND(&&)如果可以转换为false,则返回isFormValid;否则返回validateParameter($(this))

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

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


引用链接文档:

  

<强>操作
  逻辑AND(&amp;&amp;)

     

<强>用法
  expr1&amp;&amp;表达式2

     

<强>描述
  如果可以转换为false,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,&amp;&amp;   如果两个操作数都为真,则返回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 :(得分:0)

因为您正在将isFormValid值重置为false(validateParameter中的“return false;”)

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

答案 2 :(得分:0)

您的validateParameter函数返回false。

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

在第一次传递之后,isFormValid变为false(第一次,它是真的&amp; validateParameter =&gt;这导致false并将其存储在isFormValid中)

第二遍

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

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

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

干杯! SUJ