2009-07-01 8 views

Respuesta

76

Esta es una buena pregunta, y realmente no creo que se pueda hacer fácilmente. (Some discussion on this)

Si es super chulo importante que tiene esta funcionalidad, se podía entrar ilegalmente en él de este modo:

function singleClick(e) { 
    // do something, "this" will be the DOM element 
} 

function doubleClick(e) { 
    // do something, "this" will be the DOM element 
} 

$(selector).click(function(e) { 
    var that = this; 
    setTimeout(function() { 
     var dblclick = parseInt($(that).data('double'), 10); 
     if (dblclick > 0) { 
      $(that).data('double', dblclick-1); 
     } else { 
      singleClick.call(that, e); 
     } 
    }, 300); 
}).dblclick(function(e) { 
    $(this).data('double', 2); 
    doubleClick.call(this, e); 
}); 

Y aquí es un example of it at work.

Como se señala en los comentarios, hay un complemento para esto que hace bastante lo que hice arriba, pero lo empaqueta para que no tenga que ver lo feo: FixClick.

+0

Bueno, parece que funciona, pero tiene el claro problema de no detectar clics regulares durante .5 segundos. Podría acortar el tiempo, por supuesto, pero ... bueno. Lo resolveré yo mismo. Gracias de cualquier manera. –

+0

Sí, estoy pensando que 250 o incluso menos probablemente sean razonables en lo que respecta a los clics dobles. He estado haciendo un poco de google en esto y aparentemente esto es lo mejor que obtendrás. Podría hacer un complemento para ocultar lo feo si te hace sentir mejor. :) –

+0

Interesante, no había intentado esto todavía y de hecho parece una forma hackish de hacerlo. Pero desde un punto de vista de evento, tiene sentido que el evento click se llame dos veces – jitter

7

La técnica descrita en las otras respuestas se conoce como debouncing.

+0

Cosas interesantes y buen artículo. +1 –

31

Raymond Chen ha discutido algunos de los implications of single-versus-double clicking, aunque habla en el contexto de Windows, lo que dice es relevante para el diseño de la interfaz de usuario basada en el navegador.

Básicamente, la acción realizada con un doble clic debería ser una acción lógica después de un solo clic. Entonces, por ejemplo, en una IU de escritorio, un solo clic selecciona un elemento y el doble clic lo abre (por ejemplo, abre el archivo o inicia la aplicación). El usuario debería seleccionar el archivo para abrirlo de todos modos, por lo que no importa que la acción de un solo clic se realice antes de la acción de doble clic.

Si tiene un componente de IU cuya acción de doble clic no está relacionada con la acción de un solo clic, de modo que es necesario evitar que ocurra un solo clic una vez que el sistema se da cuenta de que se trata de un doble clic, entonces realmente deberías reconsiderar tu diseño. Los usuarios lo encontrarán incómodo y contrario a la intuición, ya que no actuará de la manera en que están acostumbrados a las cosas que actúan.

Si aún quiere seguir así, tendrá que usar la técnica antirrebote (en cuyo caso se retrasarán todas las acciones de un solo clic) o implementar algún mecanismo mediante el cual el manejador de doble clic deshaga el trabajo hecho por el manejador de un solo clic.

También debe tener en cuenta que algunos usuarios establecen un tiempo de doble clic muy largo. Alguien con, por ejemplo, manos artríticas podría tener un doble clic de más de un segundo conjunto en sus preferencias del sistema, por lo que la técnica de antirrebote basada en un período de tiempo arbitrario de su elección hará que su UI sea inaccesible para esas personas si tomar la acción de un solo clic no permite realizar la acción de doble clic. La técnica de "deshacer lo que acaba de ocurrir con un solo clic" es la única solución viable para esto, hasta donde yo sé.

+1

¡estos son buenos puntos! –

+0

buen punto sobre los usuarios que pueden establecer su propio tiempo de doble clic ... no quiero esperar un segundo completo antes de ejecutar la acción de un solo clic, por lo que esperar el doble clic con un tiempo de espera es inútil en la práctica – Hrqls

+0

a veces el la acción de doble clic es un seguimiento lógico después de un solo clic, y podría estar bien ejecutar la acción de un solo clic también antes (así es como lo tengo ahora), pero la acción de un solo clic podría ocasionar algo de carga adicional (o en mi caso, tráfico de datos) que le gustaría evitar (aunque no le haría daño exactamente) – Hrqls

1

jQuery Sparkle proporciona una solución limpia y elegante para esto, mediante la implementación de un evento personalizado singleclick. De esta manera, se puede usar como cualquier otro evento, por lo que:

$('#el').singleclick(function(){}); 
// or event 
$('#el').bind('singleclick', function(){}); 

También proporciona eventos personalizados para los primeros y últimos clics de una serie de clics. ¡Y el evento personalizado lastclick en realidad le devuelve la cantidad de clics! ¡Así que podrías hacer esto!

$('#el').lastclick(function(event,clicks){ 
    if (clicks === 3) alert('Tripple Click!'); 
}); 

Puede encontrar el código fuente para definir el evento personalizado here.

Es de código abierto bajo la licencia AGPL, por lo que puede tomarse lo que necesita de forma gratuita ¡sin preocupaciones!:-) También se desarrolla activamente en el día a día, por lo que nunca estará corto de apoyo.

Pero lo más importante es un marco de plugin/efecto DRY que le permite desarrollar complementos y extensiones mucho más fácilmente. ¡Así que espero que esto ayude a lograr ese objetivo!

0

Si se trata de un botón que envía un formulario (que no es necesariamente el caso del póster original, pero puede ser el caso para otras personas que llegan aquí a través de Google), una opción más fácil sería desactivar el elemento se hace clic en su controlador de evento click:

$(selector).click(function(e) { 
    $(this).prop('disable', true); 
} 
Cuestiones relacionadas