SimpleTree源码中的展开节点方法,不知道怎么展开到指定的节点,请前段大神指教 2C

我现在要做的是在刷新组织树时,展开到指定的节点,我传了一个pnode(组织树中

的ID),但是不知道展开节点的方法是哪个,不知道在哪里做判断停止展开节点。下面是SimpleTree的js代码。

1个回答

下面是SimpleTree 的JS代码
/*

  • jQuery SimpleTree Drag&Drop plugin
  • Update on 22th May 2008
  • Version 0.3 *
  • Licensed under BSD http://en.wikipedia.org/wiki/BSD_License
  • Copyright (c) 2008, Peter Panov panov@elcat.kg, IKEEN Group http://www.ikeen.com
  • All rights reserved. *
  • Redistribution and use in source and binary forms, with or without
  • modification, are permitted provided that the following conditions are met:
  • * Redistributions of source code must retain the above copyright
  • notice, this list of conditions and the following disclaimer.
  • * Redistributions in binary form must reproduce the above copyright
  • notice, this list of conditions and the following disclaimer in the
  • documentation and/or other materials provided with the distribution.
  • * Neither the name of the Peter Panov, IKEEN Group nor the
  • names of its contributors may be used to endorse or promote products
  • derived from this software without specific prior written permission. *
  • THIS SOFTWARE IS PROVIDED BY Peter Panov, IKEEN Group ``AS IS'' AND ANY
  • EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  • WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  • DISCLAIMED. IN NO EVENT SHALL Peter Panov, IKEEN Group BE LIABLE FOR ANY
  • DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  • (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  • LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  • ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  • (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  • SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */

