JQuery'de bir tıklama ve bekletmeyi nasıl dinleyebilirim?


Yanıtlar:


173
var timeoutId = 0;

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

Düzenleme : AndyE'ye göre düzeltme ... teşekkürler!

Düzenleme 2 : gnarf başına aynı işleyiciye sahip iki olay için şimdi bind kullanma


4
Güncelleme daha iyidir, ancak bir mouseleaveişleyicideki aralığı temizlemeyi de düşünebilirsiniz .
Andy E

5
Aynı işlevi mouseup / .bind('mouseup mouseleave', function() {
mouseleave

@gnarf İyi nokta! Önerinizi içerecek şekilde düzenledim.
ağaç kabuğu

Güzel iş! JQuery Mobile içinde herhangi bir sorun olmadan uygulanır.
Anthony

@treeface Slick, ancak yükün nereye gideceği konusunda kafam karıştı. Uygulamaya özgü işleyici mouseup olayında çağrılmalı mı?
Bob Stein

13

Hava kodlu (ancak bu keman üzerinde test edildi )

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

cihaza dokunup basılı tuttuğumuzda farklı renkteki metin nasıl seçilir
Lucky

8

İlgilenen varsa bunun için basit bir JQuery eklentisi yaptım.

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


Güzel bir. Bunu, kullanıcıya nesneyi sürüklemesini söyleyen bir mesajı kaldırmak için bir nesnenin sürüklendiğini algılayacak şekilde değiştirebildi.
Starfs

FANTASTIC eklentisi. Projem ve bam, işlerime düştüm.
Andy

Eklentiniz Bootstrap için yazılmadı, ancak onunla ÇOK güzel çalışıyor! Fazladan CSS veya karışıklık yok. Sadece çalışıyor. Kudos.
Andy

5

Muhtemelen bir tekme olabilir setTimeoutgörüşmemizi mousedownde iptal sonra ve mouseup(eğer mouseupzaman aşımı tamamlamadan önce olur).

Ancak, bir eklenti var gibi görünüyor: longclick .


1

İşte mevcut uygulamam:

$.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

Kolaylaştırmak için bazı kodlar yazdım

//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'da görün

Şimdi sadece bekletme zamanını ayarlamanız ve clickHoldelementinize etkinlik eklemeniz gerekiyor


0

Bunu dene:

var thumbnailHold;

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

         } , 1000);
     return false;
});

$(".image_thumb").mouseup(function() {
    clearTimeout(thumbnailHold);
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.