如何在jQuery中绑定多个连续事件?

4
我想用jquery绑定多个连续事件。我想要实现以下功能:
点击 - 即mousedown事件 - 现在,如果你在按下鼠标的同时开始移动鼠标,则执行某些函数。
最顺畅的方法是什么?只需在.on()调用中放置一个if,还是有更简单的方法?
1个回答

5

您可以利用 .on().off() 来实现此目的。

var $div = $("div");

var mousemove = function() { ... };

$div.on({
  mousedown: function() {
    $div.on("mousemove", mousemove);
  },
  mouseup: function() {
    $div.off("mousemove", mousemove);
  }
});​

请注意,推荐使用.on().off()方法分别绑定和解绑事件。

您可以查看一个实时示例。


更新

或者,您可以将mouseup事件绑定到document。这样,即使鼠标释放时不在元素上方悬停,也可以检测到鼠标的释放。

var $document = $(document);
var $div = $("div");

var mousemove = function() { ... };

$div.mousedown(function() {
  $div.on("mousemove", mousemove);
})

$document.mouseup(function() {
  $div.off("mousemove", mousemove);
});​

此外,还有一个简写函数可以实现它。我们称之为.drag()函数。
$.fn.drag = function(fn) {
  var $document = $(document);
  return $(this).each(function() {
    var self = this;
    var $this = $(this);
    var mousemove = function() {
      fn.dragging && fn.dragging.call($this);
    };
    $this.mousedown(function() {
      fn.start && fn.start.call($this);
      fn.dragging && $this.on("mousemove", mousemove);
    });
    $document.mouseup(function() {
      fn.dragging && $this.off("mousemove", mousemove);
      fn.stop && fn.stop.call(self);
    });
  });
};

$("div").drag({
  start: function() { ... },
  dragging: function() { ... },
  stop: function() { ... }
});​

你可以在这里实时查看。


1
+1 这段代码写得很好,我认为没有更好的方法来实现 OP 想要达到的目标。 - A. Wolff
2
+1 比我更快。我建议将 mousemove 事件命名为类似于 mousemove.myAction 的名称,以避免与其他可能已附加的侦听器发生冲突;特别是因为这是一个动态附加/移除的事件侦听器。 - maček
如果在释放鼠标按钮时鼠标在拖动元素之外,绑定mouseup事件可能会出现问题。最好在document.mouseup或类似的位置解除绑定。 - Yoshi
1
我修改了你的代码,在 .off() 中包含 , mousemove,这样只有该函数将从 mousemove 事件中解绑。直接使用 .off(mousemove) 将从该事件中解绑每个函数,这可能会在与多个开发人员合作时导致严重问题。 - Cory Danielson
1
我同意一些评论。已相应更新。 - Alexander
mouseleave可能是绑定文档的mouseup的一个很好的替代方案,但我想两者都能实现相同的功能。 - Cory Danielson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接