【问题标题】:Bacon.js: select, drag-drop with mouse and touch and move using arrow keysBacon.js:用鼠标选择、拖放,用箭头键触摸和移动
【发布时间】: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


    【解决方案1】:

    我会这样做:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多