En forçant un DOM actualiser dans Internet explorer après avoir javascript de manipulation du dom
Voici la situation. J'ai un peu de javascript qui ressemble à ceci:
function onSubmit() {
doSomeStuff();
someSpan.style.display="block";
otherSpan.style.display="none";
return doLongRunningOperation;
}
Quand je fais cette soumission d'un formulaire d'action, et de l'exécuter à partir d'un non le navigateur IE, il est rapidement permute les deux travées de la visibilité et de courir le long de l'opération javascript. Si je fais cela dans IE il ne fait pas le swap, jusqu'à ce que après onSubmit() retourne complètement.
Je peux forcer un dom redessiner en coller une boîte d'alerte de la sorte:
function onSubmit() {
doSomeStuff();
someSpan.style.display="block";
otherSpan.style.display="none";
alert("refresh forced");
return doLongRunningOperation;
}
Aussi, ce qui est évident jquery refactoring n'affecte pas l'IE comportement:
function onSubmit() {
doSomeStuff();
$("#someSpan").show();
$("#otherSpan").hide();
return doLongRunningOperation;
}
Ce problème existe sur IE8 et IE6. Est-il de toute façon à force d'un retraçage des DOM dans ces navigateurs?
- Tout d'abord, que faites-vous dans la longRunningOperation?
- Avez-vous essayé de déplacer la visibilité basculement de sa propre fonction?
- longRunningOperation est en train de faire de la validation du formulaire. La forme est importante dans un petit sous-ensemble de cas.
Vous devez vous connecter pour publier un commentaire.
Votre longRunningOperation être appelée de façon asynchrone?
Mozilla (peut-être à-dire comme un bien) cache/délai d'exécution des modifications pour les DOM qui affectent l'affichage, de sorte qu'il est possible de calculer toutes les modifications à la fois au lieu de cela, à plusieurs reprises, après chaque instruction.
Pour forcer une mise à jour (à force immédiate, synchrone, de brasage ou de la nouvelle disposition), votre javascript doit lire une propriété qui est affecté par le changement, par exemple l'emplacement de someSpan et otherSpan.
(Ce Mozilla mise en œuvre détail est mentionné dans la vidéo Plus rapide HTML et CSS: Mise en page du Moteur Internes pour les Développeurs Web.)
À continuer ce que ChrisW dit:
voici rinçage script de flash DOM, de sorte que vous n'avez pas à appeler alert(""); (trouvé à la http://amolnw.wordpress.com/category/programming/javascript/):
Ça marche pour moi!!!
Merci pour l'astuce.
J'ai eu ce problème en Chrome 21 glisser un mot qui a une lettre avec un jambage ("g"). Il a été en laissant une traînée de mites de la poussière derrière sur l'écran, ce qui ferait disparaître la prochaine fois que quelque chose de rafraîchissement de l'écran. ChrisW de la solution (l'interrogation d'une disposition sensible à la propriété) n'a pas fonctionné.
Ce n'travail a été d'ajouter de 1 pixel blanc div en haut de la page, puis sur supprimer une milliseconde plus tard, en appelant la suite de la fonction à la fin de l'opération de glisser:
Remarque: Vous devez le retard. Tout simplement l'ajout et la suppression de la
div
ne fonctionne pas. Aussi, lediv
doit être ajouté au-dessus de la partie de la page qui doit être redessiné.Vous pouvez également vous envelopper à long terme de la fonction dans un setTimeout(function(){long terme();},1);
élément.focus() fonctionne pour moi dans IE10