javascript - tipos - ¿Cómo puedo escuchar un clic y mantener presionado en jQuery?
tipos de click jquery (7)
Aircoded (pero probado en este violín )
(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);
})
Quiero poder activar un evento cuando un usuario hace clic en un botón, y luego mantiene presionado ese botón durante 1000 a 1500 ms.
¿Hay una funcionalidad básica jQuery o un complemento que ya lo habilite?
¿Debería lanzar el mío? ¿Donde debería empezar?
Aquí está mi implementación actual:
$.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);
});
}
Escribí un código para hacerlo más fácil
//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">
Ahora solo necesita establecer el tiempo de espera y agregar el evento clickHold
en su elemento
Hice un plugin JQuery simple para esto si alguien está interesado.
Presumiblemente, podría iniciar una llamada a mousedown
en mousedown
y luego cancelarla en mouseup
(si ocurre mouseup
antes de que se mouseup
el tiempo de espera).
Sin embargo, parece que hay un complemento: longclick .
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);
var timeoutId = 0;
$(''#myElement'').on(''mousedown'', function() {
timeoutId = setTimeout(myFunction, 1000);
}).on(''mouseup mouseleave'', function() {
clearTimeout(timeoutId);
});
Edición : corrección por AndyE ... ¡gracias!
Editar 2 : usando bind ahora para dos eventos con el mismo controlador por gnarf