2013-08-22 14 views
32

Sto cercando di concentrarmi sulla convalida della carta di credito fallita. ma strano focus() non funziona.jQuery focus non funziona

$('#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" /> 
+1

Che cosa è "non funziona"? Ricevo un avviso ogni volta che sfocato l'input. – j08691

+1

In chrome funziona –

+0

solo avviso sta funzionando .. ma perché la messa a fuoco fallisce .. :( –

risposta

56

Come mentioned in the comments, il tuo jsfiddle originale contiene la soluzione.

Una soluzione alternativa consiste nel mettere un timeout sulla chiamata di messa a fuoco.

setTimeout(function(){ 
    $("#cc_number").focus(); 
}, 0); 

non sono sicuro al 100%, ma potrebbe essere che con la segnalazione è chiamato sfocatura, non si è mai in realtà permettendo la casella di testo a perdere la concentrazione, e quindi quando si chiama messa a fuoco, ha già esso.

Utilizzando un timeout, si inserisce la logica in un thread separato, che viene eseguito separatamente rispetto al codice javascript principale (molto simile a una funzione di callback).


Ma, come i tuoi commenti domanda citano anche, costringendo messa a fuoco fino convalida passa è fastidioso.

Ma questo è più di una critica UX.

+4

Se potessi spiegare il motivo per cui funziona, vorrei fare +1. – Richard

+0

@Richard Non sono sicuro al 100%, ma credo sia perché l'attenzione è stata tolta dal thread corrente. Il timeout piccolo è irrilevante, è solo che il timeout non è lineare con il resto del codice, proprio come una funzione di callback. Pertanto ho modificato la risposta per evitare confusione. – Curt

+2

È a causa dei tempi degli eventi. Se si imposta la messa a fuoco all'interno dell'evento Sfocatura, l'input acquisisce la messa a fuoco. Tuttavia, poiché l'evento di sfocatura non è stato completato, perderà lo stato attivo al termine dell'evento. L'aggiunta del timeout consente a .focus() di verificarsi dopo il completamento dell'evento di sfocatura. Potresti anche essere in grado di annullare l'evento originale per avere lo stesso effetto. – Richard

17

Il tuo DOM potrebbe essere aggiornato in modo che l'attivazione non funzioni qui. Invece è possibile seguire questo approccio:

$('#cc_number').validateCreditCard(function (result) { 
    if (result.length_valid && result.luhn_valid) { 

    } else { 
     $("#cc_number").attr("autofocus","autofocus") 
     return false; 
    } 
});