Bagaimana cara mendengarkan klik dan tahan di jQuery?


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


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

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/


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 .


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

}

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

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


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);
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.