2010-01-13 7 views
1

Lorsque cet événement onchange dans IE renvoie false, le focus IE reste sur cette zone de saisie. Dans Firefox, le focus passe toujours au champ suivant.Javascript onchange différent dans IE et FireFox

HTML:

input name="seminar_donation" type="text" id="seminar_donation" 
onchange="return CheckTotal(this);" 

JavaScript:

function CheckTotal(inputbox) { 
    if (isNaN(parseInt(inputbox.value))) { 
     alert("Please enter only digits 0-9"); 
     inputbox.focus(); 
     return false; 
    } 
    return true; 
} 

Dans IE Je ne ai même pas besoin de inputbox.focus() qui ne semble malheureusement pas à quoi que ce soit dans Firefox pour conserver la mise au point dans la boîte de saisie errante. Comment puis-je obtenir Firefox pour rester sur cette boîte de saisie?

Répondre

-1

Avez-vous essayé d'ajouter un "retour" dans l'attribut onchange? Je ne suis pas entièrement sûr que cela fonctionnerait, mais vaut la peine d'essayer? Edit: pour clarifier, la raison pour laquelle je ne suis pas sûr, c'est que j'aborderais cela différemment et lierais le gestionnaire d'événements en javascript plutôt qu'en HTML.

+0

Oh oui, je l'ai essayé avec le retour, ne fait aucune différence. –

+0

J'ai changé la source pour "retourner CheckTotal (this) pour le bénéfice des autres téléspectateurs –

1

Une réponse qui ne semble plus être ici suggérée des problèmes de «timing», bien que sur un sujet légèrement différent. Donc, je « time out » googlé et trouvé le blog de Mike Rankin de 2005 qui m'a permis de résoudre le problème en changeant mise au point() à:

var t= setTimeout('document.getElementById("seminar_donation").focus()',1); 

Alors qu'est-ce qui se passe est Firefox se poursuit encore au champ suivant, mais 1 msec plus tard, ce code définit le focus sur le champ errant. Il est cludgy parce que si ce champ suivant a un événement oblur que onblur sera déclenché quand le timeout force le focus à revenir. Mais c'est une solution de rechange pour apparemment un bug de longue date dans Firefox.

+0

idem commenter comme @ Dave.Sol – helios

+0

Vous n'avez même pas besoin que la longueur du timeout soit 1, cela peut être 0 - l'exécution du timer est mise en file d'attente –

1
setTimeout('document.getElementById("seminar_donation").focus()',1); 
+0

Je suppose que vous répondez à cette question car Firefox appelle d'abord votre gestionnaire d'événements et NEXT concentre l'entrée suivante, remplace le focus() dans le gestionnaire. dit javascript pour exécuter plus tard (1 ms) Javascript est monothreaded donc c'est la même chose comme "invoke après avoir fini tout ça" – helios

+0

@helios, oui ça se passe comme tu l'as décrit. –

Questions connexes