使用自引用函数实现Jquery父子dom的交叉



基本上,我试图递归地向后读取dom树以生成路径。dom的读取从单击的项开始,向上到父项,收集属性值,并按照严格的命名约定向上执行,直到不再有父项为止。我很难弄清楚,但我觉得我在一条好的道路上。我想尽可能多地从概念上学习。感谢您的任何反馈。这里是JsFiddle

我希望点击的结果,然而许多层次深,导致生成的路径几乎像面包屑。问题是我似乎无法格式化字符串并以正确的顺序输出它。

期望输出:/books/1/chapters/1/pages/1

    <div class="list-group" data-type="books">
        <a href="#" class="book list-group-item" data-id="1">Book 1</a>
        <div class="list-group" data-type="chapters">
            <a href="#" class="chapter list-group-item" data-id="1">Chapter 1</a>
            <div class="list-group" data-type="pages">
                <a href="#" class="page list-group-item" data-id="1">Page 1</a>
                <a href="#" class="page list-group-item" data-id="2">Page 2</a>
                <a href="#" class="page list-group-item" data-id="3">Page 3</a>
            </div>
        </div>
    </div>
JQUERY

$(document).on('click','.list-group-item', function(e){
    e.stopPropagation();
    path = getDomData($(this)); // books/1/chapter/2/page/1
});
function getDomData(activeElement){
    var activeElementId = activeElement.data('id'); 
    var activeElementParent = activeElement.closest('.list-group');
    var activeElementParentType = activeElementParent.data('type');
    var activeElementParentParent = activeElementParent.parent('.list-group-item');
    result = activeElementParentType +'/'+ activeElementId +'/';
    if(activeElementParentParent.length > 0){
        getDomData(activeElementParentParent);
    }
    return result;
}

在jquery对象上使用.parents().each(function(){})遍历父级集合,该对象将沿着树向上走:

//use the dollar-sign at beginning if the argument name
//to hint that the fn is expecting a jquery object: 
function getDomData($activeElement){
    //start with the element that was clicked:
    var path = '/' + $activeElement.data('id');
    //then go over each ancester up the tree, check which
    //type it is, and append to the beginning of your path accordingly:
    $activeElement.parents().each(function(){
        if($(this).hasClass('list-group-item')){
            path = ('/' + $(this).data('id')) + path;
        }
        else if($(this).hasClass('list-group')){
            path = ('/' + $(this).data('type')) + path;
        }
    });
    return path;
};

小提琴:http://jsfiddle.net/mhfaust/4vHLP/1/

解决方案:

小提琴

$(document).on('click','.list-group-item', function(e){
    e.stopPropagation();
    path = getDomData($(this)); // books/1/chapter/2/page/1
    console.log(path);
});
function getDomData(activeElement){
    var activeElementId = activeElement.data('id'); 
    var activeElementParent = activeElement.closest('.list-group');
    var activeElementParentType = activeElementParent.data('type');
    var activeElementParentParent = activeElementParent.siblings('.list-group-item');
    var result = activeElementParentType +'/'+ activeElementId +'/';
    if(activeElementParentParent.length > 0){
        return getDomData(activeElementParentParent) + result;
    }
    return result;
}

变化:

  • 使用var声明的结果(因此,它的值不会在递归中被覆盖)
  • 返回if内部递归的结果(与当前结果连接)
  • activeElementParent.parent更改为activeElementParent.siblings
  • 更改ajaxPath返回result (ajaxPath未知)
  • 添加console.log(path);(查看控制台的结果)

最新更新