您的规格限制了您的选择。
您需要包含实时选择和文本输入元素的可拖动 div。
我会尝试这种组合:
如果您有野心,请使用 SVG 曲线作为连接器;)
备选方案#1:D3。
如果您愿意通过学习曲线,d3 是一个非常好的用于流程图的 SVG 基础架构(带有连接器的灵活数据元素)。每个 d3 元素(=您的流程图块)都可以侦听鼠标和键盘事件,但 d3 没有组合框或文本元素——您必须自己编写这些代码。组合框/文本输入的快捷方式是在需要输入时使用 CSS 将 html 选择/文本元素放置在 d3 元素上。
备选方案#2:KineticJS(或您喜欢的其他画布库)
KineticJS 为您提供开箱即用的块元素(矩形)和连接器(折线)。但同样,输入是有限的。但动力学元素非常灵活。将 Kinetic 元素与老式浏览器事件结合起来也可以。
下面是让 KineticJS 监听用户的键盘事件并显示文本的起始代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Prototype</title>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v4.7.2.min.js"></script>
<style>
body{padding:20px;}
#container{
border:solid 1px #ccc;
margin-top: 10px;
width:350px;
height:350px;
}
</style>
<script>
$(function(){
var stage = new Kinetic.Stage({
container: 'container',
width: 350,
height: 350
});
var layer = new Kinetic.Layer();
stage.add(layer);
// this variable holds the current text
var typedText="";
// create a text object
var text = new Kinetic.Text({
x: 20,
y: 30,
fontSize: 30,
text: "",
fontFamily: 'Calibri',
fill: 'green'
});
layer.add(text);
layer.draw();
// listen for keys
// get the usual "printable" keys
$(document).on('keypress',(function(e){
// get the key
key=e.which;
// let keydown handle control keys
if(key<32){return;}
// add the typed character
typedText+=String.fromCharCode(e.charCode);
text.setText(typedText);;
layer.drawScene();
}));
// handle control keys like backspace
$(document).on('keydown',(function(e){
// get the key
var key=event.which;
// Let keypress handle displayable characters
if(key>46){ return; }
// handle the backspace
// (and any other control keys you want to program)
switch(key){
case 8: //backspace:
if(typedText.length>0){
typedText=typedText.slice(0,-1);
text.setText(typedText);;
layer.drawScene();
}
break;
default:
break;
}
}));
}); // end $(function(){});
</script>
</head>
<body>
<p>Type...(and use the backspace)!</p>
<div id="container"></div>
</body>
</html>