[javascript] Come posso verificare se un elemento è nascosto in jQuery?


Answers

Puoi usare il selettore hidden :

// Matches all elements that are hidden
$('element:hidden')

E il selettore visible :

// Matches all elements that are visible
$('element:visible')
Question

È possibile alternare la visibilità di un elemento, usando le funzioni .hide() , .toggle() o .toggle() .

Come verificherai se un elemento è visibile o nascosto?




Nessuna di queste risposte risponde a quello che capisco essere la domanda, che è quello che stavo cercando, "Come gestisco gli oggetti che hanno visibility: hidden ?" . Né :visible:hidden gestirà questo, in quanto entrambi cercano la visualizzazione per la documentazione. Per quanto ho potuto determinare, non esiste un selettore per gestire la visibilità CSS. Ecco come ho risolto (selettori jQuery standard, potrebbe esserci una sintassi più sintetica):

$(".item").each(function() {
    if ($(this).css("visibility") == "hidden") {
        // handle non visible state
    } else {
        // handle visible state
    }
});



Si può semplicemente usare l'attributo hidden o visible , come:

$('element:hidden')
$('element:visible')

O è possibile semplificare lo stesso con è il seguente.

$(element).is(":visible")



Vorrei usare la classe CSS .hide { display: none!important; } .hide { display: none!important; } .

Per nascondere / mostrare, chiamo .addClass("hide")/.removeClass("hide") . Per verificare la visibilità, utilizzo .hasClass("hide") .

È un modo semplice e chiaro per controllare / nascondere / mostrare gli elementi, se non si prevede di utilizzare i .toggle() o .animate() .




Spesso quando controlli se qualcosa è visibile o no, vai subito avanti e fai qualcos'altro con esso. jQuery concatenare rende tutto questo facile.

Quindi se hai un selettore e vuoi eseguire qualche azione su di esso solo se è visibile o nascosto, puoi usare filter(":visible") o filter(":hidden") seguito dal concatenarlo con l'azione che vuoi prendere.

Quindi, invece di un'istruzione if , come questa:

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

O più efficiente, ma anche più brutto:

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

Puoi fare tutto in un'unica riga:

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



È possibile creare una funzione per verificare la visibilità / gli attributi di visualizzazione al fine di valutare se l'elemento è mostrato nell'interfaccia utente o meno.

function checkUIElementVisible(element) {
    return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden'));
}

Fiddle che lavora




Inoltre, ecco un'espressione condizionale ternaria per controllare lo stato dell'elemento e quindi per alternarlo:

$('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });



if($('#postcode_div').is(':visible')) {
    if($('#postcode_text').val()=='') {
        $('#spanPost').text('\u00a0');
    } else {
        $('#spanPost').text($('#postcode_text').val());
}



Questo funziona per me, e sto usando show() e hide() per rendere il mio div nascosto / visibile:

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



Per verificare se non è visibile io uso ! :

if ( !$('#book').is(':visible')) {
    alert('#book is not visible')
}

O il seguente è anche il sam, salvando il selettore jQuery in una variabile per avere prestazioni migliori quando ne hai bisogno più volte:

var $book = $('#book')

if(!$book.is(':visible')) {
    alert('#book is not visible')
}



Dopotutto, nessuno degli esempi mi va bene, così ho scritto il mio.

Test (nessun supporto del filter:alpha di Internet Explorer filter:alpha ):

a) Controllare se il documento non è nascosto

b) Controlla se un elemento ha zero larghezza / altezza / opacità o display:none / visibility:hidden negli stili in linea

c) Controlla se il centro (anche perché è più veloce di testare ogni pixel / angolo) dell'elemento non è nascosto da un altro elemento (e da tutti gli antenati, esempio: overflow:hidden / scorri / un elemento sopra l'altro) o bordi dello schermo

d) Verifica se un elemento ha zero larghezza / altezza / opacità o display:none / visibilità: nascosto negli stili calcolati (tra tutti gli antenati)

Testato su

Android 4.4 (browser nativo / Chrome / Firefox), Firefox (Windows / Mac), Chrome (Windows / Mac), Opera (Windows Presto / Mac Webkit), Internet Explorer (modalità documento Internet Explorer 5-11 + Internet Explorer 8 su una macchina virtuale), Safari (Windows / Mac / iOS)

