J'ai une question en deux parties.
D'abord, le scénario :
En raison de certains problèmes bizarres que nous avons rencontrés en ce qui concerne la prise en charge de NOSCRIPT par les navigateurs mobiles, je suis chargé de trouver une solution alternative pour "détecter" JS. La logique de la solution consiste à avoir deux DIVs sur la page. L'un est une erreur indiquant que vous n'avez pas de JS et il est affiché par défaut. Si l'un d'eux contient du JS, nous voulons alors ajouter un nouveau bloc STYLE au HEAD qui remplace le CSS précédent et cache l'erreur pour afficher le contenu.
L'échantillon HTML :
<div id="div1">div 1 (should be shown if JS enabled)</div>
<div id="div2">div 2 (should be hidden if JS enabled)</div>
C'est le JS avec lequel j'ai commencé :
var styleNode = document.createElement('style');
styleNode.setAttribute("type", "text/css");
styleNode.innerHTML = "#div1 {display: block;} #div2 {display: none;}";
headTag.appendChild(styleNode);
Mais, j'avais des problèmes. En cherchant sur Google, j'ai trouvé cette description d'un problème de sécurité que peut rencontrer IE si vous essayez d'insérer innerHTML dans un élément créé avant de le placer dans le DOM :
http://karma.nucleuscms.org/item/101
Donc, j'ai modifié le script comme tel :
var styleNode = document.createElement('style');
styleNode.setAttribute("type", "text/css");
var headTag = document.getElementsByTagName("head")[0];
headTag.appendChild(styleNode);
var aStyleTags = headTag.getElementsByTagName("style");
var justAddedStyleTag = aStyleTags[aStyleTags.length-1];
justAddedStyleTag.innerHTML = "#div1 {display: block;} #div2 {display: none;}";
question 1 : s'agit-il d'une solution de contournement valable pour le problème d'IE ? Existe-t-il une solution plus efficace ?
question 2 : même avec l'ajustement, le script ne fonctionne toujours pas dans IE. Il fonctionne bien dans Firefox, mais dans IE 7, j'obtiens une "erreur d'exécution inconnue".
J'ai un exemple de ce code sur JSBIN :
Quelqu'un sait ce qui se passe avec IE ?
UPDATE :
Je suis tombé sur ce lien via google. Notez le dernier commentaire :
http://msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx
Cela dit, vous devriez vraiment mettre tous règles de style dans le HEAD pour une stricte conformité avec le XHTML. Faire cela peut également être un peu délicate car vous ne pouvez pas utiliser innerHTML pour injecter dans l'élément HEAD ou STYLE directement. (Ces deux balises sont en LECTURE SEULE).
Eep ! Vrai ? Est-ce que FireFox est juste trop indulgent ? Ou est-ce juste une bizarrerie d'IE ?
UPDATE 2 :
Un peu plus d'informations sur ce que nous essayons de résoudre ici. Nous avons affaire à des appareils mobiles et certains de ces appareils archaïques a) ne supportent pas NOSCRIPT et b) ont des moteurs JS lents.
Comme ils ne prennent pas en charge le NOSCRIPT, nous affichons par défaut une erreur, puis nous la masquons via JS s'ils en ont un, et nous leur présentons le contenu approprié. En raison de la lenteur des moteurs JS sur ces sites, les gens voient le "scintillement" de l'affichage et du masquage des DIV. C'est la solution proposée pour gérer cela, car elle charge le CSS avant même que les DIVs ne soient rendus.
Puisqu'il semble être invalide, la solution sera que sur ces anciens appareils, nous utiliserons cette méthode (puisqu'elle semble fonctionner, même si ce n'est pas dans IE) et ensuite tous les autres navigateurs corrects feront comme suggéré... nous mettrons juste à jour la propriété CSS DISPLAY via JS en ligne après que chaque DIV soit chargé dans le DOM.
Cela dit, je suis toujours curieux de savoir si ce problème est un bug d'IE, ou si IE adhère réellement aux normes appropriées en faisant de STYLE un élément en lecture seule.