当前位置:   article > 正文

jsplum入门_jsplumb

jsplumb

一、基本知识

  • Source:源节点
  • Target:目标节点
  • Anchor:锚点
  • Endpoint:端点,连接的起点或终点
  • Connector:连线,连接两个节点的直观表现
  • Overlay:装饰连接器的组件,类似箭头之类
  • Group:包含在某个其他元素中的一组元素,可以折叠,导致与所有组成员的连接被合并到折叠的组容器上。

jsPlumb通过元素id来和所有的元素进行交互,如果没有为元素设置id,0jsPlumb就会为元素创建一个id。建议为用户界面上的每个元素设置一个合适的id。

由于jsPlumb使用元素id和元素进行交互,因此当你的元素id发生改变的时候,你需要告诉jsPlumb。有两种方法通知jsPlumb元素id发生了改变:

  1. jsPlumb.setId(el,newId)
  2. jsPlumb.setIdChanged(oldId,newId)

jsPlumb提供了拖动方法:

  1. var firstInstance=jsPlumb.getInstance();
  2. firstInstance.draggable("ele_id");

每次使用连线时,都会导致相关联的元素重绘,但当加载大量数据时,可以使用:

  1. jsPlumb.setSuspendDrawing(true);
  2. jsPlumb.setSuspendDrawing(false,true);

第二个参数设置为true,会使整个jsPlumb立即重绘。也可以使用batch:

jsPlumb.batch(fn,[doNotRepaintAfterwards]);

这个函数也一样,可以先将所有的连接全部注册好,再一次重绘。


1.1 默认参数

  1. Anchor : "BottomCenter",//端点的定位点的位置声明(锚点):left,top,bottom等
  2. Anchors : [ null, null ],//多个锚点的位置声明
  3. ConnectionsDetachable : true,//连接是否可以使用鼠标默认分离
  4. ConnectionOverlays : [],//附加到每个连接的默认重叠
  5. Connector : "Bezier",//要使用的默认连接器的类型:折线,流程等
  6. Container : null,//设置父级的元素,一个容器
  7. DoNotThrowErrors : false,//如果请求不存在的Anchor,Endpoint或Connector,是否会抛出
  8. DragOptions : { },//用于配置拖拽元素的参数
  9. DropOptions : { },//用于配置元素的drop行为的参数
  10. Endpoint : "Dot",//端点(锚点)的样式声明(Dot)
  11. Endpoints : [ null, null ],//多个端点的样式声明(Dot)
  12. EndpointOverlays : [ ],//端点的重叠
  13. EndpointStyle : { fill : "#456" },//端点的css样式声明
  14. EndpointStyles : [ null, null ],//同上
  15. EndpointHoverStyle : null,//鼠标经过样式
  16. EndpointHoverStyles : [ null, null ],//同上
  17. HoverPaintStyle : null,//鼠标经过线的样式
  18. LabelStyle : { color : "black" },//标签的默认样式。
  19. LogEnabled : false,//是否打开jsPlumb的内部日志记录
  20. Overlays : [ ],//重叠
  21. MaxConnections : 1,//最大连接数
  22. PaintStyle : { lineWidth : 8, stroke : "#456" },//连线样式
  23. ReattachConnections : false,//是否重新连接使用鼠标分离的线
  24. RenderMode : "svg",//默认渲染模式
  25. Scope : "jsPlumb_DefaultScope"//范围,标识

就开了;就开了;就开了; 分为全局默认参数和连线默认参数。

如果是全局参数可以使用:

jsPlumb.importDefaults({···})

也可以在实例化时,重新定义:

jsPlumb.getInstance({···})

1.2 锚点(Anchors)

