0

J'essaie de diagnostiquer un problème avec un site plus ancien que celui que je supporte. Le problème est que dans IE8, une balise SELECT est cachée. Il s'avère que c'est dû à une ancienne version d'un calendar.js qui applique le style visibility:hidden non seulement à SELECT Tags, mais aussi aux applets et aux iframes.Pourquoi ces javascripts de calendrier masquent les tags select, applet et iframe pour IE?

Je suis rouillé sur mon javascript et les détails des anciens problèmes de navigateur, mais la chose que je trouve étrange, c'est qu'il cache ces balises lorsqu'elles ne sont pas liées au calendrier. Dans la page avec le problème, cette balise de sélection qui est cachée est dans un div au-dessus des objets de calendrier, bien qu'ils soient dans la même forme.

Est-ce un problème avec une version antérieure de IE? Serait-il «sûr» de mettre un if pour vérifier la version de IE, et ne pas appliquer ces styles pour la version 8 et plus tard?

est ici la fonction de calendar.js:

Calendar.prototype.hideShowCovered = function() { 
    if (!Calendar.is_ie && !Calendar.is_opera) 
    return; 
    function getVisib(obj){ 
    var value = obj.style.visibility; 
    if (!value) { 
     if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C 
     if (!Calendar.is_khtml) 
      value = document.defaultView. 
      getComputedStyle(obj, "").getPropertyValue("visibility"); 
     else 
      value = ''; 
     } else if (obj.currentStyle) { // IE 
     value = obj.currentStyle.visibility; 
     } else 
     value = ''; 
    } 
    return value; 
    }; 

    var tags = new Array("applet", "iframe", "select"); 
    var el = this.element; 

    var p = Calendar.getAbsolutePos(el); 
    var EX1 = p.x; 
    var EX2 = el.offsetWidth + EX1; 
    var EY1 = p.y; 
    var EY2 = el.offsetHeight + EY1; 

    for (var k = tags.length; k > 0;) { 
    var ar = document.getElementsByTagName(tags[--k]); 
    var cc = null; 

    for (var i = ar.length; i > 0;) { 
     cc = ar[--i]; 

     p = Calendar.getAbsolutePos(cc); 
     var CX1 = p.x; 
     var CX2 = cc.offsetWidth + CX1; 
     var CY1 = p.y; 
     var CY2 = cc.offsetHeight + CY1; 

     if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) { 
     if (!cc.__msh_save_visibility) { 
      cc.__msh_save_visibility = getVisib(cc); 
     } 
     cc.style.visibility = cc.__msh_save_visibility; 
     } else { 
     if (!cc.__msh_save_visibility) { 
      cc.__msh_save_visibility = getVisib(cc); 
     } 
     cc.style.visibility = "hidden"; 
     } 
    } 
    } 
}; 

Répondre

4

Ces objets sont/étaient toujours en haut de l'ordre Z, ce qui signifie qu'ils se présenteraient au-dessus de votre calendrier si elle a essayé de figurer sur en haut d'eux.

Ce n'est plus vrai pour select dans n'importe quel navigateur moderne, et (vous auriez besoin de le tester mais) je soupçonne que la même chose est vraie pour iframe. Ils n'ont certainement pas ce problème dans IE8. D'autre part, le problème est presque toujours le problème, étant une fenêtre de poids lourd intégré dans la page. Flash en mode fenêtre lourde aura le même problème aussi.

Questions connexes