递归函数使用jquery每个变量值不更新

时间:2014-11-28 19:48:49

标签: javascript jquery recursion

我使用以下格式的HTML:

<div class="propBasic containerForReordering">
    <ul itemid="WZ_VS_Test_msgSection" class="sortable ui-sortable">
        <li itemid="WZ_VS_Test_Top" class="liSortable ui-sortable-handle">WZ_VS_Test_Top
            <ul itemid="WZ_VS_Test_Top" class="sortable ui-sortable">
                <li itemid="WZ_VS_Test_Top.First" class="liSortable ui-sortable-handle">WZ_VS_Test_Top.First
                    <ul itemid="WZ_VS_Test_Top.First" class="sortable ui-sortable">
                        <li itemid="WZ_VS_Test_Top.First.1" class="liSortable ui-sortable-handle">WZ_VS_Test_Top.First.1
                            <ul itemid="WZ_VS_Test_Top.First.1" class="sortable ui-sortable">
                                <li itemid="" class="liSortable ui-sortable-handle">{{Drop Here}}</li>
                            </ul>
                        </li>
                        <li itemid="WZ_VS_Test_Top.First.2" class="liSortable ui-sortable-handle">WZ_VS_Test_Top.First.2
                            <ul itemid="WZ_VS_Test_Top.First.2" class="sortable ui-sortable">
                                <li itemid="" class="liSortable ui-sortable-handle">{{Drop Here}}</li>
                            </ul>
                        </li>
                    </ul>
                </li>
                <li itemid="WZ_VS_Test_Top.Second" class="liSortable ui-sortable-handle">WZ_VS_Test_Top.Second
                    <ul itemid="WZ_VS_Test_Top.Second" class="sortable ui-sortable">
                        <li itemid="WZ_VS_Test_Top.Second.1" class="liSortable ui-sortable-handle">WZ_VS_Test_Top.Second.1
                            <ul itemid="WZ_VS_Test_Top.Second.1" class="sortable ui-sortable">
                                <li itemid="" class="liSortable ui-sortable-handle">{{Drop Here}}</li>
                            </ul>
                        </li>
                    </ul>
                </li>
                <li itemid="WZ_VS_Test_Top.Second.2" class="liSortable ui-sortable-handle">WZ_VS_Test_Top.Second.2
                    <ul itemid="WZ_VS_Test_Top.Second.2" class="sortable ui-sortable">
                        <li itemid="" class="liSortable ui-sortable-handle">{{Drop Here}}</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</div>

我正在运行一个javascript递归循环来获取|||分隔itemid的字符串--- parentid ---命令如下:

var getNewOrderForItemAndDescendents = function(selector) {
    var sNewOrder = "";
    var nOrder = 1;

    $(selector).find('>ul.sortable').each(function(index, obj) {           
        sNewOrder += "|||" + $(this).attr('itemid') + "---" + ($(this).parents('ul.sortable:first').length > 0 ? $(this).parents('ul.sortable:first').attr('itemid') : 'NULL')
                + "---" + nOrder++;

        $(this).find('> li').each(function() {
            sNewOrder += getNewOrderForItemAndDescendents($(this));
        });
    });

    return sNewOrder;
}

并称之为

var result = getNewOrderForItemAndDescendents($('.containerForReordering'));

ERRPR 它的返回结果如下(在每个分隔符|||之前注意最后一个数字1):

|||WZ_VS_Test_msgSection---NULL---1|||
    WZ_VS_Test_Top---WZ_VS_Test_msgSection---1|||
        WZ_VS_Test_Top.First---WZ_VS_Test_Top---1|||
            WZ_VS_Test_Top.First.1---WZ_VS_Test_Top.First---1|||
            WZ_VS_Test_Top.First.2---WZ_VS_Test_Top.First---1|||
        WZ_VS_Test_Top.Second---WZ_VS_Test_Top---1|||
            WZ_VS_Test_Top.Second.1---WZ_VS_Test_Top.Second---1|||
            WZ_VS_Test_Top.Second.2---WZ_VS_Test_Top---1

所以基本上它会尊重函数的本地副本sNewOrder(在递归上下文中),但是nOrder变量不会从每个循环的jquery递增而且它总是保持为1。

我做错了什么?

PS:我尝试使用each()的索引,即使在第二个元素上也总是为零!确实非常奇怪。

PS2:JS中有一个小的改动,现在不再为函数调用提供顺序,它在任何方面都是多余的。在每个级别的数字应该从1开始,但对于兄弟姐妹,它将是2,3,4 ......

1 个答案:

答案 0 :(得分:0)

没关系,我想出了这个问题。我的HTML结构是这样的,每个项目UL都在单独的LI内部,所以从来没有任何兄弟UL,因此每个项目都不会运行两次

更新的代码:

var getNewOrderForItemAndDescendents = function(selector) {
    var sNewOrder = "";
    var nOrder = 1;

    $(selector).find('>li').each(function(index, obj) {
        if ($(this).attr('itemid')) {
            sNewOrder += "|||" + $(this).attr('itemid') + "---" + ($(this).parents('li:first').length > 0 ? $(this).parents('li:first').attr('itemid') : $(this).parents('ul:first').attr('itemid'))
                + "---" + nOrder;

            nOrder = nOrder + 1;

            $(this).find('> ul').each(function() {
                sNewOrder += getNewOrderForItemAndDescendents($(this));
            });
        }
    });

    return sNewOrder;
}