Naresh
Estoy tratando de concentrarme en la falla de validación de la tarjeta de crédito. pero extraño focus()
no funciona.
$('#cc_number').validateCreditCard(function (result) {
if (result.length_valid && result.luhn_valid) {
} else {
$("#cc_number").focus();
return false;
}
});
<input type="text" id='cc_number' name="cc_number" />
Curtis
Como se menciona en los comentarios, su jsfiddle original contiene la solución.
Una solución consiste en poner un tiempo de espera en la llamada de enfoque.
setTimeout(function(){
$("#cc_number").focus();
}, 0);
No estoy 100% seguro, pero podría ser que, como la alerta se activa cuando está borrosa, en realidad nunca permite que el cuadro de texto pierda el foco y, por lo tanto, cuando se activa el foco, ya lo tiene.
Al usar un tiempo de espera, está colocando la lógica en un hilo separado, que se ejecuta por separado del código javascript principal (muy parecido a una función de devolución de llamada).
Pero como también mencionan los comentarios de su pregunta, forzar el enfoque hasta que pase la validación es molesto.
Pero esto es más una crítica de UX.
-
@Richard, no estoy 100% seguro, pero creo que se debe a que el foco está fuera del hilo actual. El tiempo de espera pequeño es realmente irrelevante, es solo que el tiempo de espera no se ejecuta linealmente con el resto del código, como una función de devolución de llamada. Por lo tanto, he modificado la respuesta para evitar confusiones.
– Curtis
22 de agosto de 2013 a las 14:57
-
Es debido al momento de los eventos. Si establece el foco dentro del evento de desenfoque, la entrada gana el foco. Sin embargo, debido a que el evento de desenfoque no se ha completado, perderá el foco a medida que se complete el evento. Agregar el tiempo de espera permite que .focus() ocurra después de que se completa el evento de desenfoque. También es posible que pueda cancelar el evento original para tener el mismo efecto.
– Ricardo
22 de agosto de 2013 a las 15:02
-
JavaScript no tiene varios subprocesos: ejohn.org/blog/how-javascript-timers-work
– Jasón
28 de septiembre de 2013 a las 12:13
-
“Al usar un tiempo de espera, está poniendo la lógica en un subproceso separado” no es correcto. JS no está usando hilos. Haciendo
setTimeout(..., 0)
también funcionaría.– Matej
14 de abril de 2014 a las 13:14
-
Además, puede soltar el segundo parámetro.
, 0)
. El valor predeterminado ya es0
.–Kevin Beal
18/08/2015 a las 21:41
Es posible que su DOM se esté actualizando, por lo que el enfoque no funciona aquí. En su lugar, puede seguir este enfoque:
$('#cc_number').validateCreditCard(function (result) {
if (result.length_valid && result.luhn_valid) {
} else {
$("#cc_number").attr("autofocus","autofocus")
return false;
}
});
¿Qué es “no funciona”? Recibo una alerta cada vez que desenfoco la entrada.
– j08691
22 de agosto de 2013 a las 14:48
solo funciona la alerta… pero por qué falla el enfoque… 🙁
– Naresh
22 de agosto de 2013 a las 14:49
El código en el violín que publicaste primero contiene la solución correcta para el problema 🙂
– Puntiagudo
22 de agosto de 2013 a las 14:49
Es un poco molesto forzar el enfoque en una entrada hasta que el usuario ingrese un valor válido. Te sugiero que no lo hagas.
– David Sherret
22 de agosto de 2013 a las 14:49
@dhsto ok, eliminé el mensaje de alerta … pero ¿por qué el enfoque no funciona para fallar?
– Naresh
22 de agosto de 2013 a las 14:51