坐落在一个元素身上,用于多个元素之间相互连线的点,主要分为以下四类:

  • 静态(Static):固定在元素的某个点上,不能移动,可以使用字符串来指定他们,以确定jsPlumb所附带的默认值,或描述该位置的数组
  • 动态(Dynamic):这是静态锚的列表,每次连接绘制时,jsPlumb从中选择最合适的点
  • 周边锚(Perimeter anchors):这些锚点符合某些给定形状的周长,它们的本质是动态锚,其位置从底层形状的周边中选择
  • 连续锚(Continuous anchors):这些锚不固定在任何特定位置,它们被分配到元素的四个面之一,者取决于该元素与关联连接中另一个元素的方向

需要注意的是连接点分为动态连接点和静态连接点。当指定一个数组作为连接点时,该连接点为动态连接点,连线时会自动选择最近的连接点连接;当指定一个坐标或者固定位置(TopRight、RightMiddle等)作为连接点时,该连接点为静态连接点,不管怎么连线都不会移动

静态锚

jsplumb有9个默认的锚点位置,具体有:TopLeft、TopCenter、TopRight、LeftMiddle、RightMiddle、BottonLeft、BottomCenter、BottomRight、Center.

可以使用基于数组的形式来定义锚点的位置:[x,y,dx,dy,offsetX,offsetY]。x表示锚点在横轴上的距离,y表示锚点在纵轴上的距离,这两个值可以从0到1来设置,0.5为center。dx表示锚点向横轴射出线,dy表示锚点向纵轴射出线,由0、-1、1三个值来设置,0表示不放射线。offsetX表示锚点偏移量x(px),offsetY表示锚点的偏移量y(px)。

动态锚

这些都是可以在若干位置之一定位的锚点,当你每次移动一个元素时,会自动选择一个最合适的位置,没有特殊的语法来创建一个DynamicAnchor,你只需要提供一个独立的锚位置。jsPlumb提供了一个默认的动态锚,定名为“AutoDefault”,其包含的锚点位置有:TopCenter、BottomCenter、LeftMiddle、RightMiddle。

使用方法:

  1. jsPlumb.connect({
  2. anchor:"AutoDefault",
  3. })

周边锚(Perimeter anchors)

jsPlumb提供了六种形状:Circle、Ellipse、Triangle、Diamond、Rectangle、Square。

连续锚(Continuous anchors)

  1. anchor:"Continuous"
  2. //or
  3. anchor:["Continuous",{faces:["top","left"]}]

 faces有四个值:top、left、right、bottom

1.3 连接器(Connectors)

链接的线,实际上是界面上的各个元素的连接线,jsPlumb有三种连接器:直线、Bezier曲线、折线。

  • 直线 (Straight)。直接连接两个端点,没有构造函数的参数支持,使用参数endpointStyle定义连接样式或添加端点时定义连接线样式
  • Bezier曲线(Bezier)。贝塞尔曲线提供了两个端点之间的立方体路径,它支持一个构造函数参数(curviness ,弯曲度,可选,默认为150,定义了Bezier的控制点与锚点的距离)
  • 流程图(Flowchart)。这种类型的连接器是由一系列垂直或水平线段组合而成,支持一个单一的构造函数参数
  • 状态器(StateMachine):支持在同一元素上开始和结束的连接,支持的参数有:margin,默认为5;curviness,默认为10,proximityLimit,默认为80;

可以有选择的设置一个连接器,通过设置“connector”来定义;或者在添加端点时设置连接线。

1.4 端点(Endpoints)

一个端点的UI组件,标志着一个锚的位置,是连接器连接的点,jsPlumb有四个端点实现:点、矩形、图形和空白。

可以在使用connect()、addEndpoint()、makeSource()或jsPlumb.makeTarget时使用endpoint参数指定Endpoint属性

给端点进行配置:

  • jsPlumb.connect(),创建连接的时候可以配置端点的属性
  • jsPlumb.addEndpoint(),创建一个新的端点时配置属性
  • jsPlumb.makeSource(),配置元素并随后从该元素中拖动连接时,将创建并分配一个新的端点

