Jquery .each() - 返回值未定义

时间:2013-01-21 14:55:20

标签: javascript jquery

为什么getColorOptionSelect()返回未定义的值(我确定它有调试器的值)。

肯定是与范围相关的问题,对不起我的js无知

jQuery(document).ready(function () {

    colorSelectID = getColorOptionSelect();
    alert(colorSelectID);

    function getColorOptionSelect() {

        // get label
        var selId;
        jQuery(".product-options dl label").each(function () {
            el = jQuery(this);
            // lower case, remove *
            var labelText = el.text().toLowerCase().replace("*", "");
            if (labelText == 'color') {
                //return element
                selId = el.parent().next().find("select").attr('id');
                return selId;
            }
        });
        //    return null;
    }

});

3 个答案:

答案 0 :(得分:4)

getColorOptionSelect没有(未注明的)return声明。

您拥有的唯一return语句位于传递给each()的匿名函数中。它将被each()下面的代码使用(如果它是false,它将停止循环)。

这不是范围问题,只是存在多个功能。

你可能想:

  • 在致电each()
  • 之前定义变量
  • 在每个循环内为其分配一个值
  • getColorOptionSelect
  • 的末尾返回该变量

答案 1 :(得分:2)

你应该这样做:

function getColorOptionSelect() {

        // get label
        var selId;
        jQuery(".product-options dl label").each(function () {
            el = jQuery(this);
            // lower case, remove *
            var labelText = el.text().toLowerCase().replace("*", "");
            if (labelText == 'color') {
                //return element
                selId = el.parent().next().find("select").attr('id');
                return false; // to stop further execution of each
            }
        });
        return selId;
    }

在你的情况下,你正在从传递给每个的回调函数返回,它不会从getColorOptionSelect传递

你唯一可以从每个函数回调中返回一个值的方法是告诉jquery它是否应该转到下一个项目(return true;)或不是(return false;

答案 2 :(得分:2)

取消注释上一个return语句以返回值(类似selId

jQuery(document).ready(function () {

colorSelectID = getColorOptionSelect();
alert(colorSelectID);

function getColorOptionSelect() {

    // get label
    var selId;
    jQuery(".product-options dl label").each(function () {
        el = jQuery(this);
        // lower case, remove *
        var labelText = el.text().toLowerCase().replace("*", "");
        if (labelText == 'color') {
            //return element
            selId = el.parent().next().find("select").attr('id');
            return false;  //<---  return false to stop further propagation of each
        }
    });
      return selId; //<---  Must return something 
}

});