दिलचस्प पोस्ट
बूट समय पर एंड्रॉइड -स्टार्टिंग सेवा LINQ रिकर्सन फ़ंक्शन? मैक ओएस एक्स में अद्वितीय हार्डवेयर आईडी XML_LOAD () का उपयोग करके MySQL डेटाबेस तालिका में XML फ़ाइल कैसे आयात करें? समारोह Memcached के बजाय मुझे मेम्केचे का उपयोग कब करना चाहिए? स्ट्रिंग शब्दशः std :: string के बजाए बूल अधिभार मैच करता है डी 3 बल निर्देशित आलेख में लिंक पर पाठ / लेबल जोड़ें मैं वाइल्डकार्ड का उपयोग कर फ़ाइलों की सूची कैसे खोजूं? सेवा परत और नियंत्रक: कौन देखभाल करता है? DataView.Sort – सिर्फ asc / desc (अधिक कस्टम सॉर्ट की आवश्यकता है) से अधिक लिनक्स AMD64 में एफएस / जीएस रजिस्टरों का उपयोग कैसे किया जाता है? मैं अपने आप को एक पावर फंक्शन कैसे लिख सकता हूं? लैम्ब्डा अभिव्यक्ति का उपयोग करके गुण नाम और प्रकार प्राप्त करें मैं अपने खुद के टेम्पलेट्स के साथ निर्मित पासवर्ड रीसेट / दृश्यों का उपयोग कैसे करूं? फ्लोट को 2 दशमलव तक गोल करने के लिए सबसे अच्छा अभ्यास क्या है?

यदि कोई चयनकर्ता किसी दिए गए तत्व से मेल खाता है तो टेस्ट करें

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

उदाहरण के लिए, मैं ऐसा कुछ करने में सक्षम होगा:

var element = <input name="el" /> matches("input[name=el]", element) == true 

संपादित करें : इसके बारे में अधिक सोचने के बाद, मैं एक समाधान के साथ आया, यह तकनीकी रूप से काम करता है, लेकिन दक्षता के मामले में यह अनुकूल नहीं लगता है:

 function matchesSelector(selector, element) { var nodeList = document.querySelectorAll(selector); for ( var e in nodeList ) { return nodeList[e] === element; } return false; } 

असल में फ़ंक्शन, पूरे चयनकर्ता के साथ पूरे दस्तावेज़ को पूछता है, और फिर यह नोडलेस्ट पर फिर से चलाता है। यदि दिया गया तत्व नोडलाइस्ट में है, तो यह सत्य वापस लाता है, और यदि ऐसा नहीं है तो यह झूठी वापसी करेगा।

अगर कोई भी अधिक कुशल उत्तर के साथ आ सकता है तो मैं उत्तर के रूप में उनकी प्रतिक्रिया को ख़ुशी से चिह्नित करूँगा।

संपादित करें : फ्लेवियस स्टीफ ने मुझे Firefox 3.6+ के लिए एक ब्राउज़र विशिष्ट समाधान की ओर इशारा किया, मोजमैट्ससचिलर । मुझे क्रोम के संस्करण (संस्करण संगतता अज्ञात, और यह सफ़ारी या अन्य वेबकिट ब्राउज़रों पर काम कर सकता है या हो सकता है) के लिए भी पाया गया है: webkitMatchesSelector , जो मूल रूप से फ़ायरफ़ॉक्स कार्यान्वयन के समान है मुझे अभी तक IE ब्राउज़र के लिए कोई मूल कार्यान्वयन नहीं मिला है

उपरोक्त उदाहरण के लिए, यह प्रयोग होगा:

 element.(moz|webkit)MatchesSelector("input[name=el]") 

ऐसा लगता है कि डब्ल्यू .3 सी। ने भी चयनकर्ता एपीआई स्तर 2 में इस बात को संबोधित किया है (अभी भी इस समय ड्राफ्ट) विनिर्देश matchesSelector एक बार अनुमोदित DOM तत्वों पर एक विधि होगा।

W3C उपयोग: element.matchesSelector(selector)

