为什么我的函数不会返回true?

时间:2014-07-10 18:48:18

标签: javascript jquery

即使勾选了我在页面上的两个复选框,我似乎也无法使此函数返回true。我已经在这个工作了几个小时,现在已经没想完了。任何帮助将不胜感激。

if(myfunction() == true){
    alert('YAY!');
}

function myfunction(){
    if($("input[type=checkbox]").length > 0){
        $('.checkbox').each(function(){
            if($(this).prop('checked')){
                return true;
            }
            else{
                $(this).find(".CheckboxCheck").show();
                return false;
            }
        });
    }
    else{
        return true;
    }
}

2 个答案:

答案 0 :(得分:5)

您从传递给each的函数中返回true,而不是从myfunction返回true。除非您的网页上没有复选框,因此else块在myfunction中执行,myfunction正在返回undefined

你可以这样做:

if(myfunction() == true){
    alert('YAY!');
}

function myfunction(){
    var returnValue = true;

    if($("input[type=checkbox]").length > 0) {
        $('.checkbox').each(function(){
            if($(this).prop('checked')){
                returnValue = true;
                return false; // Stops the each loop.
            }
            else {
                $(this).find(".CheckboxCheck").show();
                returnValue = false;
                return false; // Stops the each loop.
            }
        });
    }

    return returnValue;
}

现在,我并不完全确定你要做什么,而且你几乎肯定需要调整上面的代码。我只是提供它来说明如何从传递给each的函数中获取值。例如,如果您要确定是否选中了所有复选框,那么您希望each函数看起来像这样:

var returnValue = true;

...

$('.checkbox').each(function() {
    if (!$(this).prop('checked')) {
        returnValue = false;
        return false;
    }
});

编辑:再次查看第二个代码段后,我意识到each循环是不必要的。如果您想确定是否选中了所有复选框,您只需要:

if ($('.checkbox:not(:checked)').length == 0) {
   // All .checkbox elements are checked.
}

现在,请记住,:not():checked选择器无法使用本机JS函数,因此速度较慢,但​​可能不够重要。我更喜欢简洁。

答案 1 :(得分:2)

each回调函数内部返回将不会从外部函数返回。该函数将返回undefined,因为您尚未为其指定任何返回值,并且该值不等于true

您可以在循环中设置结果的变量:

function myfunction(){
  var result = true;
  $('.checkbox').each(function(){
    if(!$(this).prop('checked')){
      result = false;
      $(this).find(".CheckboxCheck").show();
      return false; // exit the loop
    }
  });
  return result;
}