0

我有一个非常简单的 LI 列表,它们都在同一级别(没有嵌套)我想找到类是 level1 的任何元素的前一个元素。出于某种原因,当 'level1' 元素超过一个同级元素时,prev() 在项目上失败。我不想使用 prevAll() 因为我只想要最接近我的元素之前的 li 并且具有 level1 类。

<ul id="main-list">
    <li class="level1" data-id="1" data-parent="none" id="recordsArray_1">Overview</li>
    <li class="level2" data-id="4" data-parent="Overview" id="recordsArray_4">Benefits</li>
    <li class="level2" data-id="2" data-parent="undefined" id="recordsArray_2">Core Concepts</li>
    <li class="level2" data-id="3" data-parent="undefined" id="recordsArray_3">Access</li>
    <li class="level3" data-id="5" data-parent="Access" id="recordsArray_5">Onboarding</li>
    <li class="level1" data-id="12" data-parent="none" id="recordsArray_12">test top</li>
    <li class="level2" data-id="10" data-parent="test top" id="recordsArray_10">test 1</li>
    <li class="level2" data-id="14" data-parent="undefined" id="recordsArray_14">New Access</li>
    <li class="level3" data-id="13" data-parent="New Access" id="recordsArray_13">test 2</li>
    <li class="level1" data-id="6" data-parent="none" id="recordsArray_6">Underview</li>
    <li class="level2" data-id="7" data-parent="Underview" id="recordsArray_7">coolpage1</li>
    <li class="level3" data-id="9" data-parent="coolpage1" id="recordsArray_9">page level 3</li>
</ul>

<script>
var publishList = $('#main-list li');

$.each(publishList, function () {
    var thisClass = $(this).attr('class');
    var parentID = $(this).attr('data-parent');
    var recordID = $(this).attr('data-id');

    if (thisClass == 'level2') {
        var thisParent = $(this).prev('.level1').html();
        console.log(this);    
    }
}); 
</script>

控制台输出:

Overview
undefined
undefined
test top
undefined
Underview

我究竟做错了什么?我预计 prev() 将返回核心概念、访问和新访问的概述,但它们返回未定义。我的逻辑有问题吗?

4

3 回答 3

4

尝试组合.prevAll().first()

var thisParent = $(this).prevAll('.level1').first().html();

这将确保无论距离多远,您总能获得最接近的兄弟姐妹。

试试这个代码

var publishList = $('#main-list li');

$.each(publishList, function () {
    var $this = $(this),
        thisClass = $this.attr('class'),
        parentID = $this.attr('data-parent'),
        recordID = $this.attr('data-id');

    if (thisClass == 'level2') {
        var thisParent = $this.prevAll('.level1').first().html();
        $('#output').append($this.prevAll('.level1').first().html()+'<br />');
    }

});

检查小提琴

于 2013-05-30T21:00:34.530 回答
1

.prev()不提供您想要的功能。您正在寻找的功能在.prevAll()

一旦你有一组值,.prevAll()你可以使用类似的东西.first()来获取你需要的东西(如前所述)或通过 id 识别最接近的元素(即.split()基于数字的 id 或一些类似的方法)。无论你决定如何去做,.prev()都不会得到你想要的。

于 2013-05-30T20:56:45.103 回答
0

只需用它更新您的 if 语句

    if (thisClass == 'level2' && $(this).prev('.level1').length) {
于 2013-05-30T20:55:28.820 回答