最佳答案
我有一个嵌套的可排序列表,可以动态添加或删除项目,并可以嵌套 n 级深。在嵌套时,一个新的 ul 元素被注入到选择作为父元素的 li 元素中。列表的初始状态如下:
<ul id="parent">
<li id="One"><a href="" class="listLink"><span class="position">1</span>One</a></li>
<li id="Two"><a href="" class="listLink"><span class="position">2</span>Two</a></li>
<li id="Three"><a href="" class="listLink"><span class="position">3</span>Three</a>
<ul>
<li id="A"><a href="" class="listLink"><span class="position">1</span>A</a></li>
<li id="B"><a href="" class="listLink"><span class="position">2</span>B</a></li>
<li id="C"><a href="" class="listLink"><span class="position">3</span>C</a></li>
<li id="D"><a href="" class="listLink"><span class="position">4</span>D</a></li>
<li id="E"><a href="" class="listLink"><span class="position">5</span>E</a></li>
<li id="F"><a href="" class="listLink"><span class="position">6</span>F</a></li>
</ul>
</li>
<li id="Four"><a href="" class="listLink"><span class="position">4</span>Four</a></li>
<li id="Five"><a href="" class="listLink"><span class="position">5</span>Five</a></li>
<li id="Six"><a href="" class="listLink"><span class="position">6</span>Six</a></li>
</ul>
我正在使用 MooTools 进行排序,等等,它工作得很好,但是我在排序时无法正确地重置位置文本。我尝试使用的每个 CSS 选择器也包含子元素的 所有,而不仅仅是属于列表的 li 元素,而不是属于子列表的任何元素。假设除了 id、 position 和 text 之外,所有列表中的每个 li 元素都与其他所有元素相同。是否有一个选择器只获得直接的孩子?还有别的办法吗?
我尝试了一些儿童选择器,就像上面提到的那些:
ul > li
将选择作为 ul 的子元素的 所有 li 元素,而不仅仅是直接子元素#parent > li
和上面一样。下面是当一个项被删除时我正在运行的函数,它不处理排序,它工作得很好,只是更新位置。请注意,它也是 MooTools 语法:
var drop = function(el){
el.getParents('ul').reverse().each(function(item){
var posCount = 1;
item.getElements('li a span[class=position]').each(function(pos){
pos.set('text', posCount);
posCount++;
});
});
}
目前,改变任何项目的顺序在主要水平将重新编号的一切1-12,甚至子清单。更改子列表上的任何项目都将为该列表提供正确的编号,但会导致父列表错误地计算编号中的所有子 Li 元素。
我觉得这是一个丑陋的黑客,但它的工作:
var drop = function(){
var ulCount = 1;
$$('ul').each(function(item){
if(item.get('id') != 'parent') {
item.set('id', 'id-'+ulCount);
}
var elId = item.get('id');
var posCount = 1;
$(document).getElements('#'+elId+'>li>a>span[class=position]').each(function(pos){
pos.set('text', posCount);
posCount++;
});
ulCount++;
});
}