我有一个嵌套的可排序列表,它可以动态地添加或删除项目,并且可以嵌套到n层深.在嵌套时,新的ul元素被注入到 Select 作为父元素的任何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进行排序,等等,它工作得很好,但我在正确重置排序上的位置文本时遇到了问题.我try 使用的每个CSS Select 器还包括all个子元素,而不仅仅是属于列表的li元素,而不是属于子列表的元素.假设除了id、position和text之外,所有列表中的每个li元素都与所有其他元素相同.有没有只有直系子女的 Select 器?有没有其他方法可以做到这一点?

我try 了一些 children Select 器,比如上面提到的:

  • ul > li将 Select all个li元素,这些元素是ul的子级,而不仅仅是直接的子级.
  • #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++;
    });
}

推荐答案

ul > li

只有直系的子元素才知道.因此,例如,要仅执行您可以使用的顶级列表元素,请执行以下操作:

#parent > li

Note: IE6不支持此功能.

向后兼容性的常见解决方法是执行以下操作:

#parent li { /* style appropriately */ }
#parent li li { /* back to normal */ }

这更乏味,因为你必须应用样式,然后关闭它们(你可能不一定知道旧值是什么),但这是唯一一个IE6友好的纯CSS解决方案.

Edit:好的,您有一个特定于MooTools的问题.getElements()返回所有子代,而不仅仅是直系子代.试着用getChildren().

var drop = function(el){
    el.getParents('ul').reverse().each(function(item){
        var posCount = 1;
        item.getChildren("li").getElements("a span[class=position]").each(function(pos){
                pos.set('text', posCount);
                posCount++;
        });
    });
}

或者类似的.

Css相关问答推荐

无法瞄准元素

如何居中对齐容器父对象?

在主零部件悬停上对子零部件设置Angular 样式

如何在容器查询体中重新定义:Root的CSS自定义属性值?

.NET 8 预览版 6 中不使用新项目模板提供 Blazor CSS 文件

如何使用 Sass to CSS 创建 H1 到 H6 标题并减小字体大小

每当键盘在react native 中打开时,如何使用 KeyboardAvoidingView 删除图像?

Tailwind Box-shadow

你可以在 CSS 中扩展实体(entity)吗?

CSS如何防止键盘向上移动内容?

位置绝对混乱的 CSS Flexbox

firefox overflow-y 不能使用嵌套的 flexbox

属性nowrap被认为是过时的.建议使用较新的构造.它是什么?

纯 CSS 复选框图像替换

使用 Bootstrap 设置身体的最大宽度

CSS:将背景图像拉伸到屏幕的 100% 宽度和高度?

字体上的 Font-Awesome 错误 404

如何在浏览器的右下角放置一个div?

go 除文本输入的内阴影

如何使用 CSS 消除元素的偏移量?