Bagaimana cara mendengarkan klik dan tahan di jQuery?

116

Saya ingin dapat mengaktifkan peristiwa ketika pengguna mengklik tombol, lalu menahan klik tersebut selama 1000 hingga 1500 ms.

Apakah ada fungsionalitas inti jQuery atau plugin yang sudah mengaktifkan ini?

Haruskah saya menggulung sendiri? Di mana saya harus memulai?

SnickersAreMyFave
sumber
kemungkinan duplikat dari Long Press di JavaScript?
Der Hochstapler
Bagaimana dengan 'taphold' ??
Roshdy

Jawaban:

173
var timeoutId = 0;

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

Edit : koreksi per AndyE ... terima kasih!

Edit 2 : menggunakan mengikat sekarang untuk dua acara dengan penangan yang sama per gnarf

permukaan pohon
sumber
4
Pembaruan lebih baik, tetapi Anda mungkin mempertimbangkan untuk menghapus interval di mouseleavepenangan juga.
Andy E
5
Anda dapat menggunakan fungsi yang sama untuk mouseup / mouseleave:.bind('mouseup mouseleave', function() {
gnarf
@gnarf Poin yang bagus! Saya telah mengeditnya untuk menyertakan saran Anda.
permukaan pohon
Barang bagus! Diimplementasikan dalam jQuery Mobile tanpa masalah apa pun.
Anthony
@treeface Slick, tapi saya bingung kemana payloadnya akan pergi. Haruskah penangan khusus implementasi dipanggil dalam acara mouseup?
Bob Stein
13

Aircoded (tetapi diuji pada biola ini )

(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);
})
gnarf
sumber
bagaimana memilih teks dengan warna berbeda ketika kita ketuk dan tahan pada perangkat
Beruntung
8

Saya membuat plugin JQuery sederhana untuk ini jika ada yang tertarik.

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

Tony Smith
sumber
Bagus. Dapat memodifikasi ini untuk mendeteksi bahwa suatu objek telah diseret sehingga dapat menghapus pesan yang memberitahu pengguna untuk menyeret objek tersebut.
Starfs
Plugin FANTASTIS. Mampir ke proyek saya dan bam, bekerja.
Andy
Plugin Anda tidak ditulis untuk Bootstrap, tetapi berfungsi SANGAT baik dengannya! Tidak ada CSS tambahan atau main-main. Bekerja saja. Pujian.
Andy
5

Agaknya Anda bisa memulai setTimeoutpanggilan masuk mousedown, dan kemudian membatalkannya mouseup(jika mouseupterjadi sebelum batas waktu Anda selesai).

Namun, sepertinya ada plugin: longclick .

Jacob Mattison
sumber
1

Inilah implementasi saya saat ini:

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

}
SnickersAreMyFave
sumber
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);
kayz1
sumber
0

Saya menulis beberapa kode untuk membuatnya mudah

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

Lihat di JSFiddle

Sekarang Anda hanya perlu mengatur waktu menahan dan menambahkan clickHoldacara pada elemen Anda

Sergey Semushin
sumber
0

Coba ini:

var thumbnailHold;

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

         } , 1000);
     return false;
});

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