1

getColorOptionSelect() が未定義の値を返す理由 ( debugger によって値があると確信しています)。

それは確かにスコープに関連する問題です、私の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;
    }

});
4

3 に答える 3

4

getColorOptionSelectreturn(コメントなしの)ステートメントはありません。

唯一の return ステートメントは、に渡す無名関数内にありますeach()。基礎となるコードによって消費されますeach()(それが の場合、ループを停止しますfalse)。

これは範囲の問題ではなく、複数の機能があるということです。

あなたはおそらくしたいでしょう:

  • 呼び出す前に変数を定義するeach()
  • each ループ内でそれに値を割り当てます
  • の最後にその変数を返しますgetColorOptionSelect
于 2013-01-21T14:57:00.820 に答える
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;を伝えることです。

于 2013-01-21T14:58:28.517 に答える
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 
}

});
于 2013-01-21T14:58:36.007 に答える