利用jsPlumb實現基于Html5拖拽連線

jopen 12年前發布 | 65K 次閱讀 jsPlumb 圖表/報表制作

jsPlumb是一個強大的JavaScript連線庫,它可以將html中的元素用箭頭、曲線、直線等連接起來,適用于開發Web上的圖表、建模工具等。它同時支持jQuery+jQuery UI、MooTools和YUI3這三個JavaScript框架,十分強大。大家可以在官網的Demo中看看它的功能。目前可用的jsPlumb中文資料很少,希望這篇教程可以幫助大家更快的了解jsPlumb。出于篇幅考慮,本教程將以jQuery為例介紹jsPlumb。

利用jsPlumb實現基于Html5拖拽連線

瀏覽器兼容性

在使用jsPlumb之前,大家需要先了解一下各瀏覽器對jsPlumb的兼容性。jsPlumb支持IE6以上以及各大瀏覽器,但是仍然有一些bug:

  • 在IE9上,由于jQuery1.6.x和1.7.x的SVG相關實現有一個bug,會導致鼠標停留事件無法響應
  • Safari5.1上有一個SVG的bug,會導致鼠標事件無法通過SVG元素的透明區域傳遞
  • 在Firefox11上基于MooTools使用SVG時會出現一些問題
  • </ul>

    下載和引入

    jsPlumb的源碼和Demo可以在GitHub上下載,不想下載整個工程的可以直接從這里下載1.4.0版本。
    在引入jsPlumb的同時,還需要引入jQuery和jQuery UI。需要說明的是,jsPlumb只兼容jQuery1.3.x及以上版本,并在jQuery UI 1.7.x、1.8.x及1.9.x上測試通過。另外,如果你使用1.7.x、1.8.x的jQuery UI,還需要額外引入jQuery UI Touch Punch。
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js"></script>
    <script type="text/javascript" src="PATH_TO/jquery.jsPlumb-1.4.0-all-min.js "></script>

    初始化

    jsPlumb只有等到DOM初始化完成之后才能使用,因此我們在以下代碼中調用jsPlumb方法
    jsPlumb.ready(function() {
    ...         
    // some code
    ...
    });
    首先,我們給jsPlumb設一些默認值,然后聲明一個exampleDropOptions變量。
    jsPlumb.importDefaults({
        DragOptions : { cursor: 'pointer'}, //拖動時鼠標停留在該元素上顯示指針,通過css控制
        PaintStyle : { strokeStyle:'#666' },//元素的默認顏色
        EndpointStyle : { width:20, height:16, strokeStyle:'#666' },//連接點的默認顏色
        Endpoint : "Rectangle",//連接點的默認形狀
        Anchors : ["TopCenter"]//連接點的默認位置
    });
    var exampleDropOptions = {
        hoverClass:"dropHover",//釋放時指定鼠標停留在該元素上使用的css class
        activeClass:"dragActive"http://可拖動到的元素使用的css class
    };

    添加jsPlumb連接點

    然后聲明兩種類型的連接點。
    var color1 = "#316b31";                       
    var exampleEndpoint1 = {            
        endpoint:["Dot", { radius:11 }],//設置連接點的形狀為圓形
        paintStyle:{ fillStyle:color1 },//設置連接點的顏色
        isSource:true,  //是否可以拖動(作為連線起點)
        scope:"green dot",//連接點的標識符,只有標識符相同的連接點才能連接
        connectorStyle:{ strokeStyle:color1, lineWidth:6 },//連線顏色、粗細
        connector: ["Bezier", { curviness:63 } ],//設置連線為貝塞爾曲線
        maxConnections:1,//設置連接點最多可以連接幾條線
        isTarget:true,  //是否可以放置(作為連線終點)
        dropOptions : exampleDropOptions//設置放置相關的css
    };
    
    var color2 = "rgba(229,219,61,0.5)";
    var exampleEndpoint2 = {
        endpoint:"Rectangle",   //設置連接點的形狀為矩形
        anchor:"BottomLeft",    //設置連接點的位置,左下角
        paintStyle:{ fillStyle:color2, opacity:0.5 },   //設置連接點的顏色、透明度
        isSource:true,  //同上
        scope:'yellow dot', //同上
        connectorStyle:{ strokeStyle:color2, lineWidth:4},//同上
        connector : "Straight", //設置連線為直線
        isTarget:true,  //同上
        maxConnections:3,//同上
        dropOptions : exampleDropOptions,//同上
        beforeDetach:function(conn) {   //綁定一個函數,在連線前彈出確認框
            return confirm("Detach connection?");
        },
        onMaxConnections:function(info) {//綁定一個函數,當到達最大連接個數時彈出提示框
            alert("Cannot drop connection " + info.connection.id + " : maxConnections has been reached on Endpoint " + info.endpoint.id);
        }
    };

    將連接點綁定到html元素上

    var anchors = [[1, 0.2, 1, 0], [0.8, 1, 0, 1], [0, 0.8, -1, 0], [0.2, 0, 0, -1] ],
        maxConnectionsCallback = function(info) {
            alert("Cannot drop connection " + info.connection.id + " : maxConnections has been reached on Endpoint " + info.endpoint.id);
        };
    
    
    var e1 = jsPlumb.addEndpoint("state2", { anchor:"LeftMiddle" }, exampleEndpoint1);//將exampleEndpoint1類型的點綁定到id為state2的元素上
    e1.bind("maxConnections", maxConnectionsCallback);//也可以在加到元素上之后綁定函數
    
    jsPlumb.addEndpoint("state1", exampleEndpoint1);//將exampleEndpoint1類型的點綁定到id為state1的元素上
    jsPlumb.addEndpoint("state3", exampleEndpoint2);//將exampleEndpoint2類型的點綁定到id為state3的元素上
    jsPlumb.addEndpoint("state1", {anchor:anchors}, exampleEndpoint2);//將exampleEndpoint2類型的點綁定到id為state1的元素上,指定活動連接點

    需要注意的是連接點分為動態連接點和靜態連接點。當指定一個數組作為連接點時,該連接點為動態連接點,連線時會自動選擇最近的連接點連接;當指定一個坐標或者固定位置(TopRight、RightMiddle等)作為連接點時,該連接點為靜態連接點,不管怎么連線都不會移動。具體可參見官方文檔

    Html和CSS代碼

    <body>
    <div id="state1" class="item"></div>
    <div id="state2" class="item"></div>
    <div id="state3" class="item"></div>
    </body>
    html部分僅聲明三個div,注意,jsPlumb通過id來識別html元素,因此如果要使用jsPlumb連線必須聲明id。
    <style type="text/css">
        .dragActive { border:2px dotted orange; }   //當拖動一個連接點時,可連接的連接點會自動使用該css
            .dropHover { border:1px dotted red; }       //當拖動一個連接點到可連接的點時,該點會自動使用該css
            .item {
                border: 1px solid black;
                background-color: #ddddff;
                width: 100px;
                height: 100px;
                position: absolute;
            }
    
            #state1 {
                left: 100px;
                top: 100px;
            }
    
            #state2 {
                left: 250px;
                top: 250px;
            }
    
            #state3 {
                left: 100px;
                top: 250px;
            }
    </style>



    最終效果

    到此我們就完成了一個簡單的jsPlumb連線示例,大家可以在瀏覽器中運行一下看看效果。源碼可以在這里下載。
    利用jsPlumb實現基于Html5拖拽連線

    進一步學習

    本文中的例子參考了Emiel的教程Getting started with jsPlumb以及官方Demo DraggableConnections,大家也可以看一看。
    由于篇幅限制,本文并未對jsPlumb的所有特性及功能進行說明,大家可以通過官網進行更深入的學習。不過個人認為官方文檔比較難讀,建議大家可以結合官網的Demo學習,Demo源碼可以在GitHub上下載到。




 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!