Entspricht jQuery .hide (), um die Sichtbarkeit festzulegen: versteckt


340

In jQuery gibt es .hide()und .show()Methoden , die die CSS setzt display: noneEinstellung.

Gibt es eine äquivalente Funktion, die die visibility: hiddenEinstellung festlegen würde ?

Ich weiß, dass ich verwenden kann, .css()aber ich bevorzuge eine Funktion wie .hide()oder so. Vielen Dank.


2
Sie können Ihre eigenen basierend auf.toggle()
zerkms

Ich bin auch ein Fan von jQuerys toggleClass () -Methode dafür :) jqueryui.com/toggleClass Schauen Sie sich das Beispiel an, das ich in meiner Antwort unter stackoverflow.com/a/14632687/1056713
Chaya Cooper

Antworten:


426

Sie könnten Ihre eigenen Plugins erstellen.

jQuery.fn.visible = function() {
    return this.css('visibility', 'visible');
};

jQuery.fn.invisible = function() {
    return this.css('visibility', 'hidden');
};

jQuery.fn.visibilityToggle = function() {
    return this.css('visibility', function(i, visibility) {
        return (visibility == 'visible') ? 'hidden' : 'visible';
    });
};

Wenn Sie die ursprüngliche jQuery überladen möchten toggle(), was ich nicht empfehle ...

!(function($) {
    var toggle = $.fn.toggle;
    $.fn.toggle = function() {
        var args = $.makeArray(arguments),
            lastArg = args.pop();

        if (lastArg == 'visibility') {
            return this.visibilityToggle();
        }

        return toggle.apply(this, arguments);
    };
})(jQuery);

jsFiddle .


@Tomas Sie müssten Schatten, toggle()die andere Skripte brechen könnten. Wenn Sie möchten , können Sie ein zusätzliches Argument hinzufügen, toggle()um anzugeben, ob umgeschaltet werden soll visibilityoder displaynicht. Ich würde jedoch nur die benutzerdefinierte in meinem letzten Beispiel verwenden. :)
Alex

Könnten Sie ein Beispiel zur Unterstützung zusätzlicher Parameter show(Geschwindigkeit, Lockerung, Rückruf) veröffentlichen?
Georg

11
Es ist überflüssig, wenn man es so betrachtet, aber es gibt einen Zweck. Wenn dies mit einem anderen Skript mit einem (function() { })()oder einem ähnlichen Skript verknüpft ist, wird ASI nicht aktiviert, da es wie ein Funktionsaufruf aussieht. Versuchen Sie dies und entfernen Sie das !.
Alex

1
@NoBugs Automatisches Einfügen von Semikolons. Ich habe einen Blog-Beitrag geschrieben darüber geschrieben.
Alex

1
@ VishalSakaria Soweit ich weiß, ist es kein genau definierter Begriff, daher sollte es in Ordnung sein, ihn hier zu verwenden.
Alex

103

Es gibt keine eingebaute, aber Sie können ganz einfach Ihre eigene schreiben:

(function($) {
    $.fn.invisible = function() {
        return this.each(function() {
            $(this).css("visibility", "hidden");
        });
    };
    $.fn.visible = function() {
        return this.each(function() {
            $(this).css("visibility", "visible");
        });
    };
}(jQuery));

Sie können dies dann so nennen:

$("#someElem").invisible();
$("#someOther").visible();

Hier ist ein Arbeitsbeispiel .


1
Guter Punkt, nur eine Kraft der Gewohnheit. Vielen Dank. +1 auf Alex 'Antwort!
James Allardice

Nur neugierig, was bringt es, diese beiden Funktionen in den (function($) {...}(jQuery));Wrapper zu packen? Ich habe noch nie meine eigenen Funktionen in jQuery definiert, ich habe immer nur Funktionen in reinem JavaScript definiert.
VoidKing

2
@VoidKing - Dies ist nur die "Best Practice" für jQuery-Plugins gemäß den Dokumenten. Sie können den $Bezeichner innerhalb der Funktion verwenden, auch wenn er sich auf etwas anderes im übergeordneten Bereich bezieht.
James Allardice

