2010-06-08 5 views
3

récemment, j'ai rencontré un problème avec IE. J'ai une fonctioncomment définir le style par javascript dans IE immédiatement

function() { 
    ShowProgress(); 
    DoSomeWork(); 
    HideProgress(); 
} 

où ShowProgress et HideProgress manipuler juste le style CSS 'display' en utilisant la méthode css() jQuery.

En FF tout est OK, et en même temps je change la propriété d'affichage à bloquer, la barre de progression apparaît. Mais pas dans IE. Dans IE, le style est appliqué, une fois que je quitte la fonction. Ce qui signifie qu'il n'est jamais montré, parce qu'à la fin de la fonction, je le cache simplement. (Si je supprime la ligne HideProgress, la barre de progression apparaît juste après l'exécution de la fonction (plus précisément, immédiatement lorsque les fonctions d'appel se terminent - et donc rien d'autre ne se passe dans IE)).

Quelqu'un at-il rencontré ce problème? Existe-t-il un moyen d'amener IE à appliquer le style immédiatement?

J'ai préparé une solution, mais il me faudrait du temps pour l'implémenter. Ma méthode DoSomeWork() fait quelques appels AJAX, et ceux-ci sont maintenant synchrones. Je suppose que les rendre asynchrones permettra de résoudre le problème, mais je dois redéfinir un peu le code, donc trouver une solution juste pour appliquer le style immédiatement serait beaucoup plus simple.

Merci rezna

Répondre

1

Les requêtes synchrones bloquent l'ensemble de l'interface utilisateur, ce qui est horrible. Vous avez raison dans votre hypothèse, mais si vous voulez continuer dans cette voie aux cercles intérieurs de l'enfer $, essayez ceci:

function() { 
    ShowProgress(); 
    window.setTimeout(function() { 
     DoSomeWork(); 
     HideProgress(); 
    }, 0); 
}

Notez que je ne l'ai pas testé. Essayez de jouer avec la valeur de délai d'attente (actuellement 0) si vous ne voyez toujours rien.

+0

ouais je le pensais. jouer avec setTimeout est assez compliqué et je pense que ça va poser des problèmes encore plus graves. Donc je vais refaire le code :) – rezna

0

Essayez de lancer la méthode HideProgress dans un setTimeout. Par exemple:

function() { 
    ShowProgress(); 
    DoSomeWork(); 
    setTimeout(HideProgress,0); 
} 

Même si le retard est censé être 0 millisecondes, cela aura l'effet net de lancer la méthode HideProcess à la fin de la file d'attente et peut donner au navigateur la salle de la respiration dont il a besoin.

[Modifier] J'aurais dû mentionner que cette méthode a un inconvénient si vous invoquez cette méthode très souvent et rapidement: une condition de concurrence. Vous pourriez vous retrouver avec un timeout précédent en cours d'exécution pendant qu'un autre DoSomeWork() est en cours d'exécution. Ce aura si DoSomeWork prend beaucoup de temps à finir. S'il s'agit d'un risque, vous pouvez implémenter un compteur pour votre barre de progression et exécuter uniquement HideProgress si le compteur qui l'a démarré est identique à la valeur actuelle du compteur.

+0

le problème n'est pas le HideProgress, mais le visage que lors de l'exécution de DoSomeWork() la barre de progression n'est pas visible ... – rezna

+0

Si vous supprimez 'HideProgress()' et/ou 'DoSomeWork()' fait le progrès barre apparaître du tout? Pouvez-vous poster votre fonction ShowProgress? – Andrew

+0

il est écrit dans la question originale: (si je supprime la ligne HideProgress, la barre de progression apparaît juste après avoir terminé l'exécution de la fonction (plus précisément, immédiatement quand les fonctions d'appel se terminent) et donc rien d'autre dans IE)) . mon ShowProgress() est simple function ShowProgress() { $ ('# mon-id'). Css ('display', 'block'); } – rezna

Questions connexes