¿Cuál es la mejor manera de desactivar un botón para que no se produzca un doble clic con knockout.js? Tengo algunos usuarios haciendo clic rápido causando múltiples solicitudes ajax. Supongo que knockout.js puede manejar esto de varias maneras y quería ver algunas de las alternativas disponibles.Evite hacer doble clic en un botón con knockout.js
Respuesta
Utilice un semáforo (bloqueo giratorio). Básicamente, usted cuenta cuántos clics ha registrado un elemento y si es más de 1, devuelve falso y no permite los siguientes clics. Se podría usar una función de tiempo de espera para borrar el bloqueo para que puedan hacer clic de nuevo después de decir, 5 segundos. Se podría modificar el ejemplo de http://knockoutjs.com/documentation/click-binding.html
Como se ve aquí:
<div>
You've clicked <span data-bind="text: numberOfClicks"></span> times
<button data-bind="click: incrementClickCounter">Click me</button>
</div>
<script type="text/javascript">
var viewModel = {
numberOfClicks : ko.observable(0),
incrementClickCounter : function() {
var previousCount = this.numberOfClicks();
this.numberOfClicks(previousCount + 1);
}
};
</script>
Al cambiar la lógica dentro de la función anidada para
if(this.numberOfClicks() > 1){
//TODO: Handle multiple clicks or simply return false
// and perhaps implement a timeout which clears the lockout
}
me encontré con un problema similar con un formulario de datos asistente presentación a través de Ajax al hacer clic en el botón. Tenemos 4 botones selectivamente visibles para cada paso. Creamos un boolean observable ButtonLock
y lo devolvimos de la función de envío si era verdadero. Entonces también enlazado a datos del disable
de cada botón a la ButtonLock
observables
modelo de vista:
var viewModel = function(...) {
self.ButtonLock = ko.observable(false);
self.AdvanceStep = function (action) {
self.ButtonLock(true);
// Do stuff
// Ajax call
}
self.AjaxCallback = function(data) {
// Handle response, update UI
self.ButtonLock(false);
}
Botón:
<input type="button" id="FormContinue" name="FormContinue" class="ActionButton ContinueButton"
data-bind="
if: CurrentStep().actions.continueAction,
disable: ButtonLock,
value: CurrentStep().actions.continueAction.buttonText,
click: function() {
AdvanceStep(CurrentStep().actions.continueAction);
}"/>
Si sólo tiene que evitar que varios clics, prefiero el booleano . Pero el método de contador le permite detectar clics dobles y manejarlos por separado, si desea esa función.
Me gusta esta respuesta más. Le da al usuario un indicador visual de lo que está sucediendo frente al enfoque de conteo. El usuario puede hacer clic repetidamente en el botón y sin indicador de lo que está sucediendo para que pueda pensar que algo se rompió. – MorganTiley
Estoy de acuerdo con @MorganTiley, esta es una solución mejor –
En caso de que alguien todavía esté buscando una forma de hacerlo. Encontré que puedes usar un booleano.
self.disableSubmitButton= ko.observable(false);
self.SubmitPayment = function() {
self.disableSubmitButton(true);
//your other actions here
}
A continuación, en su opinión
data-bind="click:SubmitPayment, disable:disableSubmitButton"
Hice esto con la unión de un encargo:
<button data-bind="throttleClick: function() { console.log(new Date()); }>
I wont double click quicker than 800ms
</button>
ko.bindingHandlers.throttleClick = {
init: function(element, valueAccessor) {
var preventClick = false;
var handler = ko.unwrap(valueAccessor());
$(element).click(function() {
if(preventClick)
return;
preventClick = true;
handler.call();
setTimeout(function() { preventClick = false; }, 800);
})
}
}
- 1. Distinga entre hacer doble clic con el mouse y hacer clic con el mouse en wpf
- 2. Deshabilitar el botón asp.net después de hacer clic para evitar hacer doble clic
- 3. Implementar doble clic para botón en Android
- 4. Al hacer clic en un botón con Ruby Mechanize
- 5. Prevención de doble clic accidental en un botón
- 6. Hacer doble clic en un evento en el elemento JList
- 7. Java: ignorar un solo clic con doble clic?
- 8. Resaltado con doble clic
- 9. Interceptar clic simple o doble del mouse - solo ejecutar doble clic en el código al hacer doble clic
- 10. ¿Existe un doble clic derecho en Win32?
- 11. gridview edit requiere hacer doble clic
- 12. Botón redondo en Android ... evite las prensas "afuera" del botón?
- 13. ¿Cómo hacer doble clic y evento de un solo clic para el botón de enlace del control de Asp.net?
- 14. Ejecutando un Jar en Vista con un doble clic
- 15. Cómo asociar presionando "enter" con hacer clic en el botón?
- 16. ¿Cómo hacer clic en un botón de programación en WPF?
- 17. ¿Cómo se detecta un doble clic con el botón izquierdo del ratón en WPF?
- 18. ¿Cómo se maneja un botón al hacer clic en Android?
- 19. Android resaltar un botón imagen al hacer clic en
- 20. ¿Cómo implemento un doble clic con el botón derecho para winforms?
- 21. Winforms ListView - Detener comprobación automática al hacer doble clic en
- 22. ¿Cómo hacer que el botón no se pueda hacer clic después de hacer clic en él?
- 23. Botón de carga con un clic
- 24. Distinguir entre un solo clic y doble clic en Java
- 25. ¿Cómo escuchar para hacer doble clic en jstree?
- 26. Desactivar el 'requisito' para hacer doble clic en una ventana desenfocada al hacer clic en un menustrip
- 27. ¿Cómo evitar un doble clic usando jQuery?
- 28. Al hacer clic en un botón automáticamente en un navegador web con python
- 29. ASP.Net haga doble clic en el problema
- 30. ¿Un manejo más limpio con un solo clic y doble clic en Silverlight?
Gran respuesta! Esto también podría refactorizarse en un enlace de clic personalizado. – madcapnmckay
Respuesta perfecta. Seguí adelante y envolví todas mis llamadas sin problemas, y reinicié los clics después de cada llamada ajax, genéricamente por supuesto. Me pregunto cómo se vería un enlace personalizado. –