var is_visible = (function () {
    var x = window.pageXOffset ? window.pageXOffset + window.innerWidth - 1 : 0,
        y = window.pageYOffset ? window.pageYOffset + window.innerHeight - 1 : 0,
        relative = !!((!x && !y) || !document.elementFromPoint(x, y));
        function inside(child, parent) {
            while(child){
                if (child === parent) return true;
                child = child.parentNode;
            }
        return false;
    };
    return function (elem) {
        if (
            document.hidden ||
            elem.offsetWidth==0 ||
            elem.offsetHeight==0 ||
            elem.style.visibility=='hidden' ||
            elem.style.display=='none' ||
            elem.style.opacity===0
        ) return false;
        var rect = elem.getBoundingClientRect();
        if (relative) {
            if (!inside(document.elementFromPoint(rect.left + elem.offsetWidth/2, rect.top + elem.offsetHeight/2),elem)) return false;
        } else if (
            !inside(document.elementFromPoint(rect.left + elem.offsetWidth/2 + window.pageXOffset, rect.top + elem.offsetHeight/2 + window.pageYOffset), elem) ||
            (
                rect.top + elem.offsetHeight/2 < 0 ||
                rect.left + elem.offsetWidth/2 < 0 ||
                rect.bottom - elem.offsetHeight/2 > (window.innerHeight || document.documentElement.clientHeight) ||
                rect.right - elem.offsetWidth/2 > (window.innerWidth || document.documentElement.clientWidth)
            )
        ) return false;
        if (window.getComputedStyle || elem.currentStyle) {
            var el = elem,
                comp = null;
            while (el) {
                if (el === document) {break;} else if(!el.parentNode) return false;
                comp = window.getComputedStyle ? window.getComputedStyle(el, null) : el.currentStyle;
                if (comp && (comp.visibility=='hidden' || comp.display == 'none' || (typeof comp.opacity !=='undefined' && comp.opacity != 1))) return false;
                el = el.parentNode;
            }
        }
        return true;
    }
})();

Come usare:

is_visible(elem) // boolean



ebdiv deve essere impostato su style="display:none;" . È un lavoro per mostrare e nascondere:

$(document).ready(function(){
    $("#eb").click(function(){
        $("#ebdiv").toggle();
    });    
});



Quando si verifica un elemento contro :hidden selettore :hidden in jQuery, si deve considerare che un elemento posizionato in modo assoluto può essere riconosciuto come nascosto sebbene i loro elementi figli siano visibili .

Ciò sembra alquanto controintuitivo in primo luogo, anche se dare un'occhiata più da vicino alla documentazione di jQuery fornisce le informazioni rilevanti:

Gli elementi possono essere considerati nascosti per diversi motivi: [...] La loro larghezza e altezza sono esplicitamente impostati su 0. [...]

Quindi questo ha davvero senso per quanto riguarda il modello di box e lo stile calcolato per l'elemento. Anche se larghezza e altezza non sono impostate esplicitamente su 0, possono essere impostate implicitamente .

Dai un'occhiata al seguente esempio:

console.log($('.foo').is(':hidden')); // true
console.log($('.bar').is(':hidden')); // false
.foo {
  position: absolute;
  left: 10px;
  top: 10px;
  background: #ff0000;
}

.bar {
  position: absolute;
  left: 10px;
  top: 10px;
  width: 20px;
  height: 20px;
  background: #0000ff;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="foo">
  <div class="bar"></div>
</div>

AGGIORNAMENTO PER JQUERY 3.x:

Con jQuery 3 il comportamento descritto cambierà! Gli elementi saranno considerati visibili se hanno caselle di layout, comprese quelle di larghezza e / o altezza pari a zero.

JSFiddle con jQuery 3.0.0-alpha1:

http://jsfiddle.net/pM2q3/7/

Lo stesso JS avrà quindi questo output:

console.log($('.foo').is(':hidden')); // false
console.log($('.bar').is(':hidden')); // false



Utilizzare la commutazione della classe, non la modifica dello stile. . .

Usare le classi designate per "nascondere" gli elementi è facile e anche uno dei metodi più efficienti. La commutazione di una classe "nascosta" con uno stile di Display di "nessuno" viene eseguita più rapidamente rispetto alla modifica diretta di tale stile. Ho spiegato in modo abbastanza approfondito questo argomento in question Girando due elementi visibili / nascosti nello stesso div .

Best practice e ottimizzazione di JavaScript

Ecco un video davvero illuminante di un tecnico di front-end Google Tech Talk di Google, Nicholas Zakas:




Forse puoi fare qualcosa di simile

$(document).ready(function() {
   var visible = $('#tElement').is(':visible');

   if(visible) {
      alert("visible");
                    // Code
   }
   else
   {
      alert("hidden");
   }
});
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>

<input type="text" id="tElement" style="display:block;">Firstname</input>




Links