$.fn.simpleTrees = function(opt){
return this.each(function(){
var TREE = this;
var ROOT = $('.root',this);
var mousePressed = false;
var mouseMoved = false;
var dragMoveType = false;
var dragNode_destination = false;
var dragNode_source = false;
var dragDropTimer = false;
var ajaxCache = Array();

    var beforeAjax = false;
    var nodeCheckBox = false;
    var checkBoxClick = false;
    var return_state = false;

    TREE.option = {
        drag:       false,
        animate:    false,
        autoclose:  false,
        speed:      'fast',
        afterAjax:  false,
        afterMove:  false,
        afterClick: false,
        afterDblClick:  false,
        afterContextMenu:   false,
        docToFolderConvert:false,
        beforeAjax : false, //beforeAjax : 展开AJAX之前事件

        /**
         * 复选框属性及状态标志
         * 默认属性,支持重新定义
         * by zhengchao 2010-04-05
         * 例: <span ck='a'>表示全选</span>
         */
        nodeCheckBox : false,
        ckFlag : 'ck',          //标签中的元素
        allCheckFlag  : 'a',    //全选
        halfCheckFlag : 'h',    //半选
        noCheckFlag   : 'n',    //没选
        checkBoxClick : false,   //多选框事件
        hasIcon: true,      //是否显示节点图标
        pnode : ''
    };

    TREE.option = $.extend(TREE.option,opt);
    $.extend(this, {getSelected: function(){
        return $('span.active', this).parent();
    }});
    TREE.closeNearby = function(obj)
    {
        $(obj).siblings().filter('.folder-open, .folder-open-last, .folder-noicon-open').each(function(){
            var childUl = $('>ul',this);
            var className = this.className;
            this.className = className.replace('open','close');
            if(TREE.option.animate)
            {
                childUl.animate({height:"toggle"},TREE.option.speed);
            }else{
                childUl.hide();
            }
        });
    };
    TREE.nodeToggle = function(obj)
    {
        var childUl = $('>ul',obj);
        if(childUl.is(':visible')){
            obj.className = obj.className.replace('open','close');

            if(TREE.option.animate)
            {
                childUl.animate({height:"toggle"},TREE.option.speed);
            }else{
                childUl.hide();
            }
        }else{
            obj.className = obj.className.replace('close','open');
            if(TREE.option.animate)
            {
                childUl.animate({height:"toggle"},TREE.option.speed, function(){
                    if(TREE.option.autoclose)TREE.closeNearby(obj);
                    if(childUl.is('.ajax'))TREE.setAjaxNodes(childUl, obj.id);
                });
            }else{
                childUl.show();
                if(TREE.option.autoclose)TREE.closeNearby(obj);
                if(childUl.is('.ajax'))TREE.setAjaxNodes(childUl, obj.id);
            }
        }
    };
    TREE.setAjaxNodes = function(node, parentId, callback)
    {
        if($.inArray(parentId,ajaxCache) == -1){
            ajaxCache[ajaxCache.length]=parentId;
            var url = $.trim($('>li', node).text());
            if(url && url.indexOf('url:'))
            {
                url=$.trim(url.replace(/.*\{url:(.*)\}/i ,'$1'));
                $.ajax({
                    type: "POST",
                    url: url,
                    contentType:'html',
                    cache:false,
                    success: function(responce){
                        //AJAX节点展开前动作
                        if (typeof TREE.option.beforeAjax == 'function'){
                            TREE.option.beforeAjax(node);
                        }
                        node.removeAttr('class');
                        node.html(responce);
                        $.extend(node,{url:url});
                        TREE.setTreeNodes(node, false); //true or false
                        if(typeof TREE.option.afterAjax == 'function')
                        {
                            TREE.option.afterAjax(node);
                        }
                        if(typeof callback == 'function')
                        {
                            if(return_state ==false){

                                callback(node);
                            }
                        }
                    }
                });
            }

        }
    };
    TREE.setTreeNodes = function(obj, useParent){
        obj = useParent? obj.parent():obj;
        var nodes_ = [];
        nodes_ = $('li>span', obj);

        nodes_.addClass('text');
        nodes_.bind('selectstart', function(){return false;});
        nodes_.click(function(){
            $('.active',TREE).attr('class','text');
            if(this.className=='text')
            {
                this.className='active';
            }
            if(typeof TREE.option.afterClick == 'function')
            {
                TREE.option.afterClick($(this).parent());
            }
            return false;
        });
        nodes_.dblclick(function(){
            mousePressed = false;
            TREE.nodeToggle($(this).parent().get(0));
            if(typeof TREE.option.afterDblClick == 'function')
            {
                TREE.option.afterDblClick($(this).parent());
            }
            return false;
        });
        nodes_.bind("contextmenu",function(){
            $('.active',TREE).attr('class','text');
            if(this.className=='text')
            {
                this.className='active';
            }
            if(typeof TREE.option.afterContextMenu == 'function')
            {
                TREE.option.afterContextMenu($(this).parent());
            }
            return false;
        });
        nodes_.mousedown(function(event){
            mousePressed = true;
            cloneNode = $(this).parent().clone();
            var LI = $(this).parent();
            if(TREE.option.drag)
            {
                $('>ul', cloneNode).hide();
                $('body').append('<div id="drag_container"><ul></ul></div>');
                $('#drag_container').hide().css({opacity:'0.8'});
                $('#drag_container >ul').append(cloneNode);
                $("<img>").attr({id : "tree_plus",src   : "../images/plus.gif"}).css({width: "7px",display: "block",position: "absolute",left   : "5px",top: "5px", display:'none'}).appendTo("body");
                $(document).bind("mousemove", {LI:LI}, TREE.dragStart).bind("mouseup",TREE.dragEnd);
            }
            return false;
        });
        nodes_.mouseup(function(){
            if(mousePressed && mouseMoved && dragNode_source)
            {
                TREE.moveNodeToFolder($(this).parent());
            }
            TREE.eventDestroy();
        });
        /**
         * 生长出多选框
         * @author zhengchao
         */
        if(TREE.option.nodeCheckBox){
            var parentChecked_ = 0 ; // 全选框默认 undefined状态
            var parentIndeterminate_ = 0; //半选框默认 undefined状态

            if($("input:first",obj.parent()).prop("checked")){
                parentChecked_ = 2; //全选
            }else {
                parentChecked_ = 1; //没选
            }

            if($("input:first",obj.parent()).attr("indeter")=='true' || $("input:first",obj.parent()).attr("indeter")==true){
                parentIndeterminate_ = 2; //半选
            }else {
                parentIndeterminate_ = 1; //没选
            }

            nodes_.each(function (){//alert($(this).attr("checked"));
                //纯净标签

                if(this.getAttribute('checked') == '1'){//2011-6-14 luke
                    // console.log('checked');
                    var nodeHtml = "<input type='image' src='../images/tree/iconCheckAll.gif' checked indeter='false' name='tree_chk' class='tree_chk' id='tree_chk' value='"+$(this).attr("value")+"'/>";//"<input type='checkbox' name='tree_chk' onclick='event.cancelBubble=true;' />";
                }else{
                    // console.log('unchecked');
                    var nodeHtml = "<input type='image' src='../images/tree/iconUnCheckAll.gif' indeter='false' name='tree_chk' class='tree_chk' id='tree_chk' value='"+$(this).attr("value")+"'/>";//"<input type='checkbox' name='tree_chk' onclick='event.cancelBubble=true;' />";
                }
                nodeHtml += $(this).html();
                $(this).html(nodeHtml);
                var input_ = $("input[type=image]",$(this)).eq(0);
                //如果父节点全选,则将所有下级子节点全选
                if(parentChecked_ == 2)$(this).attr(TREE.option.ckFlag,TREE.option.allCheckFlag);
                if(parentChecked_ == 1 && parentIndeterminate_ == 1)$(this).attr(TREE.option.ckFlag,TREE.option.noCheckFlag);

                if(this.getAttribute('checked') == '1'){//2011-6-14 luke
                    TREE.checkBoxStatus(input_,false,true);
                }else{
                    TREE.checkBoxStatus(input_,false,false);
                }
                //状态构造
        /**     if($(this).attr(TREE.option.ckFlag) == undefined || //没有设置标志,默认认为没选
                    $(this).attr(TREE.option.ckFlag) == TREE.option.noCheckFlag){//没选
                    $(this).attr(TREE.option.ckFlag,TREE.option.noCheckFlag);//修正 undefined 设置
                    TREE.checkBoxStatus(input_,false,false);
                }else if($(this).attr(TREE.option.ckFlag) == TREE.option.halfCheckFlag){//半选
                    TREE.checkBoxStatus(input_,true,false);
                }else if($(this).attr(TREE.option.ckFlag) == TREE.option.allCheckFlag){//全选
                    TREE.checkBoxStatus(input_,false,true);
                }**/
                if(typeof TREE.option.checkBoxClick == 'function'){//如果事件被重写,则利用重写的事件规则
                    TREE.option.checkBoxClick(input_);
                }else{// 否则为复选框绑定默认事件规则
                    input_.click(function (e){TREE.checkBoxClickDefault(input_);});
                }
                TREE.changeParentNodes(input_);//2011-6-14 luke
            });
        }

        //针对li进行操作
        var li_ = [];
        li_ = $('li', obj);
        li_.each(function(i){
            var nodeId = "";
            if(this.attributes[0] != undefined){
                 nodeId= this.attributes[0].value;
            }
            var className = this.className;
            var open = false;
            var cloneNode = false;
            var LI = this;
            var childNode = $('>ul',this); //当前li的子集
            if(childNode.size()>0){//如果存在子集
                var setClassName = 'folder-';
                if(className && className.indexOf('open')>=0){ //判断子集状态
                        setClassName=setClassName+'open';
                        open = true;
                }else{
                        setClassName=setClassName+'close';
                }
                //判断是否是末节点,给予 -last样式
                if(TREE.option.hasIcon==true){
                    this.className = setClassName + ($(this).is(':last-child')? '-last':'');
                }else{
                    this.className = "folder-noicon-close";
                }
                //子集未打开或者为AJAX节点,隐藏子集
                if(!open || className.indexOf('ajax')>=0)childNode.hide();

                TREE.setTrigger(this);
            }else{
                TREE.setTrigger(this);
                var setClassName = 'doc';
                this.className = setClassName + ($(this).is(':last-child')? '-last':'');
            }
            if(nodeId == TREE.option.pnode){
                return_state= true;
            }
        });
        li_.before('<li class="line">&nbsp;</li>');
        li_.filter(':last-child').after('<li class="line-last"></li>');

        TREE.setEventLine($('.line, .line-last', obj));
    };

    // 复选框状态控制 by zhengchao
    TREE.checkBoxStatus = function(inputCheck,indeterminate,checked){
        //判断类型,这里必须是BOOLEAN类型
        if(typeof(indeterminate)=="boolean" && typeof(checked)=="boolean"){
    $(inputCheck).prop("checked",checked);
            $(inputCheck).attr("indeter",checked.toString());
            if(checked==true){
                $(inputCheck).attr("src","../images/tree/iconCheckAll.gif");
            //  $(inputCheck).attr("checked","2");
            }else{
                if(indeterminate==true){
                    $(inputCheck).attr("src","../images/tree/iconCheckGray.gif");
            //      $(inputCheck).attr("checked","1");
                }else{
                    $(inputCheck).attr("src","../images/tree/iconUnCheckAll.gif");
            //      $(inputCheck).attr("checked","0");
                }
            }

        }else{
            //alert("出现参数类型异常jquery.simple.tree.js");
        }
    };

    // 复选框默认事件 by zhengchao
    TREE.checkBoxClickDefault = function(input){//alert($(input).attr("checked"));
        if(!$(input).prop("checked")){//如果选中
            $("input[type=image]",$(input).parent().parent()).each(function (index){
                TREE.checkBoxStatus(this,false,true);
            });
        }else{//没选中
            $("input[type=image]",$(input).parent().parent()).each(function (index){
                TREE.checkBoxStatus(this,false,false);
            });
        }
        TREE.changeParentNodes($(input));
    };

    /**
     * 改变父节点状态(递归)
     * @param {} node
     * by zhengchao
     */
    TREE.changeParentNodes = function(input){
        var input_ = $(input).parent().parent().parent().parent();
        //根据根节点没有复选框的要求,来跳出当前递归
        //alert($("span:first",$(input_)).eq(0).html().indexOf("input"));
        //if($("span:first",$(input_)).eq(0).html().indexOf("INPUT")== -1) return ;
        if($("span:first",$(input_)).eq(0).html().indexOf("input")== -1 && $("span:first",$(input_)).eq(0).html().indexOf("INPUT")== -1) return ;
        var parentInput = $("input:first",$(input_)).eq(0);//找到父节点的选择框
        var callbackValue = TREE.decideBrotherChecked(input) ; //搜捕同级兄弟节点状态
        //父节点状态
        //alert(parentInput+"==="+callbackValue);
        if(callbackValue==2){
            TREE.checkBoxStatus(parentInput,false,true);
        }else if(callbackValue==1){
            TREE.checkBoxStatus(parentInput,true,false);
        }else if(callbackValue==0){
            TREE.checkBoxStatus(parentInput,false,false);
        }
        TREE.changeParentNodes($(parentInput));
    };

    /**
     * 判断同级节点状态
     * return :
     *      全选上了: 2
     *      半选上了: 1
     *      都没选上: 0
     * @author zhengchao
     */
    TREE.decideBrotherChecked = function (input){
        var nowThis = $(input).parent().parent().parent();
        var flagInteger = 0 ; //返回值变量
        var temp_ = 0; //临时变量
        var countBrother = $("input[type=image]" ,nowThis).size();//同级兄弟节点数
        $("input[type=image]" ,nowThis).each(function (index){
            if(this.checked) temp_++;//选中
            if(this.indeter){//发现半选,直接判定结果,并跳出循环
                flagInteger = 1;
                return false ;
            }
        });
        if(flagInteger != 1){
            if(temp_ == 0) return 0;
            if(temp_ != countBrother) return 1;
            if(temp_ == countBrother) return 2;
        }
        return flagInteger;
    }


    TREE.setTrigger = function(node){
        $('>span',node).before('<img class="trigger" src="../images/spacer.gif" border=0 />');
        var trigger = $('>.trigger', node);
        TREE.nodeToggle(node);
        trigger.click(function(event){
            TREE.nodeToggle(node);
        });
        if(!$.browser.msie)
        {
            trigger.css('float','left');
        }
    };
    TREE.dragStart = function(event){
        var LI = $(event.data.LI);
        if(mousePressed)
        {
            mouseMoved = true;
            if(dragDropTimer) clearTimeout(dragDropTimer);
            if($('#drag_container:not(:visible)')){
                $('#drag_container').show();
                LI.prev('.line').hide();
                dragNode_source = LI;
            }
            $('#drag_container').css({position:'absolute', "left" : (event.pageX + 5), "top": (event.pageY + 15) });
            if(LI.is(':visible'))LI.hide();
            var temp_move = false;
            if(event.target.tagName.toLowerCase()=='span' && $.inArray(event.target.className, Array('text','active','trigger'))!= -1)
            {
                var parent = event.target.parentNode;
                var offs = $(parent).offset({scroll:false});
                var screenScroll = {x : (offs.left - 3),y : event.pageY - offs.top};
                var isrc = $("#tree_plus").attr('src');
                var ajaxChildSize = $('>ul.ajax',parent).size();
                var ajaxChild = $('>ul.ajax',parent);
                screenScroll.x += 19;
                screenScroll.y = event.pageY - screenScroll.y + 5;

                if(parent.className.indexOf('folder-close')>=0 && ajaxChildSize==0)
                {
                    if(isrc.indexOf('minus')!=-1)$("#tree_plus").attr('src','../images/plus.gif');
                    $("#tree_plus").css({"left": screenScroll.x, "top": screenScroll.y}).show();
                    dragDropTimer = setTimeout(function(){
                        parent.className = parent.className.replace('close','open');
                        $('>ul',parent).show();
                    }, 700);
                }else if(parent.className.indexOf('folder')>=0 && ajaxChildSize==0){
                    if(isrc.indexOf('minus')!=-1)$("#tree_plus").attr('src','../images/plus.gif');
                    $("#tree_plus").css({"left": screenScroll.x, "top": screenScroll.y}).show();
                }else if(parent.className.indexOf('folder-close')>=0 && ajaxChildSize>0)
                {
                    mouseMoved = false;
                    $("#tree_plus").attr('src','../images/minus.gif');
                    $("#tree_plus").css({"left": screenScroll.x, "top": screenScroll.y}).show();

                    $('>ul',parent).show();
                    /*
                        Thanks for the idea of Erik Dohmen
                    */
                    TREE.setAjaxNodes(ajaxChild,parent.id, function(){
                        parent.className = parent.className.replace('close','open');
                        mouseMoved = true;
                        $("#tree_plus").attr('src','../images/plus.gif');
                        $("#tree_plus").css({"left": screenScroll.x, "top": screenScroll.y}).show();
                    });

                }else{
                    if(TREE.option.docToFolderConvert)
                    {
                        $("#tree_plus").css({"left": screenScroll.x, "top": screenScroll.y}).show();
                    }else{
                        $("#tree_plus").hide();
                    }
                }
            }else{
                $("#tree_plus").hide();
            }
            return false;
        }
        return true;
    };
    TREE.dragEnd = function(){
        if(dragDropTimer) clearTimeout(dragDropTimer);
        TREE.eventDestroy();
    };
    TREE.setEventLine = function(obj){
        obj.mouseover(function(){
            if(this.className.indexOf('over')<0 && mousePressed && mouseMoved)
            {
                this.className = this.className.replace('line','line-over');
            }
        }).mouseout(function(){
            if(this.className.indexOf('over')>=0)
            {
                this.className = this.className.replace('-over','');
            }
        }).mouseup(function(){
            if(mousePressed && dragNode_source && mouseMoved)
            {
                dragNode_destination = $(this).parents('li:first');
                TREE.moveNodeToLine(this);
                TREE.eventDestroy();
            }
        });
    };
    TREE.checkNodeIsLast = function(node)
    {
        if(node.className.indexOf('last')>=0)
        {
            var prev_source = dragNode_source.prev().prev();
            if(prev_source.size()>0)
            {
                prev_source[0].className+='-last';
            }
            node.className = node.className.replace('-last','');
        }
    };
    TREE.checkLineIsLast = function(line)
    {
        if(line.className.indexOf('last')>=0)
        {
            var prev = $(line).prev();
            if(prev.size()>0)
            {
                prev[0].className = prev[0].className.replace('-last','');
            }
            dragNode_source[0].className+='-last';
        }
    };
    TREE.eventDestroy = function()
    {
        // added by Erik Dohmen (2BinBusiness.nl), the unbind mousemove TREE.dragStart action
        // like this other mousemove actions binded through other actions ain't removed (use it myself
        // to determine location for context menu)
        $(document).unbind('mousemove',TREE.dragStart).unbind('mouseup').unbind('mousedown');
        $('#drag_container, #tree_plus').remove();
        if(dragNode_source)
        {
            $(dragNode_source).show().prev('.line').show();
        }
        dragNode_destination = dragNode_source = mousePressed = mouseMoved = false;
        //ajaxCache = Array();
    };
    TREE.convertToFolder = function(node){
        node[0].className = node[0].className.replace('doc','folder-open');
        node.append('<ul><li class="line-last"></li></ul>');
        TREE.setTrigger(node[0]);
        TREE.setEventLine($('.line, .line-last', node));
    };
    TREE.convertToDoc = function(node){
        $('>ul', node).remove();
        $('img', node).remove();
        node[0].className = node[0].className.replace(/folder-(open|close)/gi , 'doc');
    };
    TREE.moveNodeToFolder = function(node)
    {
        if(!TREE.option.docToFolderConvert && node[0].className.indexOf('doc')!=-1)
        {
            return true;
        }else if(TREE.option.docToFolderConvert && node[0].className.indexOf('doc')!=-1){
            TREE.convertToFolder(node);
        }
        TREE.checkNodeIsLast(dragNode_source[0]);
        var lastLine = $('>ul >.line-last', node);
        if(lastLine.size()>0)
        {
            TREE.moveNodeToLine(lastLine[0]);
        }
    };
    TREE.moveNodeToLine = function(node){
        TREE.checkNodeIsLast(dragNode_source[0]);
        TREE.checkLineIsLast(node);
        var parent = $(dragNode_source).parents('li:first');
        var line = $(dragNode_source).prev('.line');
        $(node).before(dragNode_source);
        $(dragNode_source).before(line);
        node.className = node.className.replace('-over','');
        var nodeSize = $('>ul >li', parent).not('.line, .line-last').filter(':visible').size();
        if(TREE.option.docToFolderConvert && nodeSize==0)
        {
            TREE.convertToDoc(parent);
        }else if(nodeSize==0)
        {
            parent[0].className=parent[0].className.replace('open','close');
            $('>ul',parent).hide();
        }

        // added by Erik Dohmen (2BinBusiness.nl) select node
        if($('span:first',dragNode_source).attr('class')=='text')
        {
            $('.active',TREE).attr('class','text');
            $('span:first',dragNode_source).attr('class','active');
        }

        if(typeof(TREE.option.afterMove) == 'function')
        {
            var pos = $(dragNode_source).prevAll(':not(.line)').size();
            TREE.option.afterMove($(node).parents('li:first'), $(dragNode_source), pos);
        }
    };

    TREE.addNode = function(id, text, callback)
    {
        var temp_node = $('<li><ul><li id="'+id+'"><span>'+text+'</span></li></ul></li>');
        TREE.setTreeNodes(temp_node);
        dragNode_destination = TREE.getSelected();
        dragNode_source = $('.doc-last',temp_node);
        TREE.moveNodeToFolder(dragNode_destination);
        temp_node.remove();
        if(typeof(callback) == 'function')
        {
            callback(dragNode_destination, dragNode_source);
        }
    };
    TREE.delNode = function(callback)
    {
        dragNode_source = TREE.getSelected();
        TREE.checkNodeIsLast(dragNode_source[0]);
        dragNode_source.prev().remove();
        dragNode_source.remove();
        if(typeof(callback) == 'function')
        {
            callback(dragNode_destination);
        }
    };

    TREE.init = function(obj)
    {
        TREE.setTreeNodes(obj, false);
    };
    TREE.init(ROOT);
});

};
function do_tree_check(e){
event.cancelBubble=true;
//alert(e.checked);
if(e.checked){
e.checked=false;
e.src="../images/tree/iconUnCheckAll.gif";
}else{
if(e.indeter){
e.checked=true;
e.src="../images/tree/iconCheckAll.gif";
}else{
e.checked=true;
e.src="../images/tree/iconCheckAll.gif";
}
}
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
动态规划入门到熟悉,看不懂来打我啊
持续更新。。。。。。 2.1斐波那契系列问题 2.2矩阵系列问题 2.3跳跃系列问题 3.1 01背包 3.2 完全背包 3.3多重背包 3.4 一些变形选讲 2.1斐波那契系列问题 在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n&gt;=2,n∈N*)根据定义,前十项为1, 1, 2, 3...
程序员,职场上请远离这种人!
对有些职场人来讲,甩锅就是一种生存手段。01.从大学打篮球说起上大学的时候喜欢打篮球,然后我又特别喜欢抢篮板,经常是跳起来的时候没事,落下来的时候偶尔会踩到别人的脚上,于...
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
一个读研让我损失了一百万的真实故事
关注我!只要10分钟,包你学会数据分析 毕业后,应该就业还是考研? 我刚出国留学那会儿,就惊讶的发现,外国local95%都不会选择读研 他们说,硕士学费很贵,时间宝贵,老板不认,所以很费 当几乎所有人都是本科学历时,硕士学历反而像个异类 在老板眼里,三年硕士远远不如3年的工作经验实用 他们甚至专门为拒绝高学历者发明了一个词,叫overoccupie...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
shell脚本:备份数据库、代码上线
备份MySQL数据库 场景: 一台MySQL服务器,跑着5个数据库,在没有做主从的情况下,需要对这5个库进行备份 需求: 1)每天备份一次,需要备份所有的库 2)把备份数据存放到/data/backup/下 3)备份文件名称格式示例:dbname-2019-11-23.sql 4)需要对1天以前的所有sql文件压缩,格式为gzip 5)本地数据保留1周 6)需要把备份的数据同步到远程备份中心,假如...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
如何安装 IntelliJ IDEA 最新版本——详细教程
IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手、代码自动提示、代码重构、代码版本管理(Git、SVN、Maven)、单元测试、代码分析等方面有着亮眼的发挥。IDEA 产于捷克,开发人员以严谨著称的东欧程序员为主。IDEA 分为社区版和付费版两个版本。 我呢,一直是 Eclipse 的忠实粉丝,差不多十年的老用户了。很早就接触到了 IDEA...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
为什么要推荐大家学习字节码?
配套视频: 为什么推荐大家学习Java字节码 https://www.bilibili.com/video/av77600176/ 一、背景 本文主要探讨:为什么要学习 JVM 字节码? 可能很多人会觉得没必要,因为平时开发用不到,而且不学这个也没耽误学习。 但是这里分享一点感悟,即人总是根据自己已经掌握的知识和技能来解决问题的。 这里有个悖论,有时候你觉得有些技术没用恰恰是...
【超详细分析】关于三次握手与四次挥手面试官想考我们什么?
在面试中,三次握手和四次挥手可以说是问的最频繁的一个知识点了,我相信大家也都看过很多关于三次握手与四次挥手的文章,今天的这篇文章,重点是围绕着面试,我们应该掌握哪些比较重要的点,哪些是比较被面试官给问到的,我觉得如果你能把我下面列举的一些点都记住、理解,我想就差不多了。 三次握手 当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次三次握手的时候,我想很多人会这样回答: 首先很多人会先讲下握...
压测学习总结(1)——高并发性能指标:QPS、TPS、RT、吞吐量详解
一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。 二、TPS,每秒事务 TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一...
新程序员七宗罪
当我发表这篇文章《为什么每个工程师都应该开始考虑开发中的分析和编程技能呢?》时,我从未想到它会对读者产生如此积极的影响。那些想要开始探索编程和数据科学领域的人向我寻求建议;还有一些人问我下一篇文章的发布日期;还有许多人询问如何顺利过渡到这个职业。我非常鼓励大家继续分享我在这个旅程的经验,学习,成功和失败,以帮助尽可能多的人过渡到一个充满无数好处和机会的职业生涯。亲爱的读者,谢谢你。 -罗伯特。 ...
2019年Spring Boot面试都问了什么?快看看这22道面试题!
Spring Boot 面试题 1、什么是 Spring Boot? 2、Spring Boot 有哪些优点? 3、什么是 JavaConfig? 4、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? 5、Spring Boot 中的监视器是什么? 6、如何在 Spring Boot 中禁用 Actuator 端点安全性? 7、如何在自定义端口上运行 Sprin...
【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
字节跳动这家公司,应该是所有秋招的公司中,对算法最重视的一个了,每次面试基本都会让你手撕算法,今天这篇文章就记录下当时被问到的几个算法题,并且每个算法题我都详细着给出了最优解,下面再现当时的面试场景。看完一定让你有所收获 一、小牛试刀:有效括号 大部分情况下,面试官都会问一个不怎么难的问题,不过你千万别太开心,因为这道题往往可以拓展出更多有难度的问题,或者一道题看起来很简单,但是给出最优解,确实很...
面试官:关于Java性能优化,你有什么技巧
通过使用一些辅助性工具来找到程序中的瓶颈,然后就可以对瓶颈部分的代码进行优化。 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。 下面将提供一些在JAVA程序的设计和编码中,为了能够提高JAVA程序的性能,而经常采用的一些方法和技巧。 1.对象的生成和大小的调整。 J...
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
版权声明:本文为苦逼的码农原创。未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究。欢迎大家多多转发,谢谢。 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋对敏感词过滤算法一点也没听说过。于是,有了下下事情的发生… 面试官开怼 面试官:玩过王者荣耀吧?了解过敏感词过滤吗?,例如在游戏里,如果我们发送“你在干嘛?麻痹演员啊你?”,由于“麻痹”是一个敏感词,...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
杭漂程序员2019的心路历程,还不起助学贷款,交不起房租,披荆斩棘终雨过天晴
一个杭漂2019的心酸历程,一路披荆斩棘终于还是雨过天晴。
我采访了同事,让他掏出了每天都会浏览的干货网站
前言只有光头才能变强。文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y在周六的晚上,我日常去到公司写文章。想写...
Java知识体系最强总结(2020版)
更新于2019-12-15 10:38:00 本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。也算是记录自己在从事编程工作的成长足迹,通过博客可以促进博主与阅读者的共同进步,结交更多志同道合的朋友。特此分享给大家,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。 文章目录...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
春节不出门!这三款超好评编程游戏,好玩到停不下来
By 超神经场景描述:春节马上就要来临,在这个假期里,怎么能让自己放松,又不至于生疏了自己的老本行?不妨来玩一下编程向的小游戏吧,超神经在此整理了三款好玩有趣又有深度的游戏,快看看是不是...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
昂,我24岁了
24岁的程序员,还在未来迷茫,不知道能不能买得起房子
正则表达式引擎执行原理——从未如此清晰!
如何写好一篇关于 正则表达式 的文章,我思考了一周的时间,从未有一篇文章能让猪哥如此费神。 因为我觉得正则表达式 :难记忆、难描述、广而深且不受重视,有人说正则表达式既好写也难写! 好写:无非写一些常用、实用的案例,说实话你们每个人都能写出这种:在网上百度一下然后结合一点自己的实际经验,一篇文章就出来了。 难写:很多人都认为正则简单,不用记,要用就百度一下。但是绝大多数人了解的只是正则的一个小面...
史上最牛逼的 Eclipse 快捷键,提高开发效率!
如果你在使用IDEA,请参考博主另外的一篇idea快捷键的博客。
如何快速打好Java基础?
二哥,我是一名大学生,专业是电力工程,但想自学 Java,如何快速打好基础呢? 微信上 tison 向我提出了这个问题。我想我是有资格来回答的,从北京奥运会那年开始学 Java,到现在已经有 10 多个年头了,真的是从一名编程白痴一步步走到现在的。 我在各大技术网站上分享了不少 Java 方面的原创文章,不知道影响了多少初学者,反正文章的留言中经常能看到他们由衷的感谢。现在每天仍然有不少同学(...
技术总监灵魂一问:精通那么多技术,为何还是做不好一个项目?
编写高质量可维护的代码既是程序员的基本修养,也是能决定项目成败的关键因素,本文试图总结出问题项目普遍存在的共性问题并给出相应的解决方案。 1. 程序员的宿命? 程序员的职业生涯中难免遇到烂项目,有些项目是你加入时已经烂了,有些是自己从头开始亲手做成了烂项目,有些是从里到外的烂,有些是表面光鲜等你深入进去发现是个“焦油坑”,有些是此时还没烂但是已经出现问题征兆走在了腐烂的路上。 国内基本上是这样,国...
相关热词 c#如何定义数组列表 c#倒序读取txt文件 java代码生成c# c# tcp发送数据 c#解决时间格式带星期 c#类似hashmap c#设置istbox的值 c#获取多线程返回值 c# 包含数字 枚举 c# timespan
立即提问