8662 Stimmen

Wie prüfe ich, ob ein Element in jQuery ausgeblendet ist?

Ist es möglich, die Sichtbarkeit eines Elements umzuschalten, indem man die Funktionen .hide() , .show() ou .toggle() ?

Wie würden Sie testen, ob ein Element visible ou hidden ?

68 Stimmen

Es ist erwähnenswert (auch nach all dieser Zeit), dass $(element).is(":visible") funktioniert für jQuery 1.4.4, aber nicht für jQuery 1.3.2, unter Internet Explorer 8 . Dies kann getestet werden mit Tsvetomir Tsonevs hilfreiches Test-Snippet . Denken Sie einfach daran, die Version von jQuery zu ändern, um unter jedem zu testen.

5 Stimmen

Dies ist eine verwandte, wenn auch andere Frage: stackoverflow.com/questions/17425543/

2 Stimmen

Wenn Sie nicht an der virtuellen Ausblendung von CSS-Elementen interessiert sind, sondern an der physischen Sichtbarkeit im "Viewport-Bereich" für den Benutzer, dann sollten Sie sich Folgendes ansehen stackoverflow.com/questions/487073/ y stackoverflow.com/questions/123999/

332voto

Simon_Weaver Punkte 129442

Wenn man prüft, ob etwas sichtbar ist oder nicht, geht man oft gleich weiter und macht etwas anderes damit. jQuery chaining macht dies einfach.

Wenn Sie also einen Selektor haben und eine Aktion nur dann ausführen wollen, wenn er sichtbar oder versteckt ist, können Sie filter(":visible") ou filter(":hidden") gefolgt von der Verkettung mit der Aktion, die Sie durchführen möchten.

Anstelle einer if Aussage, etwa so:

if ($('#btnUpdate').is(":visible"))
{
     $('#btnUpdate').animate({ width: "toggle" });   // Hide button
}

Oder effizienter, aber noch hässlicher:

var button = $('#btnUpdate');
if (button.is(":visible"))
{
     button.animate({ width: "toggle" });   // Hide button
}

Sie können das alles in einer Zeile machen:

$('#btnUpdate').filter(":visible").animate({ width: "toggle" });

25 Stimmen

Es gibt keinen Grund, den DOM-Knoten in dem im Beispiel verwendeten Schnipsel zu extrahieren, um ihn dann erneut nachzuschlagen. Besser ist es, einfach zu tun: var $button = $('#btnUpdate'); Und dann in den If-Ausdrücken einfach $button anstelle von $(button) verwenden. Das hat den Vorteil, dass das jQuery-Objekt zwischengespeichert wird.

2 Stimmen

Hier ein einfaches Beispiel jquerypot.com/

273voto

Pedro Rainho Punkte 4086

Le site :visible Selektor nach die jQuery-Dokumentation :

  • Sie haben ein CSS display Wert von none .
  • Sie sind Formularelemente mit type="hidden" .
  • Ihre Breite und Höhe werden ausdrücklich auf 0 gesetzt.
  • Ein Vorgängerelement ist ausgeblendet, d. h. das Element wird auf der Seite nicht angezeigt.

Elemente mit visibility: hidden ou opacity: 0 gelten als sichtbar, da sie noch Platz im Layout beanspruchen.

Dies ist in einigen Fällen nützlich und in anderen nutzlos, denn wenn Sie prüfen wollen, ob das Element sichtbar ist ( display != none ), wobei die Sichtbarkeit der Eltern ignoriert wird, werden Sie feststellen, dass die .css("display") == 'none' ist nicht nur schneller, sondern gibt auch die Sichtbarkeitsprüfung korrekt zurück.

Wenn Sie die Sichtbarkeit statt der Anzeige prüfen wollen, sollten Sie dies tun: .css("visibility") == "hidden" .

Berücksichtigen Sie auch die zusätzlichen jQuery-Hinweise :

Denn :visible ist eine jQuery-Erweiterung und nicht Teil der CSS-Spezifikation, Abfragen mit :visible nicht von der Leistungssteigerung durch das native DOM profitieren können querySelectorAll() Methode. Um die beste Leistung zu erzielen, wenn Sie :visible um Elemente auszuwählen, wählen Sie die Elemente zunächst mit einem reinen CSS-Selektor aus und verwenden dann .filter(":visible") .

