2013-03-13 102 views
1

我想从包含匿名函数的函数返回值。无法从函数返回值

function getSingleCheckedItemId() { 
    return $(".data-table-chk-item").each(function() { 
     if ($(this).is(":checked")) { 
      var value = $(this).attr("value"); 
      return value; 
     } 
    }); 
    } 

在这种情况下,它返回我所有的复选框的数组。如果我删除第一个return,它将不会返回值,但undefined

那么如何从getSingleCheckedItemId()返回值呢?

+1

尝试使用'filter',而不是'each'。或者,如果您确实需要获取价值,请使用“地图”。 – 2013-03-13 11:55:51

+0

@dystroy,也许。但我认为他可以通过自己点击这些功能的文档来了解更多。此外,我现在没有时间检查jQuery的impls ... – 2013-03-13 11:59:12

回答

5

.each总是返回包含您遍历所以所有元素的jQuery对象:

function getSingleCheckedItemId() { 
    var ret; 
    $(".data-table-chk-item").each(function() { 
     if ($(this).is(":checked")) { 
      ret = $(this).attr("value"); 
      return false; //breaks out of .each 
     } 
    }); 
    return ret; 
} 

此外,this.value通常是在你处理表单输入的情况下比$(this).attr('value')一个更好的选择 - 好像你有radio/checkbox由于他们的checked财产。另外,this.checked返回一个布尔值,因此不需要$(this).is(':checked')


我相信你的逻辑可以简化为:

function getSingleCheckedItemId() { 
    return $(".data-table-chk-item:checked").val(); 
} 

这样,如果没有元素被选择,这不相同匹配.val()将返回第一个:checked项目或undefined的价值作为上面的循环。

+0

你不必:'var ret = $(this).attr(“value”);'在该函数下......只是'ret = $(this).attr(“value”);':) – 2013-03-13 11:56:21

+1

@ ZlatanO。哦,该死的忽视了,谢谢! – 2013-03-13 11:56:48

2

你可以这样做:

function getSingelCheckedItemId() { 
    var elements = $(".data-table-chk-item:checked"); 
    return (elements.length > 0) ? $(elements[0]).val() : undefined; 
} 
1

我会做这样的

function getSingleCheckedItemId() { 
    var ret; 
    $(".data-table-chk-item").each(function() { 
     if ($(this).is(":checked")) { 
      ret = $(this).attr("value"); 
     } 
    }); 
    return ret; 
} 
+0

记住解释返回错误是什么“错误”? – 2013-03-13 12:03:22

+0

返回false是否突破getSingleCheckedItem并返回false而不是ret值? – HeremansY 2013-03-13 12:19:34

+0

不,'return false'不会影响'.each'的返回值,而且这个回答也不会使用'.each'的返回值。 '=]'它每一次都会爆发。 http://jsfiddle.net/ult_combo/4xqFG/1/ – 2013-03-13 12:29:10