2013-09-30 6 views
0

retardé J'ai une entrée html pour un numéro de téléphone en option, avec 2 entrées radio (Laissez un message, Ne pas laisser le message):JavaScript onkeypress déclencheur

<input type="text" class="input-medium phoneNum2" name="secondaryPhone" id="secondaryPhone" onkeypress="toggleRadio(this)" onblur="toggleRadio(this)" placeholder="703-555-1010" value="<cfoutput>#session.secondaryPhone#</cfoutput>" /> 

Avis J'ai deux événements en cours d'exécution (suppression de l'un d'entre eux donne le même problème, ayant les deux aide, mais je préfère avoir seulement 1 événement, sauf si nécessaire).

Le scénario est le suivant: La deuxième personne commence à taper dans l'entrée, elle vérifie si l'un des boutons radio est déjà vérifié. Sinon, sélectionnez par défaut oui. Si, pour une raison quelconque, ils suppriment le numéro de téléphone car ils ne veulent pas le donner, les deux boutons radio doivent être désélectionnés (seul l'onblur fonctionne ici). Et si le "Ne pas laisser le message" est sélectionné AVANT que l'utilisateur commence à taper, il ne devrait pas par défaut à oui.

Voici le JavaScript:

function toggleRadio(x) { 
    y = document.getElementById("contactSecondaryYes"); 
    z = document.getElementById("contactSecondaryNo"); 
    if (x.value.length < 1) { 
     y.checked = false; 
     z.checked = false; 
    } 
    if (x.value.length > 0 && !z.checked) y.checked = true; 
} 

Maintenant pour la question: L'option par défaut oui est uniquement déclenché lorsque je tape 2 caractères, au lieu du 1 désiré (? Presque comme un retard dans le code) . Si j'ai "Non" sélectionné avant de commencer à taper, il est par défaut oui une fois que je tape les 2 caractères. De même pour l'inversion, rien n'est "désélectionné" lorsqu'il y a 0 caractère pendant l'événement onkeypress, uniquement lorsque l'entrée perd le focus pendant l'événement onblur.

Est-ce que j'utilise les mauvais événements? Y a-t-il un défaut logique? Il n'y a pas de messages d'erreur, et non, je ne peux pas utiliser jQuery ici, donc s'il vous plaît ne me donnez pas de réponses jQuery ou l'habituel "Pourquoi pas jQuery?" (J'aime jQuery j'ai simplement des raisons pour lesquelles je ne peux pas l'utiliser).

Editer: J'ai également essayé de commander le JavaScript comme ceci, en vain.

function toggleRadio(x) { 
    y = document.getElementById("contactSecondaryYes"); 
    z = document.getElementById("contactSecondaryNo"); 
    if (x.value.length > 0 && !z.checked) y.checked = true; 
    if (x.value.length < 1) { 
     y.checked = false; 
     z.checked = false; 
    } 
} 

Fondamentalement, je veux savoir pourquoi le code agit comme il y a un retard, et est-il un moyen de le réparer?

Répondre

2

Essayez d'utiliser onkeyup à la place:

onkeyup="toggleRadio(this)" 
+0

Cela semble fonctionner, pouvez-vous expliquer pourquoi? Je pensais que keypress était fondamentalement "onkeydown + onkeyup" –

+2

L'ordre qu'ils ont tiré est onkeydown, onkeypress, onkeyup. Puisque vous faites une évaluation de la valeur, en la déplaçant sur onkeyup, vous pouvez vous assurer que la valeur du champ a changé avant de faire votre contrôle toggleRadio. Avec le clavier et la touche, vous étiez en train de vérifier avant que le champ ne soit modifié. Aussi onkeypress ne se fait pas virer pour toutes les clés. – Speedy

Questions connexes