javascript - RactiveJS 可拖动使用鼠标事件

标签 javascript ractivejs

我正在尝试使用代理事件(on-mousedown、up、move、out)通过 RactiveJS 实现一个简单的可拖动 DIV

正在关注 JSFiddle工作正常,但是当用户移动鼠标太快时拖动停止。这仅仅是因为在我的例子中,鼠标事件处理程序位于 DIV 标记上,而不是正文或文档元素上。我的最终想法是创建一个 slider 组件,但我正在寻求提供最佳用户体验并使它更像 JQuery 的可拖动组件。

模板:

<div class="rect {{drag ? 'dragging' : ''}}" 
         on-mousedown="startDrag"
         on-mouseup="stopDrag" 
         on-mouseout="stopDrag" 
         on-mousemove="drag"
         style="top:{{top}}px; left:{{left}}px;">
</div>

active 实例:

var ractive = new Ractive({
    el: "#content",
    template: "#template",
    data: {left:20,top:80}
});
ractive.on({
    startDrag : function (event) {
        this.set({
            'drag': true,
            'mouseX': event.original.clientX - this.get('left'),
            'mouseY': event.original.clientY - this.get('top')
        });
    },
    stopDrag : function (event) {
        this.set('drag', false);
    },
    drag : function (event) {
        if(this.get('drag')) {
            var x = event.original.clientX, 
                y = event.original.clientY;
            this.set({
                top: y - this.get('mouseY') ,
                left: x - this.get('mouseX')
            });
            event.original.stopPropagation();
        }
    }
})

如何改进上面的代码?

最佳答案

通常 mousemovemouseend 需要在 document 上。我发现在 Ractive 中,装饰器通常更适合拖动。这是一个让你继续前进的例子(http://jsfiddle.net/h9j2hdyj/1/):

<div class="rect noSelect {{ dragging ? 'dragging' : ''}}" 
     decorator='drag:"position"'
     style="{{#position}}top:{{top}}px;left:{{left}}px{{/}}">
</div>

装饰器:

Ractive.decorators.drag = function(node, keypath){

    var ractive = this, initial, begin, startPos;

    node.addEventListener('mousedown', start, false)

    function listenOnDocument(){
        document.addEventListener('mousemove', move, false)
        document.addEventListener('mouseup', unlistenOnDocument, false)
    }

    function unlistenOnDocument(){
        document.removeEventListener('mousemove', move, false)
        document.removeEventListener('mouseup', end, false)
    }

    function start(e){
        begin = { x: e.x, y: e.y }
        startPos = ractive.get(keypath)
        startPos = { x: startPos.left, y: startPos.top }
        ractive.set('dragging', true)
        listenOnDocument()
        e.preventDefault()
        e.stopPropagation()
    }

    function move(e){
        ractive.set(keypath, {
            left: startPos.x + (e.x - begin.x),
            top: startPos.y + (e.y - begin.y)
        })
        e.preventDefault()
        e.stopPropagation()
    }

    function end(){
        unlistenOnDocument()
        ractive.set('dragging', false)
    }

  return {
      update: function(pos){
          console.log(pos)
          position = pos
      },
    teardown: function(){
        node.removeEventListener('mousedown', start, false)
        end()
    }
  }

}

关于javascript - RactiveJS 可拖动使用鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26044799/

相关文章:

javascript - 数组修改在 Ractive JS 中不起作用

javascript - jQuery 对话框中的 Z-index。自动建议列表未正确显示

javascript - jQuery改变嵌套在div、段落标签和强标签中的文本

components - 如何动态创建Ractive的子组件并以编程方式更改它们

javascript - 创建 jquery 对话框 RactiveJS 装饰器

javascript - ractive.js 多个复选框

javascript - 从 CDN 加载 Ace 编辑器

javascript - 使 CSS 网格或 Flex 元素大小相等,并在其之间拉伸(stretch)分隔符

javascript - ng-options 指令不起作用,无法在 angularjs 库中找到它

css - Ractive 是否为 &lt;style&gt; 元素维护单个节点?