El enfoque de jQuery no funciona

3 minutos de lectura

avatar de usuario
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" />

  • ¿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

avatar de usuario
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 es 0.

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

¿Ha sido útil esta solución?