js+HTML实现组织结构图

 记得引用jQuery。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Title</title>
</head>
<style>
    @media screen and(-ms-high-contrast:active),(-ms-high-contrast:none) {
        .ie_display{
            display: flex;
            flex-direction: column;
            align-items: center;
        }
        .ie_margin{
            margin-left: -10px!important;
        }
    }
</style>
<body style="overflow-y: scroll;">
<div id="depart" style="display: flex;justify-content: center;padding: 30px"></div>
</body>
<script src="js/jquery-1.11.0.min.js"></script>
<script>
    var isCompany = false;
    //配置公司背景色,部门背景色,用户所在部门背景色
    var comBackground = 'linear-gradient(#2196f3,#4c6cca)';
    var depBackground = 'linear-gradient(#673ab7,#4c6cca)';
    var userBackground = 'linear-gradient(#4CAF50,#4c6cca)';
    //获取用户所在部门和id
    var userDepName = '技术部';
    var userDepId = '7';
    var isHasTopCom = false;//是否需要另设顶层公司
    var topCompany = 'XXX集团有限公司';//顶层公司名称
 
    //1.接口返回原始数据结构
    var depArr = [
        // {departmentname: 'CEO', subcompanyid1: '2', supdepid: '0', id: '1'},
        // {departmentname: '销售与市场', subcompanyid1: '3', supdepid: '1', id: '2'},
        // {departmentname: '生产', subcompanyid1: '2', supdepid: '1', id: '3'},
        // {departmentname: '人力资源部', subcompanyid1: '2', supdepid: '2', id: '4'},
        // {departmentname: '物流&客服部', subcompanyid1: '3', supdepid: '3', id: '5'},
        // {departmentname: '计划&采购部', subcompanyid1: '3', supdepid: '3', id: '6'},
        // {departmentname: '技术部', subcompanyid1: '2', supdepid: '4', id: '7'},
        // {departmentname: '采购部', subcompanyid1: '2', supdepid: '5', id: '8'},
        // {departmentname: '销售部', subcompanyid1: '2', supdepid: '6', id: '9'},
    ];
    var comArr = [
        {subcompanyname: '国家DIP技术指导委员会', supsubcomid: '0', id: '1'},
        {subcompanyname: '专家指导组', supsubcomid: '1', id: '2'},
        {subcompanyname: '评审委员会', supsubcomid: '1', id: '3'},
		{subcompanyname: '办公室', supsubcomid: '1', id: '4'},
    ];
 
     //2.将接口返回的数据拼接成链表结构
    function findDep(depArr, str, arrNew) {
        var arr = arrNew || [];
        depArr.map(function(item, index){
            if (item.departmentname == str) {
                depArr.map(function(item1, index){
                    if (item1.id == item.supdepid) {
                        arr.push(item1);
                        if (item.supdepid == '0') {
                            return;
                        }
                        findDep(depArr, item1.departmentname, arr);
                    }
                })
            }
        })
        return arr;
    }
    var newComArr = [];
    if(isHasTopCom){
        newComArr.push({
            departmentname: topCompany,
            supdepid: '0',
            id: '8888',
        });
    }
    comArr.map(function(item, index){
        if(isHasTopCom){
            if (item.supsubcomid === '0') {
                item.supsubcomid = '8888';
            };
        }
        newComArr.push({
            departmentname: item.subcompanyname,
            supdepid: item.supsubcomid,
            id: item.id,
        });
    });
    function bibao(obj, s, m, str) {
        var x1 = m || [];
        for (var i = 0; i < obj.length; i++) {
            if (obj[i].supdepid == s) {
                x1.push(obj[i]);
                x1.map(function (item, index) {
                    if (item.subcompanyid1 && isCompany) {
 
                    } else {
                        x1[index].child = [];
                    }
                    if (str) {
                        isCompany = true;
                        for (var i = 0; i < str.length; i++) {
                            if (item.id == str[i].subcompanyid1 && !item.subcompanyid1) {
                                x1[index].child.push(str[i]);
                            }
                        }
                    }
                    return bibao(obj, item.id, x1[index].child, str);
                })
            }
        }
        return x1;
    };
    var arr = bibao(depArr, '0');
    var gData = bibao(newComArr,'0', [], arr);
 
    //3.界面和样式的处理
    function generate(obj, num, cb) {
        if (obj && obj[0]) {
            obj.map(function (item, index) {
                var html = '';
                var str = item.departmentname;
                if (item.departmentname.indexOf(" ") > -1) {
                    item.departmentname = item.departmentname.replace(/\s*/g, "");
                }
                var str1 = '';
                if (item.departmentname.indexOf('-') > -1) {
                    str1 = item.departmentname.replace(/-/g, '')
                }else if (item.departmentname.indexOf('&') > -1) {
                    str1 = item.departmentname.replace(/&/g, '')
                }else if (item.departmentname.indexOf('—') > -1) {
                    str1 = item.departmentname.replace(/—/g, '')
                } else if (item.departmentname.indexOf('.') > -1) {
                    str1 = item.departmentname.replace(/./g, '')
                } else if (item.departmentname.indexOf('(') > -1) {
                    str1 = item.departmentname.replace(/(/g, '')
                } else if (item.departmentname.indexOf(')') > -1) {
                    str1 = item.departmentname.replace(/)/g, '')
                } else if (item.departmentname.indexOf('(') > -1 && item.departmentname.indexOf(')') > -1) {
                    str1 = item.departmentname.replace(/(/g, '').replace(/)/g, '');
                } else if (item.departmentname.indexOf('(') > -1 && item.departmentname.indexOf(')') > -1) {
                    str1 = item.departmentname.replace('(', '').replace(')', '');
                } else if (item.departmentname.indexOf('-') > -1 && item.departmentname.indexOf('(') > -1 && item.departmentname.indexOf(')') > -1) {
                    str1 = item.departmentname.replace(/-/g, '').replace('(', '').replace(')', '');
                } else if (item.departmentname.indexOf('-') > -1 && item.departmentname.indexOf('(') > -1 && item.departmentname.indexOf(')') > -1) {
                    str1 = item.departmentname.replace(/-/g, '').replace(/(/g, '').replace(/)/g, '');
                } else {
                    str1 = item.departmentname;
                }
                var idStr = str1 + item.id;
                var idStrSpan = item.departmentname + item.id + 'span';
                var child = item.child;
                var spanBar = num != 1 ? "<div style='background: #4c6cca;display: block;width: 3px;height: 20px;margin: auto;'></div>" : "<span></span>";
                var background = item.subcompanyid1 ? depBackground : comBackground;
                if (item.departmentname == userDepName && item.id== userDepId) {
                    background = userBackground;
                }
                var span = child && child.length > 0 ? "<div id=" + idStrSpan + " style='color:#fff;cursor:pointer;font-size: 25px;margin-top: -10px'  onclick='display(" + JSON.stringify(item) + ",$(this)," + index + ")'>+</div>" : "<span></span>";
                html += "<div class='ie_display' style='text-align: center;font-size:14px;color:#fff;width: 200px'><div style='display:flex;align-items: center'><div>" + spanBar + "<div style='background: " + background + ";box-shadow:5px 5px 5px #6A48D7;width: 150px;margin: auto;text-align: center;border-radius: 5px;display: flex;align-items:center;justify-content:space-between;height: 60px'><div style='width: 20px'></div><div>" + str + "</div><div style='display: flex;flex-direction: column;height: 100%;justify-content: space-between'>" + span + "<div style='align-self: flex-end;width: 20px;border-radius: 50%;background: #fff;color: #4c6cca'>" + child.length + "</div></div></div></div></div><div id=" + "'" + idStr + "'" + " style='display: flex;justify-content: center;'></div></div>";
                if (cb) {
                    cb(html)
                }
            })
        }
    };
    generate(gData, 1, function (html) {
        $('#depart').append(html)
    });
 
    //4.点击触发generate方法挂载界面(点击右上角的+或-按钮)
    function display(item, that, index) {
        var str1 = '';
        if (item.departmentname.indexOf('-') > -1) {
            str1 = item.departmentname.replace(/-/g, '')
        } else if (item.departmentname.indexOf('&') > -1) {
            str1 = item.departmentname.replace(/&/g, '')
        }else if (item.departmentname.indexOf('—') > -1) {
            str1 = item.departmentname.replace(/—/g, '')
        } else if (item.departmentname.indexOf('.') > -1) {
            str1 = item.departmentname.replace(/./g, '')
        } else if (item.departmentname.indexOf('(') > -1) {
            str1 = item.departmentname.replace(/(/g, '')
        } else if (item.departmentname.indexOf(')') > -1) {
            str1 = item.departmentname.replace(/)/g, '')
        } else if (item.departmentname.indexOf('(') > -1 && item.departmentname.indexOf(')') > -1) {
            str1 = item.departmentname.replace(/(/g, '').replace(/)/g, '');
        } else if (item.departmentname.indexOf('(') > -1 && item.departmentname.indexOf(')') > -1) {
            str1 = item.departmentname.replace('(', '').replace(')', '');
        } else if (item.departmentname.indexOf('-') > -1 && item.departmentname.indexOf('(') > -1 && item.departmentname.indexOf(')') > -1) {
            str1 = item.departmentname.replace(/-/g, '').replace('(', '').replace(')', '');
        } else if (item.departmentname.indexOf('-') > -1 && item.departmentname.indexOf('(') > -1 && item.departmentname.indexOf(')') > -1) {
            str1 = item.departmentname.replace(/-/g, '').replace(/(/g, '').replace(/)/g, '');
        } else {
            str1 = item.departmentname;
        }
        var str = str1 + item.id;
        var child = item.child;
        var spanLeftImg = child[0].subcompanyid1 ? './leftDep.png' : './leftCom.png';
        var spanRightImg = child[0].subcompanyid1 ? './rightDep.png' : './rightCom.png';
        if(Number($('#depart')[0].style.left.replace('px',''))>0){
 
        }else {
            $('#depart').css({
                'position': 'relative',
                'left': "0px",
                'transition-property': 'all',
                'transition-duration': '1.5s'
            });
        }
        if (child) {
            if ($('#' + str).children('div').length > 0) {
                that.html('+');
                $('#' + str + '>div').remove();
                if (child.length !== 1) {
                    $('#' + str).prev().remove();
                }
            } else {
                var firstChild = 0;
                var divLeft = 0;
                var lineWidth = 0;
                that.html('-');
                $('#' + str).before('<div style="width: 150px"><div style="background: #4c6cca;display: block;width: 3px;height: 20px;margin: auto;"></div><div style="height: 3px;background: #4c6cca;margin-left: -26px"></div></div>');
                generate(child, '', function (html) {
                    $('#' + str).append("<div style=''>" + html + "</div>");
                    $('#' + str).css('margin-bottom', '20px');
                    var childNum = $('#' + str).children('div').length;
                    var maxNum = parseInt((window.innerWidth-5)/200);
                    var siblings = ($('#' + str).parent().parent().siblings());
                    var windowWidth = window.innerWidth;
                    //右边越界
                    if ($('#' + str) && $('#' + str).children('div:first-child')[0] && ($('#' + str).children('div:last-child')[0].offsetLeft > windowWidth - 200) && child.length < maxNum) {
                        $('#depart').css({
                            position: 'relative',
                            'left': -($('#' + str).children('div:last-child')[0].offsetLeft + 200 - windowWidth) + 'px',
                            'transition-property': 'all',
                            'transition-duration': '1s'
                        });
                    }
                    for (var i = 0; i < siblings.length; i++) {
                        if ($(siblings[i])[0].childElementCount > 0 && $(siblings[i])[0].id!='span1'&& $(siblings[i])[0].id!='span2') {
                            if ($(siblings[i]).children().children('div:last-child').children().length > 0) {
                                if ($(siblings[i]).children().children('div:last-child').children().length > 1) {
                                    $(siblings[i]).children().children('div:last-child').prev().remove();
                                }
                                $(siblings[i]).children().children('div:first-child').children('div:last-child').children('div:last-child').children('div:last-child').children('div:first-child').html('+');
                                $(siblings[i]).children().children('div:last-child').children().remove();
                            }
                        }
                    }
                    if (200 * (childNum + 1) - 197 >= window.innerWidth) {
                        if (isIE()) {
                            console.log(isIE())
                            $('#' + str).css({position: 'absolute', left: '-28px', right: 0});
                        } else {
                            $('#' + str).css({position: 'absolute', left: 0, right: 0});
                        }
                        $('#' + str).css({position: 'absolute', left: 0, right: 0});
                        $('#' + str).children("div:nth-child(" + childNum + ")").css('display', 'none');
                        if ($('#' + str).children("div:first-child")[0]&&$('#' + str).children("div:first-child")[0].id != 'span1') {
                            $('#' + str).children("div:first-child").before('<div id="span1" class="ie_positon_span1" style="margin-top: 23px;cursor: pointer" onclick="leftDir(' + str + ')"><img src=' + spanLeftImg + ' alt="" style="width:40px;height: 50px"/></div>');
                        }
                        $('#' + str).children('#span1').css('visibility', 'hidden');
                        if ($('#' + str).children('#span2').length == 0) {
                            $('#' + str).children("div:nth-child(" + Number(maxNum + 1) + ")").after('<div id="span2" class="ie_margin" style="margin-top: 23px;cursor: pointer;margin-left: -40px" onclick="rightDir(' + str + ')"><img src=' + spanRightImg + ' alt="" style="width:40px;height: 50px"/></div>');
                        }
                        divLeft = $('#' + str).children("div:nth-child(2)").children("div:first-child").children("div:first-child").children("div:first-child").children("div:first-child")[0].offsetLeft+1.5;
                        lineWidth = 200 * (maxNum - 1);
                        firstChild = $('#' + str).children('#span1')&&$('#' + str).children('#span1')[0].offsetLeft;
                    } else {
                        divLeft = $('#' + str).children("div:first-child").children("div:first-child").children("div:first-child").children("div:first-child").children("div:first-child")[0].offsetLeft;
                        lineWidth = 200 * (childNum - 1) + 3 ;
                        firstChild = $('#' + str).children("div:first-child")[0].offsetLeft;
                    }
                    //左边越界
                    if (firstChild+Number($('#depart')[0].offsetLeft)<=0) {
                        $('#depart').css({
                            'position': 'relative',
                            'left': -firstChild + 'px',
                            'transition-property': 'all',
                            'transition-duration': '1s'
                        });
                    }
                    $('#' + str).prev().children("div:last-child").css({
                        'width': lineWidth + 'px',
                        'margin-left': '0px',
                        'position': 'absolute',
                        'left': divLeft+ 'px',
                    });
                    if (child.length == 1) {
                        $('#' + str).prev().remove();
                    }
                });
            }
        }
    }
 
    //5.创建用户所属的组织链条
    var count = 0;
    function findDep(depArr, str, id, arrNew) {
        var arr = arrNew || [{child: []}];
        count++;
        for (var n = 0; n < depArr.length; n++) {
            var item = depArr[n];
            if (item.departmentname == str && item.id == id) {
                for (var m = 0; m < depArr.length; m++) {
                    var item1 = depArr[m];
                    if (item1.id == item.supdepid) {
                        var itemStr = item1.child;
                        for (var i = 0; i < itemStr.length; i++) {
                            if (item.departmentname == itemStr[i].departmentname) {
                                if (count % 2 == 0) {
                                    arr[0].name = item1.departmentname;
                                    arr[0].no = i;
                                }
                                if (count % 2 != 0) {
                                    arr[0].child.push({name: item1.departmentname, no: i});
                                }
                            }
                        }
                        var arrNew = arr;
                        if (arr[0].name != undefined && arr[0].child.length > 0) {
                            arrNew = [{child: arr}];
                            count--;
                        }
                        if (item1.supdepid == '0' && item1.subcompanyid1 == undefined) {
                            return arr;
                        } else if (item1.supdepid == '0') {
                            for (var i = 0; i < newComArr.length; i++) {
                                if (newComArr[i].id == item1.subcompanyid1) {
                                    var itemStr1 = newComArr[i].child;
                                    for (var j = 0; j < itemStr1.length; j++) {
                                        if (item1.departmentname == itemStr1[j].departmentname) {
                                            arrNew[0].name = newComArr[i].departmentname;
                                            arrNew[0].no = j;
                                            return findDep(newComArr, newComArr[i].departmentname, newComArr[i].id, [{child: arrNew}]);
                                            break;
                                        }
                                    }
                                }
                            }
                        } else {
                            return findDep(depArr, item1.departmentname, item1.id, arrNew);
                        }
                        break;
                    }else if(item.supdepid == '0'){
                        var arrNew = arr;
                        if (arr[0].name != undefined && arr[0].child.length > 0) {
                            arrNew = [{child: arr}];
                            count--;
                        }
                        for (var i = 0; i < newComArr.length; i++) {
                            if (newComArr[i].id == item.subcompanyid1) {
                                var itemStr1 = newComArr[i].child;
                                for (var j = 0; j < itemStr1.length; j++) {
                                    if (item.departmentname == itemStr1[j].departmentname) {
                                        arrNew[0].name = newComArr[i].departmentname;
                                        arrNew[0].no = j;
                                        return findDep(newComArr, newComArr[i].departmentname, newComArr[i].id, [{child: arrNew}]);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
                break;
            }
        }
    }
    var depChain = findDep(depArr, userDepName, userDepId);
    function displayDep(obj, objN, index) {
        var objM = obj[index];
        var idStrSpan = objM.departmentname + objM.id + 'span';
        display(objM, $('#' + idStrSpan));
        if (objN && objN.length > 0) {
            if (objM.departmentname == objN[0].name) {
                if (objN[0].child && objN[0].child.length > 0) {
                    displayDep(objM.child, objN[0].child, objN[0].no);
                }
            }
        }
    }
    ;
    displayDep(gData, depChain, 0);
 
    //点击右边箭头
    function rightDir(str) {
        if ($(str).children('#span1')[0].style.visibility == 'hidden') {
            $(str).children('#span1').css('visibility', 'visible');
        }
        $(str).children('#span1').next().css('display', 'none');
        $(str).children('#span1').insertAfter($(str).children('#span1').next());
        $(str).children('#span2').next().css('display', 'block');
        $(str).children('#span2').insertAfter($(str).children('#span2').next());
        if ($(str).children('#span2').next().length == 0) {
            $(str).children('#span2').css('visibility', 'hidden');
        }
        removeChild(str);
    }
 
    //点击左边箭头
    function leftDir(str) {
        if ($(str).children('#span2')[0].style.visibility == 'hidden') {
            $(str).children('#span2').css('visibility', 'visible');
        }
        $(str).children('#span1').prev().css('display', 'block');
        $(str).children('#span1').insertBefore($(str).children('#span1').prev());
        $(str).children('#span2').prev().css('display', 'none');
        $(str).children('#span2').insertBefore($(str).children('#span2').prev());
        if ($(str).children('#span1').prev().length == 0) {
            $(str).children('#span1').css('visibility', 'hidden');
        }
        removeChild(str);
    }
    //公共方法-点击箭头之后删掉下面的所属机构
    function removeChild(father) {
        $('#depart').css({
            position: 'relative',
            'left': "0px",
            'transition-property': 'all',
            'transition-duration': '1.5s'
        });
        var siblings = $(father).children();
        for (var i = 0; i < siblings.length; i++) {
            if ($(siblings[i])[0].childElementCount > 0) {
                if ($(siblings[i]).children().children('div:last-child').children().length > 0) {
                    if ($(siblings[i]).children().children('div:last-child').children().length > 1) {
                        $(siblings[i]).children().children('div:last-child').prev().remove();
                    }
                    $(siblings[i]).children().children('div:last-child').children().remove();
                    $(siblings[i]).children().children('div:first-child').children('div:last-child').children('div:last-child').children('div:last-child').children('div:first-child').html('+');
                }
            }
        }
    }
    //判断是否是ie浏览器
    function isIE() {
        if (!!window.ActiveXObject || "ActiveXObject" in window) {
            return true;
        } else {
            return false;
        }
    }
</script>
</html>

转载:js实现组织结构图 https://blog.csdn.net/weixin_44135121/article/details/87385437

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值