jQuery hat tatsächlich eine eingebaute toggleClass () -Methode dafür :) jqueryui.com/toggleClass Schauen Sie sich das Beispiel an, das ich in meiner Antwort unter stackoverflow.com/a/14632687/1056713
Chaya Cooper

55

Eine noch einfachere Möglichkeit, dies zu tun, ist die Verwendung von jQuery's toggleClass () -Methode von

CSS

.newClass{visibility: hidden}

HTML

<a href="#" class=trigger>Trigger Element </a>
<div class="hidden_element">Some Content</div>

JS

$(document).ready(function(){
    $(".trigger").click(function(){
        $(".hidden_element").toggleClass("newClass");
    });
});

1
Ich mag diesen Ansatz. Es ist weniger eigenständig, da es ein separates Stylesheet erfordert, aber es hilft, alle Style-Informationen in den Stylesheets zu behalten, zu denen es gehören sollte. Wenn Sie die Sichtbarkeit deaktivieren möchten, können Sie ein CSS-Tag an einer Stelle ändern, anstatt Ihren gesamten JS-Code zu ändern.
Vaughan

19
Für Benutzer von Bootstrap wird diese Klasse als unsichtbar bezeichnet.
user239558

25

Wenn Sie nur die Standardfunktionalität von Ausblenden nur mit Sichtbarkeit benötigen: Ausgeblendet, um das aktuelle Layout beizubehalten, können Sie die Rückruffunktion von Ausblenden verwenden, um das CSS im Tag zu ändern. Dokumente in jquery ausblenden

Ein Beispiel :

$('#subs_selection_box').fadeOut('slow', function() {
      $(this).css({"visibility":"hidden"});
      $(this).css({"display":"block"});
});

Dies verwendet die normale coole Animation, um das Div auszublenden, aber nach Abschluss der Animation setzen Sie die Sichtbarkeit auf ausgeblendet und die Anzeige auf Blockieren.

Ein Beispiel : http://jsfiddle.net/bTkKG/1/

Ich weiß, dass Sie die Lösung $ ("# aa"). Css () nicht wollten, aber Sie haben nicht angegeben, ob dies daran liegt, dass Sie die Animation verlieren, wenn Sie nur die Methode css () verwenden.


2

Hier ist eine Implementierung, wie sie funktioniert $.prop(name[,value])oder $.attr(name[,value])funktioniert. Wenn die bVariable gefüllt ist, wird die Sichtbarkeit entsprechend festgelegt und thiszurückgegeben (um mit anderen Eigenschaften fortzufahren), andernfalls wird der Sichtbarkeitswert zurückgegeben.

jQuery.fn.visible = function (b) {
    if(b === undefined)
        return this.css('visibility')=="visible";
    else {
        this.css('visibility', b? 'visible' : 'hidden');
        return this;
    }
}

Beispiel:

$("#result").visible(true).on('click',someFunction);
if($("#result").visible())
    do_something;

1

Reines JS- Äquivalent für jQuery hide () / show ():

function hide(el) {
    el.style.visibility = 'hidden';    
    return el;
}

function show(el) {
    el.style.visibility = 'visible';    
    return el;
}

hide(document.querySelector(".test"));
// hide($('.test')[0])   // usage with jQuery

Wir verwenden return elaufgrund der fließenden Schnittstelle "Designmuster".

Hier ist ein Arbeitsbeispiel .


Im Folgenden biete ich auch eine sehr nicht empfohlene Alternative an, die jedoch wahrscheinlich eher "nah an der Frage" ist:

HTMLElement.prototype.hide = function() {
    this.style.visibility = 'hidden';  
    return this;
}

HTMLElement.prototype.show = function() {
    this.style.visibility = 'visible';  
    return this;
}

document.querySelector(".test1").hide();
// $('.test1')[0].hide();   // usage with jQuery

Natürlich implementiert dies nicht jQuery 'each' (angegeben in @JamesAllardice Antwort von ), da wir hier reine js verwenden.

Arbeitsbeispiel ist hier .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.