Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    View Cyril Durand's profile on LinkedIn

    hit counters

pseudo classe :hover - IE6, UpdatePanel et csshover.htc

CSS permet de définir des pseudos classes, il y a notamment la pseudo classe :hover qui s'applique seulement lorsqu'on passe la souris sur l'élément. On utilise couramment cette technique pour faire des menus, j'avais d'ailleurs fait le menu de la version 8 de CodeS-SourceS ainsi et même un article expliquant les règles CSS utilisés. Le gros problème de ces pseudos classe c'est qu'elles ne sont pas prises en compte par IE6. Il existe cependant un behavior htc qui permet de faire comprendre à IE6 les pseudos règles :hover, :active et :focus : csshover.htc 

Pour rajouter le csshover.htc, il faut utiliser cette syntaxe.

* html body { behavior:url(csshover.htc); } span:hover { color:#F0F; }

Ainsi à chaque fois que la souris passe sur un span, la couleur du texte change, même sous IE6. Le problème est que le csshover.htc fonctionne seulement sur les éléments présents à l'origine du document. Si vous modifier le DOM après le chargement de la feuille de style alors IE6 ne prendra plus en compte le :hover sur les nouveaux éléments.

Ainsi, dans l'exemple ci-dessous, le span ne changera pas de couleur après avoir cliquer sur le bouton :

<asp:ScriptManager runat="server" /> <asp:UpdatePanel runat="server"> <ContentTemplate> <span>pouet</span> <asp:Button runat="server" /> </ContentTemplate> </asp:UpdatePanel>

Ma première idée a été de modifier le fichier csshover.htc, notamment la fonction parseStylesheets :

// this solution doesn't work ! var firstCall = true; function parseStylesheets() { if(!/MSIE (5|6)/.test(navigator.userAgent)) return; if (firstCall){ Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(function(sender, args){ if (args.get_isPartialLoad()) parseStylesheets(); }); } firstCall = false; window.attachEvent('onunload', unhookHoverEvents); var sheets = doc.styleSheets, l = sheets.length; for(var i=0; i<l; i++) parseStylesheet(sheets[ i ]); }

Malheureusement il est impossible de passer un objet Function vers le contexte de la page ! Je n'ai rien trouvé sur le net qui explique le problème. Si quelqu'un a une explication, je suis preneur.

Ma seconde idée est d'utiliser window.setTimeout pour relancer la fonction à intervalle régulier :

function parseStylesheets() { if(!/MSIE (5|6)/.test(navigator.userAgent)) return; window.attachEvent('onunload', unhookHoverEvents); var sheets = doc.styleSheets, l = sheets.length; for(var i=0; i<l; i++) parseStylesheet(sheets[ i ]); window.setTimeout(parseStylesheets, 1000); }

[Update] : On peut bien sur optimiser cette solution, mais suite aux commentaires de FremyCompany, voici une solution bien plus propre que ce je proposais. Il faut mettre la fonction parseStylessheets dans l'objet window.

var firstCall = true;
function parseStylesheets() {
   
if(!/MSIE (5|6)/.test(navigator.userAgent)) return;
   
var sheets = doc.styleSheets, l = sheets.length;

    if(firstCall){
        window.attachEvent('onunload', unhookHoverEvents);
        window.parseStylesheets = parseStylesheets
;
        firstCall
= false;
    } else {
        hoverEvents = [];

        unhookHoverEvents();
    }
    
   
for(var i=0; i<l; i++)
        parseStylesheet(sheets[ i ]);
}

Puis dans votre page rajouter

window.pageLoad = function(sender, args){ if (args.get_isPartialLoad() && window.checkParseStylesheets){ window.checkParseStylesheets() } }

Si vous utiliser un script externe, je vous conseille de passer par cette syntaxe :

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(function(sender, args){ if (args.get_isPartialLoad() && window.checkParseStylesheets){ window.checkParseStylesheets() } });

Cette solution vous permettra, en un minimum de temps, de rendre votre application web compatible avec ce vieux navigateur qui reste malheureusement beaucoup trop utilisés.

Posted: dimanche 6 janvier 2008 13:34 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

FREMYCOMPANY a dit :

J'avoue que je ne connaissais pas ce behavior donc ce post me semble très utile !

Néamoins, si c'est du JavaScript qui se charge de faire un parsing CSS puis d'attacher des mouseover/mouseout un peu partout, n'est-ce pas un peu dangereux niveau réactivité ? Je veux dire par là : Le browser (IE6 en l'occurrence) ne risque-t-il pas d'avoir des "moments d'absence ?" ou de trainer la patte quand on bouge la souris ?

# janvier 6, 2008 15:35

FREMYCOMPANY a dit :

J'ai trouvé une solution pour éviter setTimeout Wink

Je te contacte par mail pour t'envoyer le code (histoire aussi que tu teste chez toi, vu que moi je n'ai qu'un Multiple IE6 pour tester)

# janvier 6, 2008 16:02

Chadom a dit :

Je sais bien que IE6 est (malheureusement) encore bcp utilisé... Mais IMHO ça ne vaut plus le coût de faire des hack de ce type pour cet ancêtre bien périmés. Poussons plutôt les utilisateurs à se mettre à jour et utiliser IE7/Fx/Opéra !

# janvier 6, 2008 19:04

Promesses a dit :

Merci Cyril pour cette note.

@Chadom: malheureusement, chez FT, ou je travaille, c'est pas aussi simple...

# janvier 7, 2008 14:07
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- La même chose en TPT par Matthieu MEZIL le il y a 16 minutes

- L'injection SQL n'est PAS un problème QUE pour les développeurs web ! par CoqBlog le il y a 1 heure et 12 minutes

- Un outil pour réaliser des animations WPF basées sur des équations de Bézier par Perspective le il y a 4 heures et 35 minutes

- Sandcastle et CodePlex : le verdict par CoqBlog le il y a 5 heures et 26 minutes

- ssdl view and TPH par Matthieu MEZIL le il y a 7 heures et 8 minutes

- Webcasts sur le Parallel Framework disponibles par Matthieu MEZIL le il y a 8 heures et 54 minutes

- [Silverlight] - Comprendre et Débuter avec Silverlight par Danuz le il y a 13 heures et 39 minutes

- SharePoint : Nouvel article sur l'exportation et Importation de sites SharePoint par Blog Technique de Romelard Fabrice le 07-04-2008, 01:00

- ImagineCup 2008 Final in Paris: Day 1 par Richard Clark le 07-03-2008, 22:48

- PowerShell : Comment utiliser un ENUM .NET dans un script PowerShell par Blog Technique de Romelard Fabrice le 07-03-2008, 18:09