Wenn Sie sich Sorgen um die Leistung machen, sollten Sie außerdem Folgendes prüfen Jetzt siehst du mich Leistung anzeigen/verbergen (2010-05-04). Und verwenden Sie andere Methoden zum Ein- und Ausblenden von Elementen.

243voto

webvitaly Punkte 4080

Wie Element Sichtbarkeit und jQuery funktioniert ;

Ein Element kann versteckt werden mit display:none , visibility:hidden ou opacity:0 . Der Unterschied zwischen diesen Methoden:

  • display:none blendet das Element aus, so dass es keinen Platz beansprucht;
  • visibility:hidden blendet das Element aus, aber es nimmt weiterhin Platz im Layout ein;
  • opacity:0 verbirgt das Element als "visibility:hidden", und es nimmt immer noch Platz im Layout ein; der einzige Unterschied ist, dass man mit opacity ein Element teilweise transparent machen kann;

    if ($('.target').is(':hidden')) {
      $('.target').show();
    } else {
      $('.target').hide();
    }
    if ($('.target').is(':visible')) {
      $('.target').hide();
    } else {
      $('.target').show();
    }
    
    if ($('.target-visibility').css('visibility') == 'hidden') {
      $('.target-visibility').css({
        visibility: "visible",
        display: ""
      });
    } else {
      $('.target-visibility').css({
        visibility: "hidden",
        display: ""
      });
    }
    
    if ($('.target-visibility').css('opacity') == "0") {
      $('.target-visibility').css({
        opacity: "1",
        display: ""
      });
    } else {
      $('.target-visibility').css({
        opacity: "0",
        display: ""
      });
    }

    Nützliche jQuery Toggle-Methoden:

    $('.click').click(function() {
      $('.target').toggle();
    });
    
    $('.click').click(function() {
      $('.target').slideToggle();
    });
    
    $('.click').click(function() {
      $('.target').fadeToggle();
    });

22 Stimmen

Ein weiterer Unterschied zwischen visibility:hidden y opacity:0 ist, dass das Element weiterhin auf Ereignisse (wie Klicks) mit opacity:0 . Ich habe diesen Trick beim Erstellen einer benutzerdefinierten Schaltfläche für Datei-Uploads gelernt.

3 Stimmen

Auch wenn Sie die Eingabe mit Opazität:0 ausblenden, wird sie mit der Tabulatortaste ausgewählt

239voto

Abiy Punkte 2333

Das funktioniert bei mir, und ich verwende show() et hide() um mein Div versteckt/sichtbar zu machen:

if( $(this).css('display') == 'none' ){
    /* your code goes here */
} else {
    /* alternate logic   */
}

185voto

Matt Brock Punkte 5182

Sie können dies auch mit einfachem JavaScript tun:

function isRendered(domObj) {
    if ((domObj.nodeType != 1) || (domObj == document.body)) {
        return true;
    }
    if (domObj.currentStyle && domObj.currentStyle["display"] != "none" && domObj.currentStyle["visibility"] != "hidden") {
        return isRendered(domObj.parentNode);
    } else if (window.getComputedStyle) {
        var cs = document.defaultView.getComputedStyle(domObj, null);
        if (cs.getPropertyValue("display") != "none" && cs.getPropertyValue("visibility") != "hidden") {
            return isRendered(domObj.parentNode);
        }
    }
    return false;
}

Anmerkungen:

  1. Funktioniert überall

  2. Funktioniert bei verschachtelten Elementen

  3. Funktioniert für CSS und Inline-Stile

  4. Benötigt keinen Rahmen

7 Stimmen

Funktioniert etwas anders als die von jQuery; sie berücksichtigt visibility: hidden zu sein sichtbar .

5 Stimmen

Es ist einfach genug, den obigen Code zu ändern, um das (wohl dumme) jQuery-Verhalten zu imitieren. . . . . function isRendered(o){if((o.nodeType!=1)||(o==document.body)){return true;}if(o.currentStyle&&o.currentStyle["display"]!="none"){return isRendered(o. parentNode);}else if(window.getComputedStyle){if(document.defaultView.getComputedStyle(o, null).getPropertyValue("display")!="none"){return isRendered(o.parentNode);}}return false;}

4 Stimmen

Sicher, ich habe das nur hinzugefügt, um den Nutzern zu helfen, die das Programm ohne Scannen des Codes verwenden :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X