【问题标题】:Create a Tree with dynamic level feature for it's nodes (movable nodes) by jQuery通过 jQuery 为其节点(可移动节点)创建具有动态级别功能的树
【发布时间】:2014-11-09 06:27:21
【问题描述】:

我想创建一个带有 UL 和 Li 标签并使用 jQuery 的树。

我可以通过箭头键和鼠标向左或向右更改每个节点的级别???

我需要可移动的节点!


类似这样的:

【问题讨论】:

    标签: javascript jquery html tree html-lists


    【解决方案1】:

    我用下面的代码Here创造了这个想法。任何人都可以免费使用或扩展它... ;)

    我知道它可以改进并制作更好的版本,但现在你可以使用它并享受它......

    它的特点:

    »» 支持键盘方向键移动节点(左右)

    »» 支持鼠标左右拖动节点

    »» 将每个节点的关卡数据保存在DOM中并显示在每个节点上

    感谢 @FabrícioMatté 的回答 here。我使用他的部分代码来创建我的 jQuery 类。


    我的代码结果:

    JS & jQuery

    /*Code by Ram >> http://stackoverflow.com/users/1474613/ram */
    
    (function ($) {
        $.Noder = function (oneOfNodes) {
            this.element = '';
            oneOfNodes=(oneOfNodes instanceof $) ? oneOfNodes : $(oneOfNodes)
            this.baseX=oneOfNodes.position().left;
            this.currentX=0;
        };
    
        $.Noder.prototype = {
            InitEvents: function () {
                //`this` references the created instance object inside an instace's method,
                //however `this` is set to reference a DOM element inside jQuery event handler functions' scope.
                //So we take advantage of JS's lexical scope and assign the `this` reference to
                //another variable that we can access inside the jQuery handlers
                var that = this;
                //I'm using `document` instead of `this` so it will catch arrow keys
                //on the whole document and not just when the element is focused.
                //Also, Firefox doesn't fire the keypress event for non-printable characters
                //so we use a keydown handler
                $(document).keydown(function (e) {
                    var key = e.which;
                    if (key == 39) {
                        that.moveRight();
                    } else if (key == 37) {
                        that.moveLeft();
                    }
                });},
            setElement: function(element){
                this.element = (element instanceof $) ? element : $(element);
                console.log(this.element);
                this.currentX=this.element.position().left;
                console.log('currentX: '+this.currentX);
                this.element.addClass('active');
            },
            moveRight: function () {
                console.log('bseX: '+this.baseX);
                console.log('currentX: '+this.currentX);
                var max=(25*2)+this.baseX;
                console.log('max: '+max);
                if(this.currentX<max)
                {
                    this.element.css("left", '+=' + 25);
                    this.currentX=this.element.position().left;
                    setElementLevel(this.element,this.currentX,this.baseX);
                    console.log('currentX: '+this.currentX);
                }
            },
            moveLeft: function () {
                if(this.currentX>this.baseX)
                {
                    this.element.css("left", '-=' + 25);
                    this.currentX=this.element.position().left;
                    setElementLevel(this.element,this.currentX,this.baseX);
                    console.log('currentX: '+this.currentX);
                }
            }
    
        };
        $.Noder.defaultOptions = {
            currentX: 0
        };
    
    }(jQuery));
    
    function setElementLevel(element,currentX,baseX){
        var level=0;
        if (currentX==baseX+25)
            level=1;
        else if(currentX==baseX+25+25)
            level=2;
        element.data('level', level);
        setLevelOnElement(element);
    }
    
    function getElementLevel(element){
        console.log(element.data('level'));
        return element.data('level');
    }
    
    function setLevelOnElement(element){  
        var level = 0;
        if(typeof getElementLevel(element) !=='undefined')
            level = getElementLevel(element);
        console.log('my level: '+level);
        var $levelElement=element.find( ".node-level" );
        if ($levelElement && $levelElement.length>0)
        {
            $levelElement=$($levelElement[0]); 
            console.log($levelElement);
            $levelElement.html(level);
        }
    }
    
    var noder = new $.Noder($("#myTree>.node")[0]);
    
    $("#myTree>.node").on('click',function(){
        $("#myTree>.node").each(function(){
            $(this).removeClass('active')
        });    
        console.log($(this)[0].id +' clicked')
    
        noder.setElement($(this)[0]);
    
    })
    noder.InitEvents();
    
    
    $(document).ready(function() {
        var $dragging = null;
        var $myTree=$('ul#myTree');
        var $oneOfNodes=null;
        var baseX=0;
        if($myTree.length>0)
        {
            console.log($myTree);
            $oneOfNodes=$($myTree.children()[0]);
            console.log($oneOfNodes);
            baseX=$oneOfNodes.position().left;
            console.log('baseX >> '+baseX);
            console.log($myTree);
            var x=0;
            $('ul#myTree').find('li').each(function(){
                x++;
                console.log(x);
                setLevelOnElement($(this));
            });
        }
    
        $(document.body).on("mousemove", function(e) {
            if ($dragging) {
                var currentX=$dragging.position().left;
                if(e.pageX>(baseX+25) && e.pageX<(baseX+(2*25)))
                {
                    $dragging.offset({left: (baseX+25)});
                    setElementLevel($dragging,currentX,baseX);
                }
                else if((e.pageX)>(baseX+(2*25)) )
                {
                    $dragging.offset({left: (baseX+(2*25))});
                    setElementLevel($dragging,currentX,baseX);
                }
                else if(e.pageX<(baseX+25) )
                {
                    $dragging.offset({left: (baseX)});
                    setElementLevel($dragging,currentX,baseX);
                }
            }
        });
    
        $(document.body).on("mousedown",  function (e) {
            var $myTree=$('ul#myTree');
            if($(e.target) && $myTree && $myTree.length>0)
            {
                var $li=$(e.target).parent();
                var $ul=$(e.target).parent().parent();
                if ( $ul.is($myTree) && $(e.target).hasClass("node-level") )
                {
                    $ul.find('li').each(function(){
                        $(this).removeClass('active');
                    });
                    $li.addClass('active');
                    $dragging = $($li);
                }
            }
        });
    
        $(document.body).on("mouseup", function (e) {
            $dragging = null;
        });
    });
    

    HTML

    <ul id="myTree">
        <li class="node" id="node1">
            <span class="node-level"></span>
            <span class="node-content">Node 1</span>
        </li>
        <li class="node" id="node2">
            <span class="node-level"></span>
            <span class="node-content">Node 2</span>
        </li>
        <li class="node" id="node3">
            <span class="node-level"></span>
            <span class="node-content">Node 3</span>
        </li>
        <li class="node" id="node4">
            <span class="node-level"></span>
            <span class="node-content">Node 4</span>
        </li>
        <li class="node" id="node5">
            <span class="node-level"></span>
            <span class="node-content">Node 5</span>
        </li>
        <li class="node" id="node6">
            <span class="node-level"></span>
            <span class="node-content">Node 6</span>
        </li>
        <li class="node" id="node7">
            <span class="node-level"></span>
            <span class="node-content">Node 7</span>
        </li>
    </ul>
    

    CSS

    #myTree{
        margin:20px;
        padding:0;
        list-style-type:none;
        font-size:11px;
    }
    #myTree>li>.node-level{
        padding:6px 10px;
        color:#ddd;
        background:gray;
        position:relative;
        cursor:move;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
        -khtml-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
    }
    #myTree>li>.node-content{
        padding:5px; 15px;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
        -khtml-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
        user-select: none;
    }
    #myTree>.node:hover {
        background:#acd;
        color:#004;
    }
    #myTree>.node.active {
        border:1px #a66 solid;
        background:#fd8;
        color:#004;
    }
    #myTree>li.node {
        width:151px;
        background:#ddd;
        margin-top:2px;
        padding:5px 0px 5px 0;
        color:#555;
        cursor:pointer;
        position:relative;
        border:1px solid #ccc;
    }
    html, body {
        height:100%;
    }
    div { width:151px;
        background:#ddd;
        margin-top:2px;
        padding:5px 15px;
        color:#555;
        cursor:pointer;
        position:relative;
        border:1px solid #ccc; }
    

    【讨论】:

      【解决方案2】:

      我也遇到过同样的问题。您可以通过

      获得节点的级别

      $("#treeDiv").tree("getSelectedNode").getLevel();

      您可以使用关卡进行操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多