详解js中构造流程图的核心技术JsPlumb

项目里面用到了Web里面的拖拽流程图的技术JsPlumb,其实真不算难,不过项目里面用HTML做的一些类似flash的效果,感觉还不错,在此分享下。

一、效果图展示

1、从左边拖动元素到中间区域,然后连线

2、连线类型可以自定义:这里定义为直线、折线、曲线。实际项目中根据业务我们定义为分装线、分装支线、总装线等

3、鼠标拖动区域选中元素,并且选中元素统一拖动位置。

4、对选中的元素左对齐。

5、对选中元素居中对齐

6、右对齐

7、上对齐

8、垂直居中对齐

9、下对齐

10、根据第一个选中的元素上下靠拢

11、根据第一个选中的元素左右靠拢

12、根据第一个选中的元素同高

13、根据第一个选中的元素同宽

14、选中元素顺时针旋转,点击一次旋转45度

15、选中元素逆时针旋转。

16、选中统一删除元素以及元素上面的连线

这里很多效果其实在项目中作用并不太大,很多单纯就是为了展示用的。

二、代码详解

这里涉及的效果比较多,可能要分多篇来介绍。这篇还是来看看构造流程图的核心技术:JsPlumb。

1、概述 关于JsPlumb的内容,在此就简单说明下吧。jsPlumb是一个强大的JavaScript连线库,它可以将html中的元素用箭头、曲线、直线等连接起来,适用于开发Web上的图表、建模工具等。它同时支持jQuery+jQuery UI、MooTools和YUI3这三个JavaScript框架,十分强大。本项目中还是结合大家最熟悉的JQuery来讲解。并且还要注意的一点就是JsPlumb的浏览器兼容性,JsPlumb支持IE 6以上、火狐、谷歌等各种浏览器

2、使用 (1)引入JS文件 可以直接去官网上面下载最新的js库,由于JsPlumb需要JQuery的支持,按照网上的说法,它只兼容jQuery1.3.x及以上版本,并在jQuery UI 1.7.x、1.8.x及1.9.x上测试通过。所以我们需要下载较高一点版本的JQuery和JQuery UI。关于JsPlumb的内容只需要引用一个Js即可。类似

rush:js;">

(2)初始化 使用JsPlumb需要注意一点,JsPlumb的连线的样式是由点确定的,也就是说点的样式里面包含了相关的属性来说明当使用此点来连线的时候,连线的样式应该是什么样的。 在我们项目里面,左边的模型区域,中间才是设计区域。那么要将一个元素从模型区域创建出来,就要用到我们JQuery UI里面的draggable和droppable事件。首先我们注册左边模型的draggable和中间区域的droppable事件。

cshtml页面代码

表示中间区域容器。       

Js代码

首先我们定义几个点的样式的全局变量

rush:js;"> //基本连接线样式 var connectorPaintStyle = { strokeStyle: "#1e8151",fillStyle: "transparent",radius: 5,linewidth: 2 }; // 鼠标悬浮在连接线上的样式 var connectorHoverStyle = { linewidth: 3,strokeStyle: "#216477",outlinewidth: 2,outlineColor: "white" }; var endpointHoverStyle = { fillStyle: "#216477",strokeStyle: "#216477" }; //空心圆端点样式设置 var hollowCircle = { DragOptions: { cursor: 'pointer',zIndex: 2000 },endpoint: ["Dot",{ radius: 7 }],//端点的形状 connectorStyle: connectorPaintStyle,//连接线的颜色,大小样式 connectorHoverStyle: connectorHoverStyle,paintStyle: { strokeStyle: "#1e8151",linewidth: 2 },//端点的颜色样式 //anchor: "AutoDefault",isSource: true,//是否可以拖动(作为连线起点) connector: ["Straight",{ stub: [0,0],gap: 10,cornerRadius: 5,alwaysRespectStubs: true }],//连接线的样式种类有[Bezier],[Flowchart],[StateMachine ],[Straight ] isTarget: true,//是否可以放置(连线终点) maxConnections: -1,// 设置连接点最多可以连接几条线 connectorOverlays: [["Arrow",{ width: 10,length: 10,location: 1 }]] };

