赞
踩
// https://blog.csdn.net/fanlc8888/article/details/124381397
var myInstance = jsPlumb.getInstance(options)
options {
Anchor / Anchors: []
}
内置连接点位置方向定义 String
Bottom: 底边中间,方向朝下,BottomCenter 的替代者
Top: 顶边中间,方向朝上,TopCenter 的替代者
Left: 左边中间,方向朝左,LeftMiddle 的替代者
Right: 右边中间,方向朝右,RightMiddle 的替代者
BottomLeft: 左下角,方向朝左下
BottomRight: 右下角,方向朝右下
TopLeft: 左上角,方向朝左上
TopRight: 右上角,方向朝右上
Center: 元素中心,方向任意
AutoDefault: 根据连线终点位置,自动从 Top, Right, Bottom, Left 中选择
Continuous: 类似 AutoDefault,待研究
ContinuousBottom: 类似 Bottom,待研究
ContinuousTop: 类似 Top,待研究
ContinuousLeft: 类似 Left,待研究
ContinuousRight: 类似 Right,待研究
Perimeter: 跟踪某些形状周长的锚点,用给定的锚点位置去逼近它,待研究
自定义连接点位置方向定义
Array
[x, y, dx, dy, ox, oy]
Anchor: 'Bottom'
// or
Anchors: ['Bottom', 'Left', [1, 0.3, 1, 0]]
有四种:
// 使用默认配置可简写为
overlays: ['Arrow']
// 要调整配置则需写为:
overlays: [['Arrow', { width: 30 }]]
// 多个一起用:
overlays: [['Arrow', { location: 0.7 }], 'Diamond', ['Arrow', { location: 0.3, direction: -1 }]]
// 多个一起用时可抽取公共配置:
var arrowCommon = { foldback: 0.7, fill: color, width: 14 };
// ...
overlays: [['Arrow', { location: 0.7 }, arrowCommon], ['Arrow', { location: 0.3, direction: -1 }, arrowCommon]]
// ...
String,连接点类型,可用类型如下:
Dot: 圆
Rectangle: 矩形
Triangle: 三角形
Image: 图片
Blank: 空
Object | Array,连接点样式,有以下属性(svg 有的属性基本都有):
stroke: 边线颜色
strokeWidth: 边线宽度
fill: 填充颜色
radius: 半径,Dot 专用,默认 10
width: 宽度,Rectangle、Triangle 可用,默认分别为:20、55
height: 高度,Rectangle、Triangle 可用,默认分别为:20、55
src: 图片路径,Image 必选
// 使用默认配置
Connector: 'Flowchart'
// 使用自定义配置
Connector: ['Flowchart', { stub: [10, 20], gap: 10, cornerRadius: 5 }]
待研究 默认为 _jsPlumb_Default_Scope
拖放配置,待研究,在 connect makeTarget addEndpoint 方法中用到
jsPlumb.connect(config) return connection
source String,Object,Endpoint 是 连线源的标识,可以是id, element, 或者Endpoint
target String,Object,Endpoint 是 连线目标的标识,可以是id, element, 或者Endpoint
endpoint String 可选 端点类型,形状
<div id="diagramContainer"> <div id="item_left" class="item"></div> <div id="item_right" class="item" style="margin-left:50px;"></div> </div> <script src="https://cdn.bootcss.com/jsPlumb/2.6.8/js/jsplumb.min.js"></script> <script> /* global jsPlumb */ jsPlumb.ready(function () { jsPlumb.connect({ source: 'item_left', target: 'item_right', endpoint: 'Dot' }) }) </script>
<div id="diagramContainer"> <div id="item_left" class="item"></div> <div id="item_right" class="item" style="left:150px;"></div> </div> <script src="https://cdn.bootcss.com/jsPlumb/2.6.8/js/jsplumb.min.js"></script> <script> /* global jsPlumb */ jsPlumb.ready(function () { jsPlumb.connect({ source: 'item_left', target: 'item_right', endpoint: 'Rectangle' }) jsPlumb.draggable('item_left') jsPlumb.draggable('item_right') }) </script>
整个节点作为source或者target, 并且将锚点设置成Continuous,那么锚点就会随着节点的位置改变而改变自己的位置。
jsPlumb的锚点分为四类
window.jsPlumb.ready(function () { var jsPlumb = window.jsPlumb jsPlumb.makeSource('A', { endpoint:"Dot", anchor: "Continuous" }) jsPlumb.makeTarget('B', { endpoint:"Dot", anchor: "Continuous" }) jsPlumb.draggable('A') jsPlumb.draggable('B') })
jsplumb实际上不支持改变节点大小,实际上只能通过jquery ui resizable 方法去改变。
<div id="diagramContainer"> <div id="item_left" class="item"></div> <div id="item_right" class="item" style="left:150px;"></div> </div> <script src="https://code.jquery.com/jquery-1.11.3.js"></script> <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> <script src="./lib/jquery.jsplumb.js"></script> <script> /* global jsPlumb, $ */ $('.item').resizable({ resize: function (event, ui) { jsPlumb.repaint(ui.helper) } }) jsPlumb.ready(function () { jsPlumb.connect({ source: 'item_left', target: 'item_right', endpoint: 'Rectangle' }) jsPlumb.draggable('item_left') jsPlumb.draggable('item_right') }) </script>
默认情况下,节点可以被拖动到区域外边,如果想只能在区域内拖动,需要设置containment,这样节点只能在固定区域内移动。
网格对齐实际上是设置了grid属性,使移动只能按照固定的尺寸移动。然后用一张图作为背景铺开作为网格来实现的。
#diagramContainer {
padding: 20px;
width: 80%;
height: 400px;
border: 1px solid gray;
background-image: url(xxx.jpeg);
background-repeat: repeat;
}
jsPlumb.draggable('item_left', {
containment: 'parent',
grid: [10, 10]
})
注意remove方法有些情况下是无法删除干净连线的,查看详情:https://jsplumbtoolkit.com/community/doc/removing.html
// nodeId为节点id, remove方法可以删除节点以及和节点相关的连线
console.log('3 秒后移除左边节点包括它的连线')
setTimeout(function () {
jsPlumb.remove('item_left')
}, 3000)
jsPlumb.connect({
source: 'item_left',
target: 'item_right',
paintStyle: { stroke: 'lightgray', strokeWidth: 3 },
endpointStyle: { fill: 'lightgray', outlineStroke: 'darkgray', outlineWidth: 2 }
}, common)
<div id="diagramContainer"> <div id="item_left" class="item"></div> <div id="item_right" class="item" style="left:150px;"></div> </div> <script src="https://cdn.bootcss.com/jsPlumb/2.6.8/js/jsplumb.min.js"></script> <script> /* global jsPlumb */ jsPlumb.ready(function () { jsPlumb.connect({ source: 'item_left', target: 'item_right', endpoint: 'Rectangle', connector: ['Bezier'], anchor: ['Left', 'Right'] }) jsPlumb.draggable('item_left') jsPlumb.draggable('item_right') }) </script>
箭头长宽 width,length
箭头位置 location: 0.5 加在线的正中间
类型
jsPlumb.connect({
source: 'item_left',
target: 'item_right',
paintStyle: { stroke: 'lightgray', strokeWidth: 3 },
endpointStyle: { fill: 'lightgray', outlineStroke: 'darkgray', outlineWidth: 2 },
overlays: [ ['Arrow', { width: 12, length: 12, location: 0.5 }] ]
}, common)
<script> /* global jsPlumb */ jsPlumb.ready(function () { var common = { endpoint: 'Rectangle', connector: ['Bezier'], anchor: ['Left', 'Right'] } jsPlumb.connect({ source: 'item_left', target: 'item_right' }, common) jsPlumb.draggable('item_left') jsPlumb.draggable('item_right') }) </script>
jsPlumb.ready(function () {
jsPlumb.addEndpoint('item_left', {
anchors: ['Right']
})
})
if (configMap[name].Endpoint.type === 'anchor') { // 单个锚点 // 给节点添加锚点 this.jsPlumbInstance.addEndpoint('node-' + id, { anchor: configMap[name].Endpoint.key, overlay: [ ['Arrow', { width: 5, length: 2, location: 1, direction: 1, foldback: 0.623 }] ] }, this.commonLink) } else { // 多个锚点 configMap[name].Endpoint.key.forEach(item => { this.jsPlumbInstance.addEndpoint('node-' + id, { anchor: item, overlay: [ ['Arrow', { width: 5, length: 2, location: 1, direction: 1, foldback: 0.623 }] ] }, this.commonLink) }) }
默认情况下,maxConnections的值是1,也就是一个端点最多只能拉出一条连线。
你也可以设置成其他值,例如5,表示最多可以有5条连线。
如果你想不限制连线的数量,那么可以将该值设置为-1
var common = {
isSource: true,
isTarget: true,
connector: ['Straight'],
maxConnections: -1
}
jsPlumb.addEndpoint('item_left', {
anchors: ['Right']
}, common)
如果你将isSource和isTarget设置成true,那么久可以用户在拖动时,自动创建链接。
jsPlumb.ready(function () { jsPlumb.setContainer('diagramContainer') var common = { isSource: true, isTarget: true, connector: ['Straight'] } jsPlumb.addEndpoint('item_left', { anchors: ['Right'] }, common) jsPlumb.addEndpoint('item_right', { anchor: 'Left' }, common) jsPlumb.addEndpoint('item_right', { anchor: 'Right' }, common) })
一般来说拖动创建的链接,可以再次拖动,让链接断开。如果不想触发这种行为,可以设置。
jsPlumb.importDefaults({
ConnectionsDetachable: false
})
通过设置各种 *Style来改变链接或者端点的样式。
jsPlumb.ready(function () { jsPlumb.setContainer('diagramContainer') var common = { isSource: true, isTarget: true, connector: 'Straight', endpoint: 'Dot', paintStyle: { fill: 'white', outlineStroke: 'blue', strokeWidth: 3 }, hoverPaintStyle: { outlineStroke: 'lightblue' }, connectorStyle: { outlineStroke: 'green', strokeWidth: 1 }, connectorHoverStyle: { strokeWidth: 2 } } jsPlumb.addEndpoint('item_left', { anchors: ['Right'] }, common) jsPlumb.addEndpoint('item_right', { anchor: 'Left' }, common) jsPlumb.addEndpoint('item_right', { anchor: 'Right' }, common) })
endpoint: String,端点 uuid 或 Endpoint(可通过 getEndpoint 方法获取)
doNotRepaintAfterwards: Boolean,是否重新绘制所有内容,默认 false,选填
fn: Function,给定函数
doNotRepaintAfterwards: Boolean,如果传 true,则在运行给定的函数后不会运行重绘
// 请单点击一下连接线,
jsPlumb.bind('click', function (conn, originalEvent) {
if (window.prompt('确定删除所点击的链接吗? 输入1确定') === '1') {
jsPlumb.detach(conn)
}
})
el: String | Element,选择器或 DOM
params: Object,创建配置,有以下属性:
endpoint: String | Array,端点配置
parent: String | Element,选择器或 DOM。建立连接时添加端点的元素,如果省略,端点将被添加到el
scope: String,从此元素出发的连接线的连接的范围
dragOptions: Object,拖动配置
… 更多配置待研究
el: String | Element,选择器或 DOM
params: Object,创建配置,有以下属性:
endpoint: String | Array,端点配置
parent: String | Element,选择器或 DOM。建立连接时添加端点的元素,如果省略,端点将被添加到el
scope: String,从此元素出发的连接线的连接的范围
dragOptions: Object,拖动配置
… 更多配置待研究
stop: function(event) {
// event.el 拖动元素
// event.finalPos 结束时的位置,[x, y]
}
{
connection: 新连接,可以注册监听
sourceId: 连接的源元素id
targetId: 连接的目标元素id
source: 连接的源元素
target: 连接的目标元素
sourceEndpoint: 连接的源端点
targetEndpoint: 连接的目标端点
}
{
connection: 已分离的连接
sourceId: 分离之前连接的源元素id
targetId: 分离之前连接的目标元素id
source: 分离之前连接的源元素
target: 分离之前连接的目标元素
sourceEndpoint: 分离之前连接的源端点
targetEndpoint: 分离之前连接的目标端点
}
{
index: 源端点为0,目标端点为1
originalSourceId: 移动前连接的源元素id
newSourceId: 移动后连接的源元素id
originalTargetId: 移动前连接的目标元素id
newTargetId: 移动后连接的目标元素id
originalSourceEndpoint: 移动前的源端点
newSourceEndpoint: 移动后的源端点
originalTargetEndpoint: 移动前的目标端点
newTargetEndpoint: 移动后的目标端点
}
注:当此事件触发时,连接的目标端点是jsPlumb用于拖动的瞬态元素,随后在建立或中止连接时将从DOM中删除。
有时候当用户从A端点链接到B端点时,需要做一些检查,如果不符合条件,就不让链接建立。
{
sourceId: 连接的源元素id
targetId: 连接的目标元素id
scope: 连接的范围
connection: 实际的Connection对象。可以访问Connection中的“端点”数组,以获取连接中涉及的端点,但注意,在拖动连接时,目标端点将始终是仅在拖动的生命周期内存在的瞬态端点。要获取正在删除的连接端点,请使用dropEndpoint。
dropEndpoint: 这是删除连接的实际端点。可能为null,因为如果在已调用makeTarget的元素上删除Connection,则不会设置它
targetEndpoint: 分离之前Connection中的目标端点
}
// 当链接建立前
jsPlumb.bind('beforeDrop', function (info) {
var a = 10
var b = 2
if (a < b) {
console.log('链接会自动建立')
return true // 链接会自动建立
} else {
console.log('链接取消')
return false // 链接不会建立,注意,必须是false
}
})
window.jsPlumb.ready(function () { var jsPlumb = window.jsPlumb jsPlumb.setContainer("diagramContainer") jsPlumb.connect({ source: 'A', target: 'B', endpoint: 'Dot' }) var baseZoom = 1 setInterval(() => { baseZoom -= 0.1 if (baseZoom < 0.5) { baseZoom = 1 } zoom(baseZoom) }, 1000) }) function zoom (scale) { $("#diagramContainer").css({ "-webkit-transform": `scale(${scale})`, "-moz-transform": `scale(${scale})`, "-ms-transform": `scale(${scale})`, "-o-transform": `scale(${scale})`, "transform": `scale(${scale})` }) jsPlumb.setZoom(0.75); }
jsPlumb.addEndpoint('item_left', {
anchors: ['Right'],
uuid: 'fromId'
})
jsPlumb.addEndpoint('item_right', {
anchors: ['Left'],
uuid: 'toId'
})
console.log('3 秒后建立连线')
setTimeout(function () {
jsPlumb.connect({ uuids: ['fromId', 'toId'] })
}, 3000)
jsPlumb的配置项有很多,如果你不主动去设置,那么jsPlumb就使用默认的配置。
另外建议你不要修改默认的配置,而是使用自定义的方式。
另外一点要注意,如果你想修改默认配置,那么使用importDefaults方法,并且属性的首字母要大写。如果你用addEndpoint, 并使用类似maxConnections的属性,那么首字母要小写。
var common = {
isSource: true,
isTarget: true,
connector: ['Straight'],
maxConnections: -1
}
jsPlumb.addEndpoint('item_left', {
anchors: ['Right']
}, common)
{ Anchor : "BottomCenter", // 锚点,即端点链接的位置 Anchors : [ null, null ], // 多个锚点 [源锚点,目标锚点]. ConnectionsDetachable : true, // 节点是否可以用鼠标拖动使其断开,默认为true。即用鼠标链接上的连线,也可以使用鼠标拖动让其断开。设置成false,可以让其拖动也不会自动断开。 ConnectionOverlays : [], // 链接遮罩层 Connector : "Bezier", // 链接 Container : null, // 连线的容器 DoNotThrowErrors : false, // 是否抛出错误 DragOptions : { }, // 拖动设置 DropOptions : { }, // 拖放设置 Endpoint : "Dot", // 端点 Endpoints : [ null, null ], // 数组形式的,[源端点,目标端点] EndpointOverlays : [ ], // 端点遮罩层 EndpointStyle : { fill : "#456" }, // 端点样式 EndpointStyles : [ null, null ], // [源端点样式,目标端点样式] EndpointHoverStyle : null, // 端点鼠标经过的样式 EndpointHoverStyles : [ null, null ], // [源端点鼠标经过样式,目标端点鼠标经过样式] HoverPaintStyle : null, // 鼠标经过链接线时的样式 LabelStyle : { color : "black" }, // 标签样式 LogEnabled : false, // 是否启用日志 Overlays : [ ], // 连接线和端点的遮罩层样式 MaxConnections : 1, // 端点最大连接线数量默认为1, 设置成-1可以表示无数个链接 PaintStyle : { strokeWidth : 8, stroke : "#456" }, // 连线样式 ReattachConnections : false, // 端点是否可以再次重新链接 RenderMode : "svg", // 渲染模式,默认是svg Scope : "jsPlumb_DefaultScope" // 作用域,用来区分哪些端点可以链接,作用域相同的可以链接 }
你也可以从jsPlumb.Defaults对象中查看默认的配置。如果你想要更加个性化的设置连线,那么最好可以了解一下,它的默认设置有哪些,从而方便的来完成自己的设计需求。
// 可以使用importDefaults,来重写某些默认设置
jsPlumb.importDefaults({
PaintStyle : {
strokeWidth:13,
stroke: 'rgba(200,0,0,0.5)'
},
DragOptions : { cursor: "crosshair" },
Endpoints : [ [ "Dot", { radius:7 } ], [ "Dot", { radius:11 } ] ],
EndpointStyles : [{ fill:"#225588" }, { fill:"#558822" }]
});
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。