我使用以下格式的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 ......答案 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;
}