然后再页面初始化完成之后注册事件

rush:js;">         $(function(){ //左边区域的draggable事件 $("#divContentLeftMenu .node").draggable({ helper: "clone",scope: "plant" });
    //中间拖拽区的drop事件
    $("#divCenter").droppable({
      s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e: "plant",drop: function (event,ui) {
        // 创建工厂模型到拖拽区
        CreateModel(ui,$(this));
      }
    });

        });

//1.创建模型(参数依次为:drop事件的ui、当前容器、id、当前样式)
function CreateModel(ui,selector) {
//1.1 添加html模型
var modelid = $(ui.draggable).attr("id");
i++;
var id = modelid + i;
var cur_css = modelid;
var type = $(ui.helper).attr("dbtype");
$(selector).append('<div class="node ' + cur_css + '" id="' + id + '" dbtype="' + type + '" parentid="' + $(selector).attr("id") + '" onclick="oInitElement.GetPropertiesByType(\'' + type + '\',this)" ondblclick="InitStation().DbClick(\'' + type + '\',this)" >' + $(ui.helper).html() + '

');
var left = parseInt(ui.offset.left - $(selector).offset().left);
var top = parseInt(ui.offset.top - $(selector).offset().top);
$("#" + id).css("left",left).css("top",top);
//jsPlumb.setContainer($("#divCenter"));
//1.2 添加连接点
jsPlumb.addEndpoint(id,{ anchors: "RightMiddle" },hollowCircle);
jsPlumb.addEndpoint(id,{ anchors: "LeftMiddle" },{ anchors: "TopCenter" },{ anchors: "BottomCenter" },hollowCircle);
jsPlumb.draggable(id);

//1.3 <a href="https://www.jb51.cc/tag/zhuce/" target="_blank" class="keywords">注册</a>实体可draggable和resizable
$("#" + id).draggable({
  containment: "parent",start: function () {
    startMove();
  },drag: function (event,ui) {
    MoveSelectDiv(event,ui,id);
    jsPlumb.repaintEverything();
  },stop: function () {
    jsPlumb.repaintEverything();
  }
});

$("#" + id).resizable({
  resize: function () {
    jsPlumb.repaintEverything();
  },stop: function () {
    jsPlumb.repaintEverything();
    //oInitElement.SendPropRequest("DTO_TM_PLANT",$(this));
  }
});
return id;

};

重点来看看这一句:

jsPlumb.addEndpoint(id,hollowCircle); 调用了JsPlumb里面的addEndpoint方法,第一个参数表示页面标签的id,第一个表示连线点的位置(RightMiddle、LeftMiddle、TopCenter、BottomCenter四个选项);第三参数表示点的样式以及连线的样式。没调用依次addEndpoint方法,元素上面就会多一个连线的节点。关于hollowCircle里面各个参数的意义,可以查看api。

还有一句多个地方都看到了:

jsPlumb.repaintEverything(); 看字面意思大概能知道这句是干什么的,修复所有。当在中间区域拖动元素的时候,如果不带这一句,节点不会跟着元素一起移动。加上之后节点才会跟随标签移动。至此,最基础的JsPlumb连线就完成了。

以上就是本文的全部内容,希望能够帮助大家学习掌握流程图的核心技术JsPlumb。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据复制操作的两种方式。‌在聊深浅拷贝之前咱得了解一下js中的两种数据类型:
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:重建二叉树、反向输出链表每个节点 题目 重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列 {1,2,4,7,3,5,6,8} 和中序遍历序列 {
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须了解的知识点,现在迎来了ES6+的时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,所以刚好总结一下JavaScript中this指向的问题。
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)