<head><meta charset="UTF-8" /><meta ...">
最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 基于jsplumb.js实现多列表一对多连线效果

    正文概述 掘金(万万碎斌斌)   2021-01-09   442

    先上效果图

    基于jsplumb.js实现多列表一对多连线效果



      <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>连线demo</title>
        <script type="text/javascript" src="./jsplumb.js"></script>
        <style>
            .ul-list {
                display: inline-block;
            }
    
            .ul-list li {
                list-style-type: none;
                border: 1px solid red;
                height: 30px;
                line-height: 30px;
                text-align: center;
                width: 100px;
            }
        </style>
    </head>
    
    <body>
        <div>
            <div><button id="btn">获取连线</button></div>
            <textarea rows="5" cols="50" class="textarea"> </textarea>
            <div id="container"></div>
        </div>
        <script>
            // 定义列表数据
            let data;
            // 定义默认连线关系数据
            let relationship;
            // 定义jsplumb实例变量
            let instance;
    
            data = [
                [
                    {
                        title: "我是a1啦啦",
                        id: "a1",
                    },
                    {
                        title: "我是a2啦啦",
                        id: "a2",
                    },
                    {
                        title: "我是a3啦啦",
                        id: "a3",
                    },
                ],
                [
                    {
                        title: "我是b1啦啦",
                        id: "b1",
                    },
                    {
                        title: "我是b2啦啦",
                        id: "b2",
                    },
                    {
                        title: "我是b3啦啦",
                        id: "b3",
                    },
                ],
                [
                    {
                        title: "我是c1啦啦",
                        id: "c1",
                    },
                    {
                        title: "我是c2啦啦",
                        id: "c2",
                    },
                    {
                        title: "我是c3啦啦",
                        id: "c3",
                    },
                ],
            ];
    
            relationship = [
                { source: "a1", target: "b1" },
                { source: "a1", target: "b2" },
                { source: "b1", target: "c3" },
            ];
    
            // 循环列表数据 渲染列表ul
            data.forEach((v1, i1) => {
                let ul = document.createElement("ul");
                // 添加一个类名 方便后期获取
                ul.classList.add("ul-list");
                let lis = "";
                v1.forEach((v2) => {
                    // id必须设置为数据的id 再添加自定义属性index值为当前列表索引 后期需要用到
                    lis += `<li id=${v2.id} index=${i1}>${v2.title}</li>`;
                });
                ul.innerHTML = lis;
                document.getElementById("container").appendChild(ul);
            });
    
            jsPlumb.ready(function () {
                // 初始化jsPlumb 创建jsPlumb实例
                init();
                // 设置可以为连线起点和连线终点的元素
                setContainer();
                // 设置默认连线
                setConnect();
                // 在连线事件中 只允许连接相邻的列表 不能跨列表连接
                setRule();
                jsPlumb.fire("jsPlumbDemoLoaded", instance);
            });
    
            // 初始化jsPlumb 创建jsPlumb实例
            function init() {
                instance = jsPlumb.getInstance({
                    Connector: "Straight", //连接线形状 Bezier: 贝塞尔曲线Flowchart: 具有90度转折点的流程线 StateMachine: 状态机 Straight: 直线
                    // PaintStyle: { strokeWidth: 3, stroke: "#ffa500", "dashstyle": "2 4" }, //连接线样式
                    Endpoint: ["Dot", { radius: 5 }], //端点
                    EndpointStyle: { fill: "#ffa500" }, //端点样式
                    Container: "container", //目标容器id
                    ListStyle: {
                        endpoint: ["Rectangle", { width: 30, height: 30 }],
                    },
                });
            }
    
            // 设置可以连线的元素
            function setContainer() {
                //相当于css选择器 也可以使用id选择等
                let uls = jsPlumb.getSelector(".ul-list");
                // 将dom元素设置为连线的起点或者终点  设置了起点的元素才能开始连线 设置为终点的元素才能为连线终点
                instance.batch(function () {
                    uls.forEach((ul) => {
                        let lis = ul.querySelectorAll("li");
                        lis.forEach((li) => {
                            // 将li设置为起点
                            instance.makeSource(li, {
                                allowLoopback: false,
                                anchor: ["Left", "Right"], // 设置端点位置
                            });
                            // 将li设置为终点
                            instance.makeTarget(li, {
                                anchor: ["Left", "Right"],
                            });
                        });
                    });
                });
            }
    
            // 设置默认连线
            function setConnect() {
                relationship.forEach(function (el) {
                    // source是连线起点元素id target是连线终点元素id
                    instance.connect({ source: el.source, target: el.target });
                });
            }
    
            // 只允许连接相邻的列表
            function setRule() {
                // // 连线事件 不不允许连接当前所在list
                instance.bind("connection", function (connInfo, originalEvent) {
                    // connInfo是jsPlumb对象 可以打印出来康康有哪些东西
    
                    // 根据sourceId拿到开始连接元素li 再根据li的index自定义属性 判断只允许连接相邻的ul列表
                    let index = Number(
                        document
                            .getElementById(connInfo.connection.sourceId)
                            .getAttribute("index")
                    );
                    let allow = [];
                    if (data[index + 1]) {
                        allow = [...allow, ...data[index + 1].map((_) => _.id)];
                    }
                    if (data[index - 1]) {
                        allow = [...allow, ...data[index - 1].map((_) => _.id)];
                    }
                    // 如果连线终点元素(targetId)不在起点元素(sourceId)的前后ul列表范围 就删除该连线
                    if (allow.indexOf(connInfo.connection.targetId) == -1) {
                        // 删除连线
                        instance.deleteConnection(connInfo.connection);
                    }
                });
            }
    
            // 给button注册点击事件获取连线关系
            document.getElementById("btn").addEventListener("click", function () {
                let newRelationship = '';
                instance.getAllConnections().forEach((el) => {
                    newRelationship+=` ${el.sourceId}连接了${el.targetId}`;
                });
                document.querySelector('.textarea').value = newRelationship
                console.log(document.querySelector('.textarea'));
                //  jsplumb常用方法
                // jsplumb.getConnections({souce: 'sourceID', target: 'targetID'});  //获取指定连线
                // 1. jsPlumb.getAllConnections() 获取所有连接线
                // 2. jsPlumb.deleteEveryConnection(); 清空所有连接线
                // 3. jsPlumb.deleteConnection(connInfo.connection); //删除连接线
                // 4. jsPlumb.setContainer(document.getElementById("main"));//初始化实例化组件
            });
        </script>
    </body>
    
    </html>
    

    代码非常简单,还可以实现连线高亮等效果,可以自己查阅文档,要是有连线这块的有问题可以给我留言,其他的就不要找我啦 哈哈


    起源地下载网 » 基于jsplumb.js实现多列表一对多连线效果

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元