【发布时间】:2014-10-08 12:25:23
【问题描述】:
我们正在编写一个类似 powerpoint 的应用程序,并且我们正在考虑使用 bacon.js。可以将图片、文本等元素拖到屏幕上,然后使用鼠标拖放或触摸事件以及使用箭头键进行选择和移动。
我使用之前的一些指南制作了这个简单的示例,其中包含 2 个可以使用鼠标拖动的 div:http://jsfiddle.net/5y6qqqg2/3/
// allKeyUps :: Observable KeyEvent
var keyDown = $(document)
.asEventStream('keyDown')
.filter(function(ev){
return ev.keyCode==37 ||
ev.keyCode==38 ||
ev.keyCode==39 ||
ev.keyCode==40
}).log()
function xyFromEvent(v) {
return {
x: v.clientX,
y: v.clientY
}
}
function getDelta(t) {
var a = t[1];
var b = t[0];
return {
x: a.x - b.x,
y: a.y - b.y
};
}
function add(p1, p2) {
return {
x: p1.x + p2.x,
y: p1.y + p2.y
};
}
$().ready(function () {
var onMove = $("html").asEventStream('mousemove')
addDraggable($("#1"), onMove);
addDraggable($("#2"), onMove);
});
function addDraggable(block, onMove) {
var startDrag = block.asEventStream('mousedown')
var endDrag = block.asEventStream('mouseup')
var draggingDeltas = startDrag.flatMap(function () {
return onMove.map(xyFromEvent)
.slidingWindow(2, 2)
.map(getDelta)
.takeUntil(endDrag)
})
var blockPosition = draggingDeltas.scan({
x: 0,
y: 0
}, add);
blockPosition.onValue(function (pos) {
block.css({
top: pos.y + "px",
left: pos.x + "px"
});
});
}
但我对 bacon.js 的经验不够,无法为 keydown 挂钩事件流以仅移动一个元素而不是所有元素。
【问题讨论】:
标签: javascript drag-and-drop touch onkeyup bacon.js