2010-11-02 99 views
103

我想在用户点击一个按钮时触发一个事件,然后保持点击1000到1500毫秒。如何在jQuery中监听点击并按住?

是否有jQuery的核心功能或插件,已经启用了这个?

我应该推出自己的?我应该从哪里开始?

+0

可能重复[Long in JavaScript?](http://stackoverflow.com/questions/2625210/long-press-in-javascript) – 2014-06-11 20:11:33

+0

'taphold'怎么样? – Roshdy 2015-05-03 18:08:48

回答

148
var timeoutId = 0; 

$('#myElement').on('mousedown', function() { 
    timeoutId = setTimeout(myFunction, 1000); 
}).on('mouseup mouseleave', function() { 
    clearTimeout(timeoutId); 
}); 

编辑:每个AndyE的更正...谢谢!

编辑2:使用绑定现在用相同的处理每gnarf两个事件

+3

更新更好,但您也可以考虑清除'mouseleave'处理程序中的时间间隔。 – 2010-11-02 17:52:40

+4

对于mouseup/mouseleave,您可以使用相同的函数:'.bind('mouseup mouseleave',function(){' – gnarf 2010-11-08 20:07:56

+0

@gnarf好点!我编辑它以包含您的建议。 – treeface 2010-11-08 21:47:00

5

想必你可以在mousedown揭开序幕setTimeout呼叫,然后(您超时完成之前,如果mouseup情况),在mouseup取消。

但是,貌似有一个插件:longclick

+4

链接已死亡 – 2015-05-16 01:31:14

1

这里是我当前的实现:

$.liveClickHold = function(selector, fn) { 

    $(selector).live("mousedown", function(evt) { 

     var $this = $(this).data("mousedown", true); 

     setTimeout(function() { 
      if ($this.data("mousedown") === true) { 
       fn(evt); 
      } 
     }, 500); 

    }); 

    $(selector).live("mouseup", function(evt) { 
     $(this).data("mousedown", false); 
    }); 

} 
13

Aircoded(但this fiddle测试)

(function($) { 
    function startTrigger(e) { 
     var $elem = $(this); 
     $elem.data('mouseheld_timeout', setTimeout(function() { 
      $elem.trigger('mouseheld'); 
     }, e.data)); 
    } 

    function stopTrigger() { 
     var $elem = $(this); 
     clearTimeout($elem.data('mouseheld_timeout')); 
    } 


    var mouseheld = $.event.special.mouseheld = { 
     setup: function(data) { 
      // the first binding of a mouseheld event on an element will trigger this 
      // lets bind our event handlers 
      var $this = $(this); 
      $this.bind('mousedown', +data || mouseheld.time, startTrigger); 
      $this.bind('mouseleave mouseup', stopTrigger); 
     }, 
     teardown: function() { 
      var $this = $(this); 
      $this.unbind('mousedown', startTrigger); 
      $this.unbind('mouseleave mouseup', stopTrigger); 
     }, 
     time: 750 // default to 750ms 
    }; 
})(jQuery); 

// usage 
$("div").bind('mouseheld', function(e) { 
    console.log('Held', e); 
}) 
+0

如何选择不同颜色的文本,当我们点击并按住设备 – Lucky 2013-10-22 06:16:43

1
var _timeoutId = 0; 

    var _startHoldEvent = function(e) { 
     _timeoutId = setInterval(function() { 
     myFunction.call(e.target); 
     }, 1000); 
    }; 

    var _stopHoldEvent = function() { 
     clearInterval(_timeoutId); 
    }; 

    $('#myElement').on('mousedown', _startHoldEvent).on('mouseup mouseleave', _stopHoldEvent); 
7

我做了一个简单的jQuery插件这如果有人有兴趣。

http://plugins.jquery.com/pressAndHold/

+0

不错的。能够修改这个检测到一个对象被拖动以便移除告诉用户拖动该对象的消息。 – Starfs 2016-10-13 19:12:06

0

我写了一些代码,以方便

//Add custom event listener 
 
$(':root').on('mousedown', '*', function() { 
 
    var el = $(this), 
 
     events = $._data(this, 'events'); 
 
    if (events && events.clickHold) { 
 
     el.data(
 
      'clickHoldTimer', 
 
      setTimeout(
 
       function() { 
 
        el.trigger('clickHold') 
 
       }, 
 
       el.data('clickHoldTimeout') 
 
      ) 
 
     ); 
 
    } 
 
}).on('mouseup mouseleave mousemove', '*', function() { 
 
    clearTimeout($(this).data('clickHoldTimer')); 
 
}); 
 

 
//Attach it to the element 
 
$('#HoldListener').data('clickHoldTimeout', 2000); //Time to hold 
 
$('#HoldListener').on('clickHold', function() { 
 
    console.log('Worked!'); 
 
});
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 
 
<img src="http://lorempixel.com/400/200/" id="HoldListener">

See on JSFiddle

现在,你只需要设置的举行时间,并添加clickHold事件上你的元素