2009-11-17 7 views
0

J'ai un problème avec FIREFOX. J'ai un contrôle de liste invisible sur un contrôle déroulant (html 'select'). Cela ne me dérange pas, mais je dirai que la surcouche est une fenêtre qui apparaît dans le cadre d'un autre contrôle personnalisé.Les contrôles dans Firefox reçoivent-ils des événements de souris lorsque leur propriété visible CSS est false?

Même s'il est masqué, il m'empêche de cliquer sur le contrôle déroulant sous-jacent, rendant le contrôle sous-jacent désactivé. Ce n'est pas désactivé cependant, parce que je peux tabuler dessus. Je ne peux pas cliquer dessus. Je sais que c'est l'overlay qui cause le problème, parce que j'ai déplacé le contrôle sous-jacent sur le côté et ça marche à nouveau.

Est-ce un bug dans Firefox? Ce n'est pas comme définir une valeur de translucidité; c'est désactiver complètement le rendu du contrôle, donc je ne pense pas qu'un tel contrôle invisible devrait intercepter les événements de la souris. Ce problème ne se produit pas dans Internet Explorer.

Il existe peut-être une autre propriété CSS que je peux définir en JavaScript pour basculer sa capacité de capture d'événement de souris avec sa visibilité.

dd = document.getElementById('lstStudents'); 
if (dd.style.visibility == 'hidden') dd.style.visibility = 'visible'; else dd.style.visibility = 'hidden'; 

Mise à jour: Je viens de lire une description de la valeur de visibilité CSS « ​​cachée » qui a lu « L'élément est invisible (mais occupe toujours l'espace) ». Donc je suppose que je vais devoir mettre sa hauteur à zéro et régler sa visibilité pour résoudre ce problème.

+0

Comment rends-tu le 'contrôle invisible de la liste' invisible? Exemple de code? –

+0

Propriété de visibilité CSS, basculée via javascript. Le style initial du contrôle a la visibilité définie sur "caché" avant que tout JavaScript ne soit jamais exécuté dessus. C'est une différence CLAIRE de comportement entre IE et Firefox (3.5.5). – Triynko

Répondre

1

Modifiez l'index z de votre contrôle de couche supérieure, par exemple, -1. style = "z-index: -1;" Cela le placera sous tout, permettant un accès direct à la liste déroulante. Vous devrez peut-être modifier dynamiquement l'index z pour rétablir le calque sur le dessus lorsqu'il est visible.

More info

+0

Le placer sous tout est une bonne idée, et comme c'est un popup, je pourrais facilement mettre l'index z à une valeur très élevée quand il est visible. Cependant, cela me dérange qu'il peut recevoir des événements alors qu'il est supposé être caché, et je ne veux pas avoir à définir deux propriétés (visibilité et z-index), et je ne veux pas non plus mettre une de ces propriétés à une valeur arbitraire comme un index z "élevé". – Triynko

+0

En outre, cela ne fonctionnera pas dans ma situation (et probablement beaucoup d'autres), car le contrôle est imbriqué dans les éléments div, qui ont tous leurs propres z-index, donc la définition de l'index z sur l'élément ne fera pas différence dans la mesure où il chevauche d'autres contrôles qui ne sont pas dans la même div. – Triynko

0

Comment cachez-vous l'élément? Si je me souviens bien, la «visibilité: cachée» est censée (à juste titre) fonctionner comme vous le décrivez, alors que «afficher: aucun» bannira complètement le rendu.

Si ce n'est pas la cause, pouvez-vous confirmer à l'aide de Web Developer Toolbar que c'est bien le contrôle invisible qui cause le problème et pas un autre dont l'opacité est définie sur 0 ou autre?

+0

Affichage aucun ne fonctionnera probablement, mais alors je suis coincé en essayant de restaurer à une valeur d'affichage qui pourrait être un nombre de valeurs (bloc, inline, etc.), et je ne veux pas coder en dur cette valeur originale mon javascript. J'ai besoin d'une propriété booléenne comme la visibilité. Cela m'attriste que cela fonctionne dans IE mais pas Firefox. – Triynko

+0

Je pense que FF est juste ici et IE est faux, au moins autant que je comprends l'attribut "visibilité". Que diriez-vous de stocker la valeur d'affichage d'origine dans l'élément? –

+0

Cela semble être une bonne solution pour l'instant et c'est ce que j'utilise, mais je ne vais pas le marquer comme la réponse jusqu'à ce que je constate le comportement correct, car c'est différent entre IE et Firefox. Ce genre de problème est la raison pour laquelle j'utilise Flash, qui fonctionne parfaitement pour les interfaces Web. Il possède des propriétés spécifiques enabled et mouseEnabled, en plus des propriétés visibles et alpha. – Triynko

0

La façon dont j'ai fait les popups avant dans Firefox était avec les propriétés CSS.

z-index: 500; 
display: block; 

pour montrer un élément, et

z-index: -10; 
display: none; 

pour le cacher.

Maintenant. Mes valeurs pour z-index sont extrêmes, mais c'est exactement ce que j'ai choisi. Cela fonctionne pour moi, mais mon application ciblait spécifiquement Firefox; aaaaand j'utilise la propriété d'affichage, que vous avez déclaré vouloir éviter.

Si vous êtes préoccupé par l'utilisation de display: block ou display: hidden, je pense que vous pourriez essayer de jouer avec le positionnement ou de dimensionner l'élément. Rendez l'élément popup absolument positionné et déplacez-le hors-champ lorsqu'il est invisible, ou essayez de faire 0px width et 0px height quand il est invisible.

C'est deux choses que j'explorerais potentiellement si j'avais encore des problèmes. Je ne suis pas sûr si je recommanderais ces comme les meilleures solutions cependant.

Considérez vraiment le nombre d'instances de vos éléments popup auront différentes valeurs d'affichage, j'ai trouvé dans mon cas d'utiliser seulement deux types, «aucun», et «bloquer». Peut-être que la manipulation de la propriété d'affichage sera suffisante pour vous.

Espérons que cela aide.

+0

Z -index n'aidera pas lorsque les éléments sont imbriqués dans différents éléments div du conteneur. Affichage: aucun n'est réellement la solution la plus intéressante, et le simple fait de mettre la hauteur à zéro serait également une bonne solution de contournement. En fait, j'avais l'habitude d'utiliser uniquement la propriété height pour le masquer, mais il apparaissait drôle sans que la visibilité soit masquée. Je me suis débarrassé du code pour ajuster la hauteur, pensant que c'était trop cher puisque je le rendais invisible ... et c'est à ce moment-là que j'ai rencontré ce problème. Je continue avec l'affichage: aucun pour l'instant car il semble fonctionner correctement sur les deux navigateurs. – Triynko