2012-11-14 18 views
5

क्या दृश्यता का पता लगाने के लिए फ़ायरफ़ॉक्स की क्वेरी चयनकर्ता() या querySelectorAll() फ़ंक्शंस के साथ छद्म चयनकर्ता का उपयोग करने के लिए वैसे भी है? विशेष रूप से मैं इस तरह कुछ करने के लिए सक्षम होना चाहते हैं:फ़ायरफ़ॉक्स, क्वेरी चयनकर्ता और दृश्यमान छद्म चयनकर्ता

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

ब्राउज़र विसंगतियों या अन्य कार्यान्वयन, बस फ़ायरफ़ॉक्स बारे में चिंता करने की कोई ज़रूरत नहीं। धन्यवाद!

संपादित करें: दर्शनीय प्रदर्शन नहीं किया जा रहा कोई भी और दृश्यताछिपा हुआ नहीं किया जा रहा द्वारा परिभाषित किया गया है।

+0

"दृश्यता" की अपनी परिभाषा क्या है? – Bergi

+0

ब्लॉक करने के लिए सेट डीओएम तत्व का प्रदर्शन काम करेगा, लेकिन आदर्श रूप से यह भी जांच करेगा कि दृश्यता दृश्यमान है। – macguru2000

उत्तर

5

नहीं, ऐसा नहीं है। The CSS specification:visible (या संबंधित) चयनकर्ता को परिभाषित नहीं करता है, और AFAIK फ़ायरफ़ॉक्स गैर-मानक छद्म चयनकर्ताओं को लागू नहीं करता है।

आप अपने आप को इस लागू करने के लिए चाहते हैं, तो ध्यान दें कि कैसे jQuery अपने :visible चयनकर्ता लागू करता है:

jQuery 1.3.1 (और पुराने) एक तत्व दिखाई दे रही थी, तो इसकी सीएसएस "प्रदर्शन" नहीं था "में कोई नहीं ", इसकी सीएसएस" दृश्यता "" छिपी हुई "नहीं थी, और इसका प्रकार (यदि यह इनपुट था)" छुपा "नहीं था। jQuery में 1.3.2 एक तत्व दिखाई दे रहा है अगर इसकी ब्राउज़र-सूचना offsetWidth या offsetHeight से अधिक 0.

स्रोत है: http://docs.jquery.com/Release:jQuery_1.3.2#:visible.2F:hidden_Overhauled

+0

यही मुझे डर था ... बुरा करने के लिए। मैं समझता हूं कि यह सीएसएस के लिए एक उपयोगी छद्म चयनकर्ता नहीं है, लेकिन यह जावास्क्रिप्ट में वास्तव में सहायक होगा। – macguru2000

+0

jQuery कार्यान्वयन वास्तव में सीएसएस दृश्यता संपत्ति का पता लगाने के लिए बिल्कुल अच्छा काम नहीं करता है क्योंकि 'दृश्यता: छुपा' दस्तावेज़ – Esailija

+0

पर स्थान लेगा और दार्शनिक स्तर पर शायद यह सही कार्यान्वयन है ... जो आप देखते हैं उस पर निर्भर करता है ... यदि यह पृष्ठ पर स्थान ले रहा है तो तर्क देने के लिए कुछ कमरा है कि तत्व "दृश्यमान" है। – macguru2000

13

के बाद से वहाँ का कोई देशी implimentation है: दिखाई छद्म चयनकर्ता मैंने तय कर लिया मेरे तत्वों को छिपाने और दिखाने के लिए सीएसएस कक्षाओं का उपयोग करने के लिए, इस प्रकार दृश्यता के बजाए बस कक्षा के नाम की जांच करने की इजाजत दी गई है।

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

अब 2016 में हम भी छिपा एचटीएमएल 5 विशेषता का उपयोग कर सकते हैं, तो यह चयनकर्ता भी काम करेगा:: यहाँ अब की तरह मेरे चयनकर्ता दिखता है

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

क्या यह 2015 में अभी भी सबसे अच्छा तरीका है? – SuperUberDuper

+1

मुझे विश्वास है,: दृश्यमान नहीं है और शायद सीएसएस विनिर्देश का हिस्सा कभी नहीं होगा। – macguru2000

+1

2016 में ऐसा करने का एक और लोकप्रिय तरीका नई छिपी एचटीएमएल 5 वैश्विक विशेषता का उपयोग करना है। यह पूरी तरह पिछड़ा संगत नहीं है, इसलिए सावधान रहें। यहां मोज़िला के दस्तावेज़ https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/hidden – macguru2000

0

जांच की जा रही है, तो तत्व दिखाई देता है, पर का समर्थन करता है सभी प्रमुख ब्राउज़रों:

jQuery:

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

वेनिला जे एस:

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

क्या आप वाकई उन दो उदाहरणों को jQuery के सभी संस्करणों के बराबर हैं? – macguru2000

+1

@ macguru2000 वे jQuery के नवीनतम संस्करण में समकक्ष हैं, मैंने इस विधि के बारे में jQuery के पिछले संस्करणों की जांच नहीं की (और इसलिए कभी उल्लेख नहीं किया)। –

+0

मैं देखता हूं, कृपया इसे गलत तरीके से न लें, लेकिन जब आप इसे एक दशक से अधिक समय से कर रहे हैं तो आप उल्लेख करते हैं कि "नवीनतम संस्करण" का उल्लेख करना बंद करना है। सोचें कि 2 साल के समय में कोई और आपके उत्तर को पढ़ने वाला क्या सोचता है, jQuery3? – macguru2000

0

सादे जावास्क्रिप्ट का प्रयोग करके आप jQuery व्यवहार को आसानी से अनुकरण एक सरणी में अपने querySelector परिणाम मोड़, और यह छानने सकता है:

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

कि अपने चयनकर्ता के परिणामों के साथ एक सादे सरणी बनाता है,

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

या यहाँ तक कि jQuery की स्थिति के बाकी (item.style.visibility != "hidden" && item.style.opacity > 0 && ...): आप के रूप में फ़िल्टर कर सकते हैं कि।

एक एक लाइनर के रूप में:

Array.prototype.slice.call(document.querySelectorAll('your selector')).filter(function (item,index) { return item.style.display!="none" }); 
संबंधित मुद्दे