Javascript 如何在 jQuery 中监听单击并按住?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4080497/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 10:30:33  来源:igfitidea点击:

How can I listen for a click-and-hold in jQuery?

javascriptjqueryevents

提问by SnickersAreMyFave

I want to be able to fire an event when a user clicks on a button, then holds that click down for 1000 to 1500 ms.

我希望能够在用户单击按钮时触发事件,然后按住该单击 1000 到 1500 毫秒。

Is there jQuery core functionality or a plugin that already enables this?

是否有 jQuery 核心功能或插件可以实现这一点?

Should I roll my own? Where should I start?

我应该自己滚动吗?我应该从哪里开始?

回答by treeface

var timeoutId = 0;

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

Edit: correction per AndyE...thanks!

编辑:根据 AndyE 进行更正...谢谢!

Edit 2: using bind now for two events with same handler per gnarf

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

回答by gnarf

Aircoded (but tested on 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);
})

回答by Tony Smith

I made a simple JQuery plugin for this if anyone is interested.

如果有人感兴趣,我为此做了一个简单的 JQuery 插件。

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

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

回答by Jacob Mattison

Presumably you could kick off a setTimeoutcall in mousedown, and then cancel it in mouseup(if mouseuphappens before your timeout completes).

据推测,您可以在 中开始setTimeout调用mousedown,然后在中取消它mouseup(如果mouseup在超时完成之前发生)。

However, looks like there is a plugin: longclick.

但是,看起来有一个插件:longclick

回答by SnickersAreMyFave

Here's my current implementation:

这是我目前的实现:

$.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);
    });

}

回答by kayz1

    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);

回答by Sergey Semushin

I wrote some code to make it easy

我写了一些代码来简化

//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

在 JSFiddle 上查看

Now you need just to set the time of holding and add clickHoldevent on your element

现在您只需要设置保持时间并clickHold在您的元素上添加事件

回答by KR Vineeth

Try this:

尝试这个:

var thumbnailHold;

    $(".image_thumb").mousedown(function() {
        thumbnailHold = setTimeout(function(){
             checkboxOn(); // Your action Here

         } , 1000);
     return false;
});

$(".image_thumb").mouseup(function() {
    clearTimeout(thumbnailHold);
});