2012-11-14 17 views
5

Esiste comunque uno pseudo-selettore con le funzioni querySelector() o querySelectorAll() di Firefox per rilevare la visibilità? In particolare voglio essere in grado di fare qualcosa del genere:Firefox, selettore di query e pseudo selettore visibile

elem.querySelector('#list .list-item:visible'); 
elem.querySelector('#section .sub-section:visible .title'); 

Non c'è bisogno di preoccuparsi di incongruenze del browser o altre implementazioni, solo Firefox. Grazie!

EDIT: Visibile è definito da visualizzazione non essere nessuno e visibilità non essere nascosti.

+0

Qual è la tua definizione di "visibilità"? – Bergi

+0

Il display dell'elemento DOM impostato su blocco funzionerebbe, ma idealmente controllerebbe anche che la visibilità sia impostata su visibile. – macguru2000

risposta

5

No, non c'è. The CSS specification non definisce un selettore :visible (o relativo) e AFAIK Firefox non implementa pseudo selettori non standard.

Se vuoi implementare da soli, notare come jQuery implementa la sua :visible selettore:

In jQuery 1.3.1 (e precedenti) un elemento era visibile se CSS "display" non era " nessuno ", la sua" visibilità "CSS non era" nascosta "e il suo tipo (se era un input) non era" nascosto ". In jQuery 1.3.2 un elemento è visibile se il suo browser-riferito offsetWidth o offsetHeight è maggiore di 0.

Fonte: http://docs.jquery.com/Release:jQuery_1.3.2#:visible.2F:hidden_Overhauled

+0

Questo è quello che temevo ... al male. Capisco che non sia un pseudo-selettore utile per i CSS, ma sarebbe molto utile in Javascript. – macguru2000

+0

l'implementazione jQuery non funziona davvero bene per rilevare la proprietà di visibilità css come 'visibilità: hidden' occuperà spazio sul documento – Esailija

+0

E a livello filosofico forse questa è la corretta implementazione ... dipende da ciò che consideri visibile ... se sta prendendo spazio sulla pagina, allora c'è un po 'di spazio per argomentare che l'elemento è "visibile". – macguru2000

13

Poiché non v'è implimentation nativa del: selettore di pseudo visibile decisi usare le classi CSS per nascondere e mostrare i miei elementi, permettendo così semplicemente di controllare il nome della classe invece della visibilità. Ecco ciò che il mio selettore appare come ora:

elem.querySelector('#list .list-item:not(.hidden)'); 

Ora nel 2016 possiamo anche utilizzare l'attributo HTML5 nascosto, in modo da questo selettore avrebbe funzionato troppo:

elem.querySelector('#list .list-item:not([hidden])'); 
+1

è ancora il modo migliore nel 2015? – SuperUberDuper

+1

Credo di sì,: visibile non è e probabilmente non farà mai parte delle specifiche CSS. – macguru2000

+1

Un modo più popolare per farlo nel 2016 è utilizzare il nuovo attributo globale html5 nascosto. Non è completamente compatibile con le versioni precedenti, quindi fai attenzione. Ecco i documenti di Mozilla https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/hidden – macguru2000

0

Verificando elemento è visibile, sostiene il tutti i principali browser:

jQuery:

$('.list-item').is(':visible'); 

Vanilla JS:

function isVisible(elem) {return elem.offsetWidth > 0 || elem.offsetHeight > 0 || elem.getClientRects().length > 0; } 
+1

Sei sicuro che quei due esempi siano equivalenti in tutte le versioni di jQuery? – macguru2000

+1

@ macguru2000 Sono equivalenti nell'ultima versione di jQuery, non ho controllato (e quindi mai menzionato) versioni precedenti di jQuery riguardo questo metodo. –

+0

Vedo, per favore non prendetela nel modo sbagliato, ma quando lo fai da oltre un decennio smetti di assumere una menzione significa "l'ultima versione". Pensa a cosa penserebbe qualcun altro che legge la tua risposta tra 2 anni, jQuery3? – macguru2000

0

Utilizzo di javascript pianura, si potrebbe anche emulare il comportamento jQuery facilmente, trasformando i risultati querySelector in un array, e filtrandola:

Array.prototype.slice.call(document.querySelectorAll('your selector')) 

che crea un array di pianura con i risultati del vostro selettore, che è possibile filtrare come:

.filter(function (item,index) { return item.style.display!="none" }); 

o anche il resto delle condizioni di jQuery (item.style.visibility != "hidden" && item.style.opacity > 0 && ...).

Come uno di linea:

Array.prototype.slice.call(document.querySelectorAll('your selector')).filter(function (item,index) { return item.style.display!="none" }); 
Problemi correlati