端点的预设类型:

  1. jsPlumb.connect({
  2. //Rectangle可以设置:width,height,cssClass,hoverClass
  3. endpoint:["Rectangle",{height:10,width:10}],
  4. })
  1. jsPlumb.connect({
  2. //Dot可以设置:radius,cssClass,hoverClass
  3. endpoint:["Dot",{radius:5}],
  4. })
  1. jsPlumb.connect({
  2. endpoint:["Image",{url:"02.jpg"}]
  3. })

1.5 叠加层(Overlays)

jsPlumb有五种类型的叠加:

  • Arrow:箭头,在连接器的某个点绘制的可配置箭头,可以控制箭头的长度和宽度,参数有:

width:箭头尾部的宽度

length:从箭头的尾部到头部的距离

location:位置,建议使用0~1之间,当做百分比,便于理解

direction:方向,默认值为1(表示向前),可选-1(表示向后)

foldback:折回,也就是尾翼的角度,默认0.623,当为1时,为正三角

paintStyle:样式对象

  • Label:在连接点的可配置标签,参数有:

label:要显示的文本

cssClass:Label的可选css

labelStyle:标签外观的可选参数:font,适应canvas的字体大小参数;color,标签文本的颜色

padding:标签的可选填充,比例而不是px;borderWidth,标签边框的可选参数,默认为0

borderStyle:颜色等边框参数

也可以使用getLabel和setLabel来获取和设置label的文本

  • PlainArrow:箭头形状为三角形

知识Arrow的foldback为1时的例子,参数与Arrow相同

  • Diamond:菱形

同样是Arrow的foldback为2时的例子,参数与Arrow相同

  • Custom:自定义

允许创建自定义的叠加层,需要使用create()来返回DOM元素或者有效的选择器ID

所有叠加层都支持:getLocation()返回当前位置,setLocation()设置当前位置

  1. <style>
  2. .item{
  3. width:50px;
  4. height:50px;
  5. border:1px solid black;
  6. position:absolute;/*注意这里*/
  7. }
  8. </style>
  9. <div id="diagramContainer">
  10. <div id="item_left" class="item"></div>
  11. <div id="item_right" class="item" style="left: 150px;"></div>
  12. </div>
  13. <script src="jquery-3.0.0.js"></script>
  14. <script src="jquery-ui.min.js"></script>
  15. <script src="jsplumb.min.js"></script>
  16. <script>
  17. jsPlumb.ready(function(){
  18. var firstInstance=jsPlumb.getInstance();
  19. firstInstance.connect({
  20. source:"item_left",
  21. target:"item_right",
  22. paintStyle:{
  23. stroke:"red",
  24. strokeWidth:2
  25. },
  26. overlays:[
  27. ["Arrow",{location:0.1}],
  28. ["Label",{location:0.3,label:"测试"}],
  29. ["PlainArrow",{location:0.5}],
  30. ["Diamond",{location:0.7}],
  31. ["Custom", {
  32. create:function(component) {
  33. return $("<select id='myDropDown'><option value='foo'>foo</option><option value='bar'>bar</option></select>");
  34. },
  35. location:0.9,
  36. id:"customOverlay"/*作为唯一标识*/
  37. }]
  38. ]
  39. })
  40. })
  41. </script>

运行结果:

 、

1.6 Groups

相当于给节点之间加入了分组的概念,一旦分组,那么就可以使用组来控制组下的所有元素

1.7 Grag

如果不使用jsPlumb提供的拖动,则需要使用repaint()来对拖动之后的连线进行重绘。而当修改了节点的层级,或者偏移则需要使用revalidate(container)来刷新。

1.8 建立连接

 可以使用jsPlumb.connect({...})来创建连接,这种方式创建的连接线一旦移除,则创建的端点也会自动移除。如果不想端点被移除,则可以继续加参数,将deleteEndpointsOnDetach设为false。

  1. /*引用jquery.jsplumb.js*/
  2. var firstInstance=jsPlumb.getInstance();
  3. var test=firstInstance.connect({
  4. source:"item_left",
  5. target:"item_right",
  6. deleteEndpointsOnDetach:false,
  7. });

