Come posso ascoltare un clic e tenere premuto in jQuery?


Risposte:


173
var timeoutId = 0;

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

Modifica : correzione per AndyE ... grazie!

Modifica 2 : utilizzo di bind ora per due eventi con lo stesso gestore per gnarf


4
L'aggiornamento è migliore, ma potresti considerare di cancellare l'intervallo anche in un mouseleavegestore.
Andy E

5
Puoi utilizzare la stessa funzione per mouseup / mouseleave:.bind('mouseup mouseleave', function() {
gnarf

@gnarf Buon punto! L'ho modificato per includere il tuo suggerimento.
treeface

Bella roba! Implementato in jQuery Mobile senza problemi.
Anthony

@treeface Slick, ma sono confuso dove andrebbe a finire il carico utile. Il gestore specifico dell'implementazione deve essere chiamato nell'evento mouseup?
Bob Stein,

13

Aircoded (ma testato su questo violino )

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

come selezionare il testo con un colore diverso quando tocchiamo e teniamo premuto sul dispositivo
Lucky

8

Ho creato un semplice plugin JQuery per questo se qualcuno è interessato.

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


Ben fatto. È stato in grado di modificarlo per rilevare che un oggetto era stato trascinato in modo da rimuovere un messaggio che diceva all'utente di trascinare l'oggetto.
Starfs

Plugin FANTASTICO. Sono entrato nel mio progetto e bam, funziona.
Andy

Il tuo plugin non è stato scritto per Bootstrap, ma funziona MOLTO bene con esso! Nessun CSS aggiuntivo o scherzi. Funziona e basta. Complimenti.
Andy

5

Presumibilmente potresti dare il via a una setTimeoutchiamata mousedowne poi annullarla mouseup(se mouseupaccade prima del termine del timeout).

Tuttavia, sembra che ci sia un plugin: longclick .


1

Ecco la mia attuale implementazione:

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

Ho scritto del codice per renderlo facile

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

Vedi su JSFiddle

Ora devi solo impostare il tempo di attesa e aggiungere l' clickHoldevento al tuo elemento


0

Prova questo:

var thumbnailHold;

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

         } , 1000);
     return false;
});

$(".image_thumb").mouseup(function() {
    clearTimeout(thumbnailHold);
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.