gpt4 book ai didi

javascript - Bacon.js:使用鼠标选择、拖放以及使用箭头键触摸和移动

转载 作者:行者123 更新时间:2023-11-30 05:32:07 24 4
gpt4 key购买 nike

我们正在编写类似 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 的经验还不够丰富,无法 Hook 事件流以让 keydown 只移动一个元素,而不是所有元素。

最佳答案

我会做这样的事情:

  • 对于每个可移动元素,创建一个选定的流(我猜测来自点击)并将每次点击映射到元素的 ID。
  • 合并所有这些流以创建当前所选元素的属性。
  • keyDown 流映射到增量,向上为 {x: 0, y: -1},我们称它为例如keyDelta
  • 组合 selectedElement 和 keyDelta 流来创建移动事件流,例如{id: 37, delta: {x: 0, y: -1},我们称它为keyDeltas
  • 重构您拖动代码以生成具有相同类型值(id 和 delta)的流
  • 合并 keyDeltas 和拖动流,现在您有一个包含所有对象的所有移动的流
  • 扫描那个流,现在你是一个包含所有对象位置的流
  • 位置流的
  • onValue,做渲染。

关于javascript - Bacon.js:使用鼠标选择、拖放以及使用箭头键触摸和移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26256854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com