如果不想鼠标能够移除连接线,则可以在局部配置中将ConnectionsDetachable设为false,或者在connect时,加入detachable:false。

  1. var firstInstance=jsPlumb.getInstance();
  2. var test=firstInstance.connect({
  3. source:"item_left",
  4. target:"item_right",
  5. detachable:false
  6. });

1.9 拖放连接

 一开始就要创建一个端点作为源点,这样就可以从该端点拉线出去。如果给另一个端点添加isTarget:true,则可以连入这个点。

  1. var endpoint1 = jsPlumb.addEndpoint('elementId',{isSource:true})
  2. var endpoint2 = jsPlumb.addEndpoint('elementId',{isTarget:true})

也可以使用makeSource和makeTarget来创建。

可以使用maxConnections来配置最大连线数。如果超出了该数目,会执行配置的onMaxConections回调函数。makeTarget也有onMaxConnections方法。

  1. var firstInstance=jsPlumb.getInstance();
  2. firstInstance.makeSource("item_left",{
  3. anchor:"Continuous",
  4. maxConnections:1,
  5. onMaxConnections:function(){
  6. alert("超出连线")
  7. }
  8. })
  9. firstInstance.makeTarget("item_right",{
  10. anchor:"Continuous",
  11. maxConnections:1
  12. })

某个元素通过makeTarget或addEndpoint方法设置为“连线终点”,如果不想造成回环,则可以在makeTarget()中设置allowLopback:false,如果只想产生一个端点,而不是多个端点,则需要使用uniqueEndpoint:true

如果既配置了元素可拖动,又设置了元素可拖放连接,那jsPlumb没有办法区分拖动元素和从元素中拖动连接,所以它提供了filter方法。

  1. jsPlumb.makeSource("foo",{
  2. filter:"span",/*"span"表示标签,".className"表示类,"#id"表示元素id*/
  3. filterExclude:true
  4. });

如果设置“filterExclude:true”,则表示除span元素的其他元素都可以创建拖放连接;如果设置"filterExclude:false"则表示通过拖动span元素创建连接,filterExclude默认为false。filter也接受函数。filter:function(event,element).

也可以使用isTarget("id"),isSource("id")来判断节点是否成为了源点。

如果配置了source和target之后,想切换源的激活状态,则可以使用setTargetEnabled(id),setSourceEnabled(id)

如果想取消makeTargetmakeSource所创建的源点,可以使用:

  • unmakeTarget("id")
  • unmakeSource("id")
  • unmakeEveryTarget
  • unmakeEverySource

 


二、简单例子

2.1 连接两个节点

  1. <style>
  2. .item{
  3. float:left;
  4. width:50px;
  5. height:50px;
  6. border:1px solid black;
  7. }
  8. </style>
  9. <div id="diagramContainer">
  10. <div id="item_left" class="item"></div>
  11. <div id="item_right" class="item" style="margin-left: 50px;"></div>
  12. </div>
  13. <script src="jsplumb.min.js"></script>
  14. <script>
  15. jsPlumb.ready(function(){
  16. jsPlumb.connect({
  17. source:"item_left",
  18. target:"item_right",
  19. endpoint:"Dot"
  20. })
  21. })
  22. </script>

效果图:

参数说明:

参数参数类型是否必须说明
sourceString,Object,Endpoint连线源的标识,可以是id, element, 或者Endpoint
targetString,Object,Endpoint连线目标的标识,可以是id, element, 或者Endpoint
endpointString可选端点类型,形状

2.2 可拖动节点

  1. <style>
  2. .item{
  3. width:50px;
  4. height:50px;
  5. border:1px solid black;
  6. position:absolute;/*注意这里*/
  7. }
  8. </style>
  9. <div id="diagramContainer">
  10. <div id="item_left" class="item"></div>
  11. <div id="item_right" class="item" style="left: 150px;"></div>
  12. </div>
  13. <script src="jsplumb.min.js"></script>
  14. <script>
  15. jsPlumb.ready(function(){
  16. jsPlumb.connect({
  17. source:"item_left",
  18. target:"item_right",
  19. endpoint:"Dot"
  20. })
  21. jsPlumb.draggable('item_left')
  22. jsPlumb.draggable('item_right')
  23. })
  24. </script>