चूंकि यह विनिर्देश अभी भी एक मसौदा है और एक बार मानक ब्राउज़र बनने के बाद लोकप्रिय ब्राउज़र तरीकों को लागू करने से पहले एक समय अंतराल है, यह वास्तव में उपयोगी होने तक थोड़ी देर हो सकती है। अच्छी खबर यह है, यदि आप किसी भी लोकप्रिय चौखटे का उपयोग करते हैं, संभावना है कि वे संभवतः क्रॉस ब्राउज़र संगतता के बारे में चिंता किए बिना आपके लिए इस कार्यक्षमता को लागू कर सकते हैं। यद्यपि वह उन लोगों की मदद नहीं करता है जो तीसरे पक्ष के पुस्तकालयों में शामिल नहीं हो सकते

फ़्रेमवर्क या लाइब्रेरी जो इस कार्यक्षमता को लागू करते हैं:

http://www.prototypejs.org/api/element/match

http://developer.yahoo.com/yui/docs/YAHOO.util.Selector.html

http://docs.jquery.com/Traversing/is

http://extjs.com/deploy/dev/docs/output/Ext.DomQuery.html#Ext.DomQuery-methods

http://base2.googlecode.com/svn/doc/base2.html#/doc/!base2.DOM.Element.matchesSelector

http://wiki.github.com/jeresig/sizzle/

Solutions Collecting From Web of "यदि कोई चयनकर्ता किसी दिए गए तत्व से मेल खाता है तो टेस्ट करें"

ये कई सालों के बाद इस पृष्ठ पर आने वाले लोगों के लाभ के लिए, यह कार्यक्षमता अब सभी आधुनिक ब्राउज़रों में element.matches रूप में लागू की जाती है element.matches विक्रेता के बिना उपसर्ग (किनारे 15 के अलावा एमएस ब्राउज़र्स के लिए एमएस और Android / KitKat के लिए webkit के अलावा)। http://caniuse.com/matchesselector देखें

सर्वश्रेष्ठ प्रदर्शन के लिए , ब्राउज़र लागूकरण का उपयोग करें ( (moz|webkit|o|ms)matchesSelector ) जहां संभव हो। जब आप ऐसा नहीं कर सकते, तो यहां एक मैन्युअल कार्यान्वयन है

दस्तावेज से जुड़ी तत्वों के लिए चयनकर्ताओं का परीक्षण करने पर विचार करने के लिए एक महत्वपूर्ण मामला है।

यहाँ एक दृष्टिकोण है जो इस स्थिति को संभालता है। यदि यह पता चला है कि दस्तावेज़ में element संलग्न नहीं है, तो सर्वोच्च पूर्वज (अंतिम गैर-अशक्त माता-पिता) को ढूंढने के लिए पेड़ को क्रॉल करें और ड्रॉप-डाउन DocumentFragment । फिर उस DocumentFragment कॉल querySelectorAll देखें और देखें कि आपका element परिणामी NodeList

यहां कोड है

दस्तावेज़

यहाँ एक दस्तावेज़ संरचना है जिसके साथ हम काम करेंगे। हम। .element पकड़ .element और जांच लें कि क्या यह चयनकर्ता li और .container * मेल खाता है।

 <!DOCTYPE html> <html> <body> <article class="container"> <section> <h1>Header 1</h1> <ul> <li>one</li> <li>two</li> <li>three</li> </ul> </section> <section> <h1>Header 2</h1> <ul> <li>one</li> <li>two</li> <li class="element">three</li> </ul> </section> <footer>Footer</footer> </article> </body> </html> 

document.querySelectorAll साथ खोज। चयनकर्ता

यहाँ एक matchesSelector फ़ंक्शन है जो document.querySelectorAll का उपयोग करता document.querySelectorAllmatchesSelector

 // uses document.querySelectorAll function matchesSelector(selector, element) { var all = document.querySelectorAll(selector); for (var i = 0; i < all.length; i++) { if (all[i] === element) { return true; } } return false; } 

यह तब तक काम करता है जब तक उस document

 // this works because the element is in the document console.log("Part 1"); var element = document.querySelector(".element"); console.log(matchesSelector("li", element)); // true console.log(matchesSelector(".container *", element)); // true 

हालांकि, यदि document से तत्व हटा दिया गया है, तो यह विफल हो जाता है।

 // but they don't work if we remove the article from the document console.log("Part 2"); var article = document.querySelector("article"); article.parentNode.removeChild(article); console.log(matchesSelector("li", element)); // false console.log(matchesSelector(".container *", element)); // false 

एक DocumentFragment खोजना

तय करने के लिए उस element की खोज करने की आवश्यकता होती है जो उस element होता है। यहाँ matchesSelector2 नामक एक अद्यतन फ़ंक्शन है।

 // uses a DocumentFragment if element is not attached to the document function matchesSelector2(selector, element) { if (document.contains(element)) { return matchesSelector(selector, element); } var node = element; var root = document.createDocumentFragment(); while (node.parentNode) { node = node.parentNode; } root.appendChild(node); var all = root.querySelectorAll(selector); for (var i = 0; i < all.length; i++) { if (all[i] === element) { root.removeChild(node); return true; } } root.removeChild(node); return false; } 

अब हम देखते हैं कि MatchSelector2 काम करता है भले ही वह तत्व उप-धारा में है जो कि दस्तावेज़ से अलग है।

 // but they will work if we use matchesSelector2 console.log("Part 3"); console.log(matchesSelector2("li", element)); // true console.log(matchesSelector2(".container *", element)); // true 

आप यह काम jsfiddle पर देख सकते हैं

यह सब एक साथ डालें

यहाँ अंतिम कार्यान्वयन है जिसके साथ मैं आया था:

 function is(element, selector) { var node = element; var result = false; var root, frag; // crawl up the tree while (node.parentNode) { node = node.parentNode; } // root must be either a Document or a DocumentFragment if (node instanceof Document || node instanceof DocumentFragment) { root = node; } else { root = frag = document.createDocumentFragment(); frag.appendChild(node); } // see if selector matches var matches = root.querySelectorAll(selector); for (var i = 0; i < matches.length; i++) { if (this === matches.item(i)) { result = true; break; } } // detach from DocumentFragment and return result while (frag && frag.firstChild) { frag.removeChild(frag.firstChild); } return result; } 

एक महत्वपूर्ण नोट यह है कि jQuery का कार्यान्वयन बहुत तेज है। पहला ऑप्टिमाइज़ेशन जो मैं देखता हूं, उस पेड़ को रेंगने से बचने के लिए है, अगर हमारे पास नहीं है ऐसा करने के लिए आप चयनकर्ता के दाहिनी भाग को देख सकते हैं और जांच सकते हैं कि यह तत्व से मेल खाता है या नहीं। हालांकि, सावधान रहें कि यदि चयनकर्ता वास्तव में अल्पविरामों द्वारा अलग-अलग चयनकर्ता है, तो आपको प्रत्येक एक का परीक्षण करना होगा। इस समय आप एक सीएसएस चयनकर्ता पार्सर का निर्माण कर रहे हैं, ताकि आप पुस्तकालय का उपयोग कर सकें।

xMatchesSelector की अनुपस्थिति में, मैं एक स्टाइल styleSheet ऑब्जेक्ट के लिए अनुरोधित चयनकर्ता के साथ एक शैली जोड़ने की कोशिश कर रहा हूं, कुछ मनमाना नियम और मान के साथ जो पहले से उपयोग में होने की संभावना नहीं है। उसके बाद तत्व की computed/currentStyle की जांच करें ताकि यह जोड़ा गया सीएसएस नियम विरासत में मिला हो। IE के लिए ऐसा कुछ:

 function ieMatchesSelector(selector, element) { var styleSheet = document.styleSheets[document.styleSheets.length-1]; //arbitrary value, probably should first check //on the off chance that it is already in use var expected = 91929; styleSheet.addRule(selector, 'z-index: '+expected+' !important;', -1); var result = element.currentStyle.zIndex == expected; styleSheet.removeRule(styleSheet.rules.length-1); return result; } 

हो सकता है कि इस पद्धति के साथ एक हैंडबैग पूरा हो गया। कुछ अस्पष्ट स्वामित्व सीएसएस नियम खोजने के लिए शायद सबसे अच्छा है, जो कि z-index तुलना में दृश्य प्रभाव कम होने की संभावना है, लेकिन चूंकि इसे सेट किए जाने के तुरंत बाद हटा दिया गया है, यदि एक संक्षिप्त झिलमिलाहट का एकमात्र दुष्प्रभाव होना चाहिए। इसके अलावा एक और अधिक अस्पष्ट नियम अधिक विशिष्ट चयनकर्ता, शैली विशेषता नियमों, या अन्य महत्वपूर्ण नियमों (यदि आईई भी इसका समर्थन करता है) द्वारा ओवरराइड होने की संभावना कम होगा। वैसे भी, कम से कम एक कोशिश के लायक

डब्लू 3 सी चयनकर्ता एपीआई ( http://www.w3.org/TR/selectors-api/ ) document.querySelectorAll() निर्दिष्ट करता है । चयनकर्ता document.querySelectorAll() यह सभी ब्राउज़रों पर समर्थित नहीं है, इसलिए आप इसे समर्थन करने वाले Google को करना होगा: http://www.google.com/search?q=browsers+implementing+selector+api

मैं इस मुद्दे से अब काम कर रहा हूं। मुझे मूल जावास्क्रिप्ट के साथ IE8 का समर्थन करना है, जो एक उत्सुक चुनौती प्रस्तुत करता है: IE8 क्वेरी क्वेरी और क्वेरी सेलेक्टर दोनों का समर्थन करता है, लेकिन चयनकर्ता से मेल नहीं खाता। यदि आपकी स्थिति समान है, तो यहां पर विचार करने के लिए यहां एक विकल्प दिया गया है:

जब आप DOM नोड और एक चयनकर्ता को सौंप दिया जाता है, नोड की एक उथले प्रतिलिपि बनाएं और इसके माता-पिता के रूप में भी। यह उनके सभी गुणों को संरक्षित करेगा लेकिन उनके संबंधित बच्चों की प्रतियां नहीं करेगा।

क्लोन किए गए माता-पिता को क्लोन नोड संलग्न करें। क्लोन किए गए माता-पिता पर क्वेरीसचिलर का उपयोग करें – केवल एकमात्र ऐसा बच्चा नोड है जिसकी खोज करने की जरूरत है, इसलिए यह प्रक्रिया निरंतर समय है। यह या तो बाल नोड लौटाएगा या नहीं।

यह कुछ इस तरह दिखता है:

 function matchesSelector(node, selector) { var dummyNode = node.cloneNode(false); var dummyParent = node.parent.cloneNode(false); dummyParent.appendChild(dummyNode); return dummyNode === dummyParent.querySelector(selector); } 

यह रूट नोड तक पूरी तरह से उथले-प्रतिलिपि किए गए माता-पिता की एक पूरी श्रृंखला बनाने और (यदि आप अपने पूर्वजों के साथ अपने नोड के संबंधों का परीक्षण करने में सक्षम होना चाहते हैं) (अधिकतर खाली) डमी रूट क्वेरी करने के लिए उपयुक्त हो सकते हैं।

मेरे सिर के ऊपर से मुझे यकीन नहीं है कि यह चयनकर्ताओं के किस भाग के लिए काम करेगा, लेकिन मुझे लगता है कि यह उन किसी भी तरह के लिए अच्छी तरह से करना होगा जो परीक्षण नोड के बच्चों के बारे में चिंता नहीं करते थे। YMMV।

– संपादित करें –

मैंने फंक्शन को उथले प्रतिलिपि में लिखने का निर्णय लिया है, जो रूट के लिए परीक्षण किए जा रहे नोड से सब कुछ है। इस का उपयोग करते हुए, बहुत अधिक चयनकर्ता नियोज्य हैं (भाई-बहनों से संबंधित कुछ नहीं, यद्यपि।)

 function clonedToRoot(node) { dummyNode = node.cloneNode(false); if(node.parentNode === document) { return {'root' : dummyNode, 'leaf' : dummyNode}; } parent = clonedToRoot(node.parentNode).root; parent.appendChild(dummyNode); return {'root' : parent, 'leaf' : dummyNode}; } function matchesSelector(node, selector) { testTree = clonedToRoot(node) return testTree.leaf === testTree.root.querySelector(selector) } 

मैं विशेषज्ञों का स्वागत करता हूं कि ये समझाने के लिए कि चयनकर्ताओं के किस प्रकार हैं कि ये शामिल नहीं होंगे!

आधुनिक ब्राउज़र यह document.querySelectorAll साथ कर सकते हैं.कुछ सिलेक्टर सभी फ़ंक्शन

http://www.w3.org/TR/selectors-api/

बस अपने तत्व के लिए आईडी का उपयोग करें? HTML- आईडी अद्वितीय होना चाहिए …