Quelqu'un peut-il expliquer pourquoi focus () ne fonctionne pas toujours sur IE 10?

J'ai le code suivant, qui fonctionne 100% ok sur Chrome et Safari, mais sur IE 10 fonctionne parfois et parfois pas.

Sys.Focus = function(obj){ if(Sys.Anim.length>0){ Sys.Fp = obj; return; } obj.focus(); } . . . function Animate(...){ var i,... . . . if(Finished(Sys.Anim[i])){ Sys.Anim.splice(i,1); if(Sys.Anim.length==0){ if(Sys.Fp){ Sys.Focus(Sys.Fp) Sys.Fp = null; } } } . . . } . . . email = document.getElementById("email"); Sys.Focus(email); email.onkeydown = function(){ debugger . . . } 

En réponse à différentes actions de l'utilisateur, certains objets à l'écran changent de couleur ou se déplacent, ce qui est fait par Animate (), les objets à animer sont ajoutés à un Array (Sys.Anim) et supprimés lorsque l'animation se termine. Afin de garder tout en douceur, si la page est prête à être entrée avant que l'animation ne se termine (ce qui arrive presque toujours), l'appel focus () est retardé jusqu'à ce que l'animation se termine, soit environ 1/3 de seconde.

Tout fonctionne comme prévu dans tous les navigateurs, à l'exception de IE 10. Au début, je pensais qu'il y avait une erreur logique sur mon code, mais je l'ai débogué avec les outils de développement et j'ai découvert toutes les étapes sont correctement exécutées, le problème est que la mise au point ( ) Ne fonctionne pas réellement toutes les fois.

Un autre détail important … lorsque focus () succède à email.onkeydown est exécuté chaque fois que je frappe une touche, mais quand focus () échoue, je dois évidemment cliquer sur le contrôle d'entrée pour le focaliser manuellement, mais quand cela se produit, le courrier électronique. La fonction n'est jamais appelée même lorsque le contenu du contrôle d'entrée est mis à jour avec chaque coup de clé.

J'ai essayé:

 setTimeout(function(){obj.focus()},100); 

Qui a été proposé comme une solution à ce problème, mais cela ne résout pas le mien.

Pourquoi cela se produit-il et comment peut-on fonctionner?

METTRE À JOUR:

Pour les tests proposés, j'ai ajouté la fonction suivante:

 email.onfocus = function(){ debugger } 

Qui entraîne le débogueur uniquement lorsque focus () réussit, si focus () échoue, le débogueur ne s'affiche pas même si vous concentrez manuellement le contrôle d'entrée avec un clic de souris , car dans ce cas, je ne peux simplement pas concentrer le contrôle d'entrée en utilisant le Onglet ou Shift-Tab … est comme s'il n'existait pas !!!

Résolu !!!

Après de nombreux tests frustrants, j'ai découvert que le contrôle des intrants était imbriqué à l'intérieur d'un DIV qui, dans certaines circonstances, était désactivé, stupide de moi pour désactiver un DIV.

… Cependant, tous les autres navigateurs ne désactivent que le contrôle d'entrée s'il est explicitement désactivé. Les gars de Microsoft essayant toujours d'être "trop ​​intelligent" ont décidé de prendre une approche conterinctive et la laisser à moitié terminée.

Le problème et ma plainte est que le contrôle des entrées ne semble pas désactivé, il semble normal et le caret apparaît réellement si vous cliquez dessus, vous pouvez même le taper, peu importe la façon dont il était censé être désactivé … donc pour le Enregistrement, souvenez-vous toujours de l'IE 10, la moitié seulement désactive les contrôles d'entrée qui sont à l'intérieur de DIV désactivés, vous donnant un indice visuel de ce qui se passe.