效果图:

2.3 连接的其它参数

connector:设置链接线的形状,比如直线或者曲线

anchor:设置锚点的位置

  1. jsPlumb.connect({
  2. source:"item_left",
  3. target:"item_right",
  4. endpoint:"Rectangle",
  5. connector:['Bezier'],
  6. anchor:['Left','Right']
  7. })

2.4 设置连接的默认使用

可以将相同配置提取出来作为一个单独的变量,作为connect的第二个参数传入。

  1. jsPlumb.ready(function () {
  2. var common = {
  3. endpoint: 'Rectangle',
  4. connector: ['Bezier'],
  5. anchor: ['Left', 'Right']
  6. }
  7. jsPlumb.connect({
  8. source: 'item_left',
  9. target: 'item_right'
  10. }, common)
  11. jsPlumb.draggable('item_left')
  12. jsPlumb.draggable('item_right')
  13. })

2.5 给连接加上样式

  1. jsPlumb.connect({
  2. source: 'item_left',
  3. target: 'item_right',
  4. paintStyle: { stroke: 'lightgray', strokeWidth: 3 },
  5. endpointStyle: { fill: 'lightgray', outlineStroke: 'darkgray', outlineWidth: 2 }
  6. }, common)

2.6 给连接加上箭头

通过overlays设置,可以设置箭头的长宽和箭头的位置

  1. jsPlumb.connect({
  2. source: 'item_left',
  3. target: 'item_right',
  4. paintStyle: { stroke: 'lightgray', strokeWidth: 3 },
  5. endpointStyle: { fill: 'lightgray', outlineStroke: 'darkgray', outlineWidth: 2 },
  6. overlays: [ ['Arrow', { width: 12, length: 12, location: 0.5 }] ]
  7. }, common)

location=0.5表示箭头位于中间,location=1表示箭头设置在连线末端。一根连线可以添加多个箭头

2.7 增加一个端点

  1. jsPlumb.ready(function () {
  2. jsPlumb.addEndpoint('item_left', {
  3. anchors: ['Right']
  4. })
  5. })

2.8 拖动创建连接

设置isSource和isTarget为true时,用户就可以拖动创建连接

  1. <div id="diagramContainer">
  2. <div id="item_left" class="item"></div>
  3. <div id="item_right" class="item" style="left: 150px;"></div>
  4. </div>
  1. <script src="jsplumb.min.js"></script>
  2. <script>
  3. jsPlumb.ready(function () {
  4. jsPlumb.setContainer('diagramContainer')
  5. var common = {
  6. isSource: true,
  7. isTarget: true,
  8. connector: ['Bezier']
  9. }
  10. jsPlumb.addEndpoint('item_left', {
  11. anchors: ['Right']
  12. }, common)
  13. jsPlumb.addEndpoint('item_right', {
  14. anchor: 'Left'
  15. }, common)
  16. jsPlumb.addEndpoint('item_right', {
  17. anchor: 'Right'
  18. }, common)
  19. jsPlumb.draggable('item_left')
  20. jsPlumb.draggable('item_right')
  21. })
  22. </script>

一般情况下,拖动创建的连接,可以再次拖动,让连接断开。如果不想触发这种行为,可以设置:

  1. jsPlumb.importDefaults({
  2. ConnectionsDetachable: false/*设置为false,靠拖动无法取消连接*/
  3. })

