使用jQuery.each()时如何返回值?

38

如果我找到第一个空文本框,我想返回false并从函数中返回

function validate(){
 $('input[type=text]').each(function(){
   if($(this).val() == "")
     return false;
});
}

上面的代码对我不起作用:( 有人可以帮忙吗?

3个回答

63

你正在跳出内部循环,我建议你使用特定的 "无值" 检查选择器,而不是从 内部 循环中跳出。代码如下:

function validate(){
  if($('input[type=text][value=""]').length) return false;
}

或者,在循环内部设置结果,并从外部循环返回结果:

function validate() {
  var valid = true;
  $('input[type=text]').each(function(){
    if($(this).val() == "") //or a more complex check here
      return valid = false;
  });
  return valid;
}

@Nick Craver,这是一个非常古老的帖子,但我有一个问题。在each循环完成之前,该函数返回true是否存在任何风险? - YahyaE
1
绝对没有这样的风险,因为在.each()完成之前,它不会执行最后一条语句。@YahyaE - user6269864
第一个例子在需要先修剪值时无法工作。第二个例子可以工作,但它依赖于状态变量,这通常是可以接受的,但如果您想要进行纯函数式编程,则不被视为有效。 - mae

18

你可以像这样做:

function validate(){
    var rv = true;
    $('input[type=text]').each(function(){
        if($(this).val() == "") {
            rv = false;   // Set flag
            return false; // Stop iterating
        }
    });
    return rv;
}

假设您在查找时未找到该项,则返回“true”。您可能会发现这是不使用“each”语句的情况之一:
function validate(){
    var inputs = $('input[type=text]');
    var index;
    while (index = inputs.length - 1; index >= 0; --index) {
        if (inputs[index].value == "") { // Or $(inputs[index]).val() == "" if you prefer
            return false;
        }
    }
    // (Presumably return something here, though you weren't in your example)
}

0

我想在现有答案的基础上添加一些内容,以清楚说明$(selector).each的行为,以及为什么它不会尊重OP代码中的return false

$(selector).each内部的return关键字用于中断或继续循环。如果使用return false,相当于在for/while循环中使用break语句。返回非false值相当于在for循环中使用continue语句;它将立即跳到下一个迭代。来源

因为你返回了false,所以循环被中断,函数最终返回undefined。你的选择是在$.each之外使用一个变量,或者像@TJCrowder写的那样避免使用它。


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