将“dragstart”事件附加到“mouseup”以获得可拖动体验

Posted

技术标签:

【中文标题】将“dragstart”事件附加到“mouseup”以获得可拖动体验【英文标题】:Attach "dragstart" event to "mouseup" to obtain draggable experience 【发布时间】:2017-12-30 03:02:40 【问题描述】:

寻找在“mouseup”事件后拖动元素的解决方案。

如您所知,当它收到“mousedown”和“mousemove”事件时会发生拖动。

如何通过“mouseup”事件实现拖动? (什么时候实现点击)?

https://codepen.io/pklauzinski/pen/rxroyL

// Implement drag and drop for the image
$('.box').on('mousedown', function(e) 
    var $this = $(this),
        $window = $(window),
        mouseX = e.pageX,
        mouseY = e.pageY,
        width = $this.outerWidth(),
        height = $this.outerHeight()
        elemX = $this.offset().left + width - mouseX,
        elemY = $this.offset().top + height - mouseY;

    e.preventDefault();
    $window.on('mousemove.drag', function(e2) 
        $this.offset(
            left: e2.pageX + elemX - width,
            top: e2.pageY + elemY - height
        );
    ).one('mouseup', function() 
        $window.off('mousemove.drag');
    );
);

【问题讨论】:

问题是为什么?对于大多数用户来说,这是出乎意料的行为,您将如何停止拖动? 我会停止拖动“mousedown”。 但是当鼠标再次释放时,它是一个点击,并且拖动又重新开始了。除非按下鼠标按钮,否则总是可以拖动某些东西似乎很奇怪。 这似乎与以下内容重复:***.com/questions/13518371/… 该问题的答案中的解决方案对我有用 jquery ui drag element without keeping mouse button down (follow the cursor)的可能重复 【参考方案1】:

您始终可以使用$('.box').on('click', function(e) 方法...可以做到这一点,但请记住,您必须在单击或双击时添加另一个以禁用,此外,这是一种非常奇怪的行为

我的意思的示例解释

// Implement drag and drop for the image
$('.box').on('click', function(e) 
  var $this = $(this),
      $window = $(window),
      mouseX = e.pageX,
      mouseY = e.pageY,
      width = $this.outerWidth(),
      height = $this.outerHeight()
      elemX = $this.offset().left + width - mouseX,
      elemY = $this.offset().top + height - mouseY;

  e.preventDefault();
  $window.on('mousemove.drag', function(e2) 
      $this.offset(
          left: e2.pageX + elemX - width,
          top: e2.pageY + elemY - height
      );
  ).one('mousedown', function() 
      $window.off('mousemove.drag');
  );
);

这就是我的做法

// Implement drag and drop for the image
$('.box').on('mousedown', function(e) 
  var $this = $(this),
      $window = $(window),
      mouseX = e.pageX,
      mouseY = e.pageY,
      width = $this.outerWidth(),
      height = $this.outerHeight()
      elemX = $this.offset().left + width - mouseX,
      elemY = $this.offset().top + height - mouseY;

  e.preventDefault();
  $window.on('mousemove.drag', function(e2) 
      $this.offset(
          left: e2.pageX + elemX - width,
          top: e2.pageY + elemY - height
      );
  ).one('click', function() 
      $window.off('mousemove.drag');
  );
);

【讨论】:

以上是关于将“dragstart”事件附加到“mouseup”以获得可拖动体验的主要内容,如果未能解决你的问题,请参考以下文章

在jQuery中同时拥有mousedown / mouseup和dblclick

如何检索 mousedown 到 mouseup 事件之间的所有鼠标坐标

vb.net中对mouseUp事件的疑惑

向 SWT.MouseUp 的 Shell 添加侦听器不起作用

在对象外部开始单击时防止 MouseUp

绑定原生 html5 dragstart 事件处理程序并使用 jQuery 访问 dataTransfer