2.9 给端点增加样式

  1. jsPlumb.ready(function () {
  2. jsPlumb.setContainer('diagramContainer')
  3. var common = {
  4. isSource: true,
  5. isTarget: true,
  6. connector: 'Straight',
  7. endpoint: 'Dot',
  8. paintStyle: {
  9. fill: 'white',
  10. outlineStroke: 'blue',
  11. strokeWidth: 3
  12. },
  13. hoverPaintStyle: {
  14. outlineStroke: 'lightblue'
  15. },
  16. connectorStyle: {
  17. outlineStroke: 'green',
  18. strokeWidth: 1
  19. },
  20. connectorHoverStyle: {
  21. strokeWidth: 2
  22. }
  23. }
  24. jsPlumb.addEndpoint('item_left', {
  25. anchors: ['Right']
  26. }, common)
  27. jsPlumb.addEndpoint('item_right', {
  28. anchor: 'Left'
  29. }, common)
  30. jsPlumb.addEndpoint('item_right', {
  31. anchor: 'Right'
  32. }, common)
  33. })

2.10 节点改变尺寸

jsplumb实际上是不支持改变大小,实际上只能通过jquery ui的resizable()方法去改变

2.11 限制节点拖动区域(有些问题)

默认情况下,节点可以被拖动到区域外边,如果想只能在区域内拖动,需要设置containment,这样节点就只能在固定区域内移动

  1. <style>
  2. #diagramContainer{
  3. margin-top: 50px;
  4. padding:50px;
  5. width: 500px;
  6. height: 500px;
  7. border: 1px solid red;
  8. }
  9. .item{
  10. width:50px;
  11. height:50px;
  12. border:1px solid black;
  13. position:absolute;
  14. }
  15. </style>
  16. <div id="diagramContainer">
  17. <div id="item_left" class="item"></div>
  18. <div id="item_right" class="item" style="left: 150px;"></div>
  19. </div>
  20. <script src="jquery-3.0.0.js"></script>
  21. <script src="jquery-ui.min.js"></script>
  22. <script src="jquery.jsplumb.js"></script>
  23. <script>
  24. jsPlumb.ready(function () {
  25. jsPlumb.connect({
  26. source: 'item_left',
  27. target: 'item_right',
  28. endpoint: 'Rectangle'
  29. })
  30. jsPlumb.draggable('item_left', {containment: 'parent'})
  31. jsPlumb.draggable('item_right', {containment: 'parent'})
  32. })
  33. </script>

2.12 节点网格对齐

  1. <style>
  2. #diagramContainer {
  3. padding: 20px;
  4. width: 80%;
  5. height: 400px;
  6. border: 1px solid gray;
  7. background-image:
  8. /*背景网格*/
  9. url(http://p3alsaatj.bkt.clouddn.com/20180227163310_1bVYeW_grid.jpeg);
  10. background-repeat: repeat;
  11. }
  12. </style>
  13. <script>
  14. jsPlumb.draggable('item_left', {
  15. containment: 'parent',
  16. grid: [10, 10]/*对齐网格*/
  17. })
  18. </script>

2.13 点击删除连线

  1. // 单点击了连接线,
  2. jsPlumb.bind('click', function (conn, originalEvent) {
  3. if (confirm('确定删除所点击的链接吗?')) {
  4. jsPlumb.detach(conn)
  5. }
  6. })

2.14 删除节点,包括节点相关的连接

  1. // nodeId为节点id, remove方法可以删除节点以及和节点相关的连线
  2. jsPlumb.remove(nodeId)

2.15 通过编码连接endpoint

需要在addEndpoint时,就给该断点加上一个uuid, 然后通过connect()方法,将两个断点链接上。

  1. jsPlumb.addEndpoint(id, {
  2. anchors: 'Top',
  3. uuid: uuid() // 这里需要唯一的一个Id,
  4. }, config)
  5. jsPlumb.connect({ uuids: [fromId, toId] })

参考链接:

jsplumb简单功能介绍

jsPlumb.jsAPI阅读笔记(官方文档翻译)

实战项目链接

https://github.com/wangduanduan/visual-ivr

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/117117
推荐阅读
相关标签
  

闽ICP备14008679号