首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bacon.js:选择,用鼠标拖拽,用箭头键触摸和移动。

Bacon.js:选择,用鼠标拖拽,用箭头键触摸和移动。
EN

Stack Overflow用户
提问于 2014-10-08 12:25:23
回答 1查看 517关注 0票数 2

我们正在编写一个类似powerpoint的应用程序,我们正在考虑使用bacon.js。有些元素,如图片、文本等,可以拖到屏幕上,然后选择,使用鼠标拖动或触摸事件移动,并使用箭头键。

我使用以前的一些指南制作了这个简单的示例,使用鼠标:http://jsfiddle.net/5y6qqqg2/3/可以拖动2个div。

代码语言:javascript
复制
// 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只移动一个元素,而不是所有元素。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-09 08:05:58

我会这样做:

  • 对于每个可移动的元素,创建一个选定的流(来自我猜测的单击),并将每次单击映射到元素的id。
  • 合并所有这些流以创建当前选定元素的属性。
  • keyDown流映射到三角洲,如果它是{x: 0, y: -1},让我们称之为keyDelta
  • 将selectedElement和keyDelta流组合起来创建一个移动事件流,例如{id: 37, delta: {x: 0, y: -1},让我们称之为keyDeltas
  • 重构拖动代码以生成具有相同类型值的流(id & delta)
  • 合并keyDeltas并拖动流,现在有一个包含所有对象所有移动的单一流
  • 扫描该流,现在您将得到一个包含所有对象位置的流。
  • 位置流的onValue,执行呈现。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26256854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档