【问题标题】:jQuery - How to order timing of dragging and clicking events, sharing the same UI element?jQuery - 如何排序拖动和单击事件的时间,共享相同的 UI 元素?
【发布时间】:2016-05-30 12:31:06
【问题描述】:

我有一个水平滚动的电影。用户应该能够拖动元素以水平滚动以及单击每部电影以打开视频播放器。

问题是,拖动和点击都监听相同的事件监听器: mouse downmouse up(和mouse move用于拖动)

我想实现这个目标:

  1. 当用户快速点击一部电影(1秒内上下鼠标),判断为点击并触发点击回调。
  2. 当用户拖动时(鼠标向下,然后按住鼠标超过 1 秒,然后继续拖动),点击回调被取消并触发拖动回调。

我的代码(如下)使滚动行为像这样,我不想要

  1. 用户完成滚动滚动后,会触发 click 事件以打开电影。

HTML

<ul class="scroll">
    <li><a href="linkToMovie"></a></li>
    <li><a href="linkToMovie"></a></li>
<ul>

JS

var $scroll = (".scroll");
    var $movie = $scroll.children($("movie")

    $scroll.on("mousedown", function(e) {
        e.preventDefault()
        $(this).on("mousemove", function() {
            //drag horizontally
        });
    });
    $scroll.on("mouseup", function(){
        //...
    }); 

    $movie.on("click", function(){
        //open movie
    })

【问题讨论】:

  • 您可以在鼠标按下时设置一个标志,并在拖动/上鼠标时取消设置。鼠标抬起时,检查标志并决定是否执行点击行为。
  • @eran 问题是,点击事件基本上是鼠标按下和鼠标按下事件。当用户点击电影时,事件会监听:点击、鼠标按下、鼠标向上事件。即使是“e.preventDefault()”也无法阻止点击访问所有这些事件。
  • @eran 如果在鼠标打开时我决定不进行点击行为,那么用户将永远无法点击电影。
  • 这就是重点。当鼠标移动时,您决定不这样做,因此手势被解释为拖动。你永远不会在点击时做任何事情,你只会根据你设置的标志在鼠标上做一些事情。

标签: javascript jquery mouseevent settimeout draggable


【解决方案1】:

类似这样的:

var drag = false;
var hold = false;

var $scroll = (".scroll");
var $movie = $scroll.children($("movie")

$scroll.on("mousedown", function(e) {
    e.preventDefault();
    hold = e.target;
    $(this).on("mousemove", function() {
        drag = true;
    });
});

$(document).on("mouseup", function(e) {
    if(!drag && $(hold).is(e.target)){
        //open movie
    }
    hold = false;
    drag = false;
});

【讨论】:

  • 这不起作用。您的代码意味着,一直拖到电影被点击为止。
  • 正确。更新了我的答案,所以它现在应该可以工作了。单击事件与同一元素上的 mouseup/mousedown 事件完全相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
相关资源
最近更新 更多