2012-07-22 13 views
5

मान लीजिए कि मेरे पास निम्न आवश्यकता है: तत्व e आईडी "x" के साथ तत्व में जोड़ें यदि कोई तत्व मौजूद है, अन्यथा शरीर में e जोड़ें।यदि कोई अन्य मौजूद नहीं है तो JQuery में कोई तत्व चुनने का कोई शानदार तरीका है?

DOM स्तर में 0 में, मैं लिख सकते हैं:

var parent = document.getElementById("x") || document.body; 
parent.appendChild(e); 

jQuery में, निम्न करता नहीं काम:

var parent = $("#x") || $("body"); 
parent.append(e); 

क्योंकि अगर आईडी x मौजूद है के साथ कोई तत्व, पहले असंबद्ध रिक्त jquery ऑब्जेक्ट देता है, सच है, झूठी नहीं है, इसलिए append कुछ भी नहीं करता है। मैं कर सकते हैं, तथापि, लिखें:

var parent = $("#x")[0] || $("body")[0]; 
parent.appendChild(e); 

लेकिन क्योंकि jQuery वस्तु का अनुक्रमण मुझे वापस हो जाता है HTMLElements के लिए इस समाधान कुछ हद तक भद्दा है, इसलिए मैं appendChild बजाय append उपयोग करना चाहिए। हालांकि यह काम करता है, मैं सोच रहा हूं कि स्तरों का मिश्रण मिश्रण या खराब डिजाइन का संकेतक है या नहीं।

first() का उपयोग करने का कोई तरीका हो सकता है? शायद मैं एक jQuery ऑब्जेक्ट बना सकता हूं जो अनिवार्य रूप से एक सरणी था जिसका पहला तत्व आईडी एक्स के साथ div था, और दूसरा शरीर था। मुझे पता है कि मैं इसे jQuery कन्स्ट्रक्टर फॉर्म के साथ कर सकता हूं जो एक तत्व सरणी लेता है, लेकिन फिर मैं स्तरों के मिश्रण पर वापस आ जाता हूं। मैं यह भी जानता हूं कि आईडी एक्स ($("#x").length) वाले तत्व के अस्तित्व की जांच कैसे करें, लेकिन मैं नहीं देख सकता कि यह कैसे "आईडी एक्स के साथ तत्व मौजूद है, अन्यथा शरीर" के लिए एक शानदार तरीका होगा।

क्या ऐसा कोई सूत्र मौजूद है?

उत्तर

2

के बजाय तत्व का चयन करने jQuery का उपयोग कर, आप इसे इस्तेमाल कर सकते हैं रैप करने के लिए:

इसके अलावा, यहाँ एक त्रिगुट रूप है कि केवल प्रत्येक प्रश्न एक बार आग (हालांकि यह पठनीयता पर एक व्यापार बंद है) है देशी डोम कॉल:

$(document.getElementById("foo") || document.body) 

यह बिल्कुल सुंदर (या वास्तव में भी jQuery का उपयोग), और न ही एक सार्वभौमिक रूप से लागू तकनीक नहीं है, लेकिन आप कुछ आप के लिए जोड़ सकते हैं के साथ खत्म हो जाएगा (और सिर्फ एक अपेक्षाकृत सस्ती jQuery मंगलाचरण उठाना एकबार)।

आप का उपयोग करने के लिए सक्षम नहीं होंगे first() - जैसे, $("#foo, body").first(); - क्योंकि जिस क्रम में यह तत्व चयनित रिटर्न डोम आदेश पर आधारित है, आदेश चयनकर्ता नहीं (धन्यवाद, @muistooshort)

+0

ओह, यह सुंदर है, हालांकि - जब तक कि jQuery यहां कुछ वास्तव में गंभीर जादू नहीं करता है - इसमें लघु-सर्किटिंग के बजाय पहले व्यक्ति को वापस करने से पहले * सभी * तत्वों का चयन करने का प्रदर्शन नकारात्मक होता है। फिर भी, अगर हम उस स्तर के प्रदर्शन की परवाह करते हैं, तो हमें वास्तव में पहले स्थान पर jQuery का उपयोग नहीं करना चाहिए। – Matchu

+3

नहीं, यह तब से काम नहीं करेगा ["लौटे हुए jQuery ऑब्जेक्ट में डीओएम तत्वों का क्रम समान नहीं हो सकता है, क्योंकि वे दस्तावेज़ ऑर्डर में होंगे।"] (Http://api.jquery.com/multiple- चयनकर्ता /), उदाहरण के लिए: http://jsfiddle.net/ambiguous/edYY6/। यह आपको हर बार ' 'देगा। –

+0

सहमत हैं कि यह बहुत अच्छा है। हम प्रत्येक में से एक के साथ ठीक है (या होना चाहिए), क्योंकि पहले व्यक्ति में एक आईडी है, जो पृष्ठ पर अद्वितीय होना चाहिए, और दूसरा ** ** शरीर तत्व है। एचटीएमएल में इनमें से केवल एक होना चाहिए। –

3

ईमानदारी से, मैं वास्तव में नहीं लगता कि यह निहायत वर्बोज़ है:

var parent = $('#x'); 
if(parent.length == 0) parent = $('body'); 

और इसकी मंशा भी काफी स्पष्ट है। यदि यह मुहावरे बहुत कुछ आता है तो आप इसे एक समारोह में भी लपेट सकते हैं।

var parent = (x = $('#header')).length ? x : $('body'); 
+2

तुम भी कर सकते थे '$ (" # x ") लंबाई का उपयोग करें? $ ("# x"): $ ("body") '। –

+0

त्वरित उत्तर के लिए धन्यवाद। मैं एक-लाइनर के लिए पूछने में बुरा महसूस करता हूं (एसओ पर बहुत आम है, मुझे पता है !!) लेकिन मुझे आश्चर्य हुआ कि चूंकि डोम लेवल 0 में संक्षिप्त फॉर्मूलेशन था, इसलिए शायद jquery को चाहिए। :) –

+0

@RayToal: एक अच्छी तरह से प्रदर्शन करने वाला एक-लाइनर जोड़ा, हालांकि यह स्पष्ट रूप से कम पठनीय है।मैं अभी भी एक फ़ंक्शन में दो-पंक्ति संस्करण को लपेटकर इसे एक पंक्ति बनाने का वोट दूंगा, खासकर यदि यह बहुत कुछ आता है ... लेकिन अगर यह केवल एक बार उपयोग किया जाता है, तो meh। – Matchu

संबंधित मुद्दे

 संबंधित मुद्दे