jQuery에서 클릭 앤 홀드를 수신하려면 어떻게해야합니까?


116

사용자가 버튼을 클릭 할 때 이벤트를 발생시키고 1000 ~ 1500ms 동안 클릭을 유지하고 싶습니다.

이미 이것을 가능하게하는 jQuery 핵심 기능이나 플러그인이 있습니까?

내가 직접 굴려야하나요? 어디서부터 시작해야하나요?



'taphold'는 어떻습니까 ??
Roshdy

답변:


173
var timeoutId = 0;

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

편집 : AndyE 별 수정 ... 감사합니다!

편집 2 : gnarf 당 동일한 처리기로 두 이벤트에 지금 bind 사용


4
업데이트가 더 좋지만 mouseleave핸들러 에서 간격을 지우는 것도 고려할 수 있습니다 .
Andy E

5
mouseup / mouseleave에도 동일한 기능을 사용할 수 있습니다..bind('mouseup mouseleave', function() {
gnarf

@gnarf 좋은 지적! 귀하의 제안을 포함하도록 편집했습니다.
treeface 2010

좋은 물건! 문제없이 jQuery Mobile 내에서 구현됩니다.
Anthony

@treeface Slick,하지만 페이로드가 어디로 갈지 혼란 스럽습니다. mouseup 이벤트에서 구현 별 핸들러를 호출해야합니까?
Bob Stein

13

Aircoded (그러나이 바이올린에서 테스트 됨 )

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

우리가 누르고 장치에 개최 할 때 다른 색으로 텍스트를 선택하는 방법
럭키

8

누구나 관심이 있다면 간단한 JQuery 플러그인을 만들었습니다.

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


멋지네요. 사용자에게 객체를 드래그하라는 메시지를 제거하기 위해 객체가 드래그되었음을 감지하도록 수정할 수있었습니다.
Starfs

FANTASTIC 플러그인. 내 프로젝트와 bam, 작동합니다.
Andy

귀하의 플러그인은 부트 스트랩 용으로 작성되지 않았지만 매우 훌륭하게 작동합니다! 추가 CSS 나 엉망이 아닙니다. 그냥 작동합니다. 명성.
Andy

5

아마도에서 setTimeout통화를 mousedown시작한 다음 취소 할 수 있습니다 mouseup( mouseup시간 초과가 완료되기 전에 발생 하는 경우).

그러나 플러그인이있는 것 같습니다 : longclick .


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

}

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

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

JSFiddle에서보기

이제 보류 시간을 설정하고 clickHold요소 에 이벤트를 추가하기 만하면됩니다.


0

이 시도:

var thumbnailHold;

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

         } , 1000);
     return false;
});

$(".image_thumb").mouseup(function() {
    clearTimeout(thumbnailHold);
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.