Les éléments dynamics n’apparaissent pas dans IE8 tant que l’utilisateur n’a pas cliqué

J’ai une requête Ajax qui renvoie les résultats de la recherche et je crée dynamicment des éléments DOM pour les afficher. Cela fonctionne comme prévu dans tous les navigateurs que j’ai testés, à l’exception de IE8.

La requête renvoie correctement, JavaScript s’exécute correctement et les éléments sont en cours de création, mais ils ne sont pas affichés dans la page. Ils apparaissent uniquement après un clic de souris quelque part sur la page.

J’ai effectué un test rapide qui exécutait le code de rappel sans la demande Ajax et il se comportait comme prévu. Je me demande donc si cela a quelque chose à voir avec la façon dont IE8 gère le thread de rappel. Est-ce que quelqu’un d’autre a vu un comportement comme celui-ci ou en a une idée?

Le rappel est fondamentalement très simple. J’ai reproduit avec ceci:

function catchResults(response) { var contentBlock = document.getElementById('divResults'); var divResults = document.createElement('div'); var txt = document.createTextNode("Results"); divResults.appendChild(txt); contentBlock.appendChild(divResults); } 

J’utilise JQuery.ajax pour passer l’appel. J’ai vu le bon comportement dans FireFox et Chrome.

Merci pour l’aide!

J’ai rencontré ce problème il n’y a pas si longtemps sur IE8.

Je pense que cela pourrait être un problème avec IE8 ne pas re-rendre les éléments en question. Un moyen simple de confirmer cela consiste à append une classe à l’élément parent, puis à la supprimer. Cela devrait déclencher IE8 pour rendre à nouveau l’élément.

Si contentBlock est l’élément parent, vous pouvez tester les éléments suivants:

Version Javascript:

 // Variable storing the test class name var testClass = "testClass"; // Add test class to element contentBlock.className += " "+testClass; // Remove test class from element var reg = new RegExp('(\\s|^)'+testClass+'(\\s|$)'); contentBlock.className=contentBlock.className.replace(reg,' '); 

Version jQuery:

 // Variable storing the test class name var testClass = "testClass"; // Add test class to element and then remove it $('#divResults').addClass(testClass).removeClass(testClass); 

Il suffit de le mettre à la fin de la fonction après avoir ajoutéChild. Espérons que cela devrait résoudre votre problème.

Référence: http://www.openjs.com/scripts/dom/class_manipulation.php