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.

TMS
quelle
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 .

Alex
quelle
@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 .

James Allardice
quelle
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");
    });
});
Chaya Cooper
quelle
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.

h3ct0r
quelle
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;
Teet Kalm
quelle
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 .

Kamil Kiełczewski
quelle