2012-11-14 25 views
5

Görünürlüğü algılamak için Firefox'un querySelector() veya querySelectorAll() işlevleriyle sahte bir seçici kullanmak için herhangi bir yöntem var mı? Özellikle böyle bir şey yapabilmek istiyorum:Firefox, sorgu seçici ve görünür seçici seçici

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

tarayıcı tutarsızlıklar veya diğer uygulama, sadece Firefox hakkında endişelenmenize gerek yok. Teşekkürler!

DÜZENLEME: Görünürekrana olmamak hiçbiri gizlenen değil ve görünürlük ile tanımlanır.

+0

"görünürlük" nin sizin tanımı nedir: Bir tek astar olarak

? – Bergi

+0

DOM öğesinin engellenecek görüntü birimi çalışacak, ancak ideal olarak, görünürlüğün görünür olarak ayarlandığını da kontrol edecektir. – macguru2000

cevap

5

Hayır, yok. The CSS specification, :visible (veya ilgili) seçiciyi tanımlamaz ve AFAIK Firefox, standart olmayan sözde seçicileri uygulamamaktadır.

kendini bu uygulamak isterseniz jQuery onun :visible seçici nasıl uyguladığını, not:

onun CSS "ekran" "değilse bir eleman görülebiliyordu jQuery 1.3.1 (ve üzeri) olarak

hiçbiri ", CSS" görünürlüğü "" gizli "değildi ve türü (bir girdi ise)" gizli "değildi. JQuery onun tarayıcı rapor offsetWidth veya offsetHeight daha büyük 0.

kaynağı ise, bir elemanın görünür 1.3.2: http://docs.jquery.com/Release:jQuery_1.3.2#:visible.2F:hidden_Overhauled

+0

Bundan korktuğum şey ... kötüye. Anladığım kadarıyla bu, CSS için yararlı bir seçici seçici değil, ancak Javascript'te gerçekten yardımcı olacaktı. – macguru2000

+0

jQuery uygulaması, css görünürlük özelliğini algılamak için hiç işe yaramıyor, çünkü görünürlük: gizli: – Esailija

+0

belgesinde yer alacaktır. Ve felsefi düzeyde belki de doğru uygulama ... göründüğünüze göre değişir. ... eğer sayfada yer kaplıyorsa, o zaman öğenin "görünür" olduğunu iddia edecek bir yer vardır. – macguru2000

13

hiçbir nativ implimentation olduğundan: I karar görebilir sözde seçici Elemanlarımı gizlemek ve göstermek için CSS sınıflarını kullanmak, böylece yalnızca görünürlük yerine sınıf adını kontrol etmeyi mümkün kılmak.

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

Şimdi 2016 yılında biz de gizli html5 özelliğini kullanabilirsiniz, bu nedenle bu seçici iş çok: İşte şimdi gibi benim seçici benzediğini olduğunu

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

bu hala 2015 yılında en iyi yoldur? – SuperUberDuper

+1

İnanıyorum ki: görünür değil ve muhtemelen css spesifikasyonunun bir parçası olmayacak. – macguru2000

+1

2016'da bunu yapmanın daha popüler bir yolu, yeni gizli html5 global özelliğini kullanmaktır. Tamamen geriye dönük uyumlu değildir, bu nedenle dikkatli olun. İşte Mozilla'nın dokümanları https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/hidden – macguru2000

0

denetleme elemanı görünür ise, üzerinde destekler tüm büyük tarayıcılar:

jQuery:

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

Vanilya JS:

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

Bu iki örneğin jQuery'nin tüm sürümlerinde eşdeğer olduğundan emin misiniz? – macguru2000

+1

@ macguru2000 jQuery'nin en son sürümüne eşdeğerdirler, jQuery'nin bu yöntemle ilgili daha önceki sürümlerini kontrol etmedim (ve dolayısıyla hiç bahsetmedim). –

+0

Anlıyorum, lütfen bunu yanlış anlama, ama bunu on yıldan fazla bir süredir yaptığınız zaman, “son versiyon” anlamına gelir. 2 yıl içinde cevabınızı okuyan birinin ne düşüneceğini düşünün, jQuery3? – macguru2000

0

düz javascript kullanarak, aynı zamanda, kolayca jQuery davranışını taklit bir diziye içine querySelector sonuçlarını dönüm ve bunu filtreleme olabilir:

sizin seçicinin sonuçları ile düz bir dizi oluşturur
Array.prototype.slice.call(document.querySelectorAll('your selector')) 

,

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

veya jquery koşullarının bile geri kalanı (item.style.visibility != "hidden" && item.style.opacity > 0 && ...): Eğer olarak süzebilirsiniz.

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