10
votes

Comment détecter si un élément n'est pas visible de manière rapide en JavaScript?

Dans le passé, nous avons utilisé l'attribut CSS "Affichage" pour afficher et masquer les éléments DOM. Pour vérifier si un élément est visible, nous pourrions simplement utiliser:

element.offsetWidth > 0
  • Vérification de l'attribut lui-même sur l'élément et tous les parents => trop lent li>
  • Vérification du style calculé directement à partir du navigateur (élément.CurrentStyle ou fenêtre.getComp députétyle () plus getpropertyvalue (propriété de style)) => aussi trop lent li> ul>

    Connaissez-vous une autre manière ou un raccourci pour voir si un élément est visible? p> p>


5 commentaires

Je suppose simplement stocker l'état dans une variable quelque part et la mise à jour à chaque fois que vous modifiez la visibilité est hors de la question ...


Pas vraiment une réponse, mais vous pouvez vérifier le code source de certaines bibliothèques JS comme JQuery ou MotoTools pour voir comment ils le font.


@Greg: vous êtes correct - ce serait trop au-dessus de la tête. Vous devez mettre à jour tous les enfants d'un élément quand il devient changé ... @darko z: J'ai déjà regardé JQuery, mais je vais vérifier motools maintenant ...


Pourquoi considérez-vous vos alternatives à être trop lentes?


@Gumbo: C'est trop lent, car nous parlons de centaines d'éléments qui sont vérifiés pendant la durée de vie d'une application Web. Je n'ai pas besoin de cette vérification pour juste un site Web, mais pour un framework Ajax: qooxdoo.org


6 Réponses :


0
votes

Visibilité de l'élément de bascule par Kent est un moyen de présentation non obstrissel et sémantiquement valide qui se dégradera bien pour Navigateurs non compatibles non-CSS.

  • Une fois la page chargée complètement, nous ramassons dans l'ensemble de l'arborescence de document et recherchez des éléments de niveau de blocs conçu avec Nom de classe Basculer. Si nous en trouvons un qui dit à basculer fermé, nous cachons immédiatement son prochain élément de frère, en côtoient avec un nom de classe caché.
  • Quand nous en trouvons un, nous le disons d'écouter des clics de souris.
  • Lorsque l'un de nos éléments d'animal d'animal entend un clic, il saute en action, caché (ou montrant) son prochain frère disponible disponible, de la même manière que nous l'avons fait lors de la valorisation initiale.
  • Les trois noms de classe (basculer, fermé et masqué) sont introduits en bas dans l'appel initial et peuvent être modifiés par n'importe quel nom de classe valide.

    Regardez également ce Article Devx qui compare les propriétés d'affichage et de visibilité. < / p>


3 commentaires

Bien que les liens que vous avez fournis soient appropriés, je pense que certains électeurs n'aiment pas que de simples réponses ...


Mon objectif est de fournir de l'aide à celui qui a besoin de réponses, et si des liens peuvent le faire, cela ne me dérange pas d'avoir des votes négatifs ... au détriment de la fourniture d'aide.


+1 - D'accord alors. Je pense que la bibliothèque JS "Togling Element" est le point culminant de la poste. Joli.



7
votes

Utilisez jQuery et vous pouvez faire ce xxx


3 commentaires

Voici ma configuration de test:

test $ ('# fils'). Est-ce que :visible'); -> vrai $ ('# fils'). CSS ("Visibilité") -> "caché" La partie intéressante est la manière dont JQuery obtient cette valeur. S'il utilise l'un de mes essais, cela ne vous aide pas, car ils sont trop lents ...


C'est la méthode la plus rapide que vous puissiez comprendre?


Non, regardez la bibliothèque "Visibilité des éléments de basculement" ci-dessous.



-1
votes

Les sélecteurs CSS sont optimisés pour trouver des ensembles d'éléments correspondants. Plusieurs bibliothèques mettent en œuvre cette fonctionnalité. JQuery, extjs noyau pour nommer un couple.

Utilisation de EXT Core, je pourrais écrire une fonction JavaScript qui vérifie la visibilité comme suit: xxx

voir http://extjs.com/products/extcore/docs/?class=ext.Element pour plus de fonctionnalité extorate ext.Element.


0 commentaires

3
votes

N'oubliez pas que la visibilité: cachée fait un élément caché, mais cet élément occupe toujours son espace, qui peut avoir des conséquences inattendues sur la mise en page (cela peut être un avantage également si vous en êtes au courant).

i Utiliserait un positionnement absolu pour déplacer l'élément loin à gauche, en dehors de la largeur d'écran. Ceci obtient l'élément hors du flux afin que l'élément caché n'a aucun impact sur la mise en page, rend l'élément pratiquement invisible, et il n'a pas les désamorçages de l'affichage: Aucun. xxx

puis pour déterminer si un élément est masqué, vous pouvez utiliser sa propriété offsetleft: xxx

si vous devez déterminer Si un élément enfant est éteint (vous ne savez pas si c'est l'élément caché ou son enfant), vous pouvez utiliser .OffsetParent et une boucle de temps, comme décrit dans Article de la position de la position de PPK .


2 commentaires

Merci Pawel, c'est la meilleure réponse maintenant. Le problème est que tous nos éléments DOM ont des styles en ligne pour un positionnement absolu, de sorte que la valeur "gauche" de la classe ne serait pas appliquée. Mais vous répondez approche de ce que je recherche!


Le problème avec cette solution est qu'il ne la cache pas des navigateurs non compatibles non-CSS, tels que les lecteurs d'écran. Cela peut être un avantage si vous voulez que le texte soit disponible uniquement pour les lecteurs d'écran, mais dans ce cas, cela ressemble à un inconvénient.



-1
votes
function isVisible(elem) {
  return elem.style.visibility !== "hidden";
}

1 commentaires

Cela ne fonctionnera pas si l'élément lui-même n'a pas d'attribut de visibilité, mais hérite de la valeur de son parent.



0
votes

Vérification de la mise au point fonctionnerait, soit le parent est visible ou non.

$(":text:visible:enabled").filter(function(){
    return $(this).parents.filter(function(){
        return this.style.display == "none"; 
    }).size()==0;
}).slice(0,1).focus();


0 commentaires