2016-02-13 9 views
11

है क्या यह देखना संभव है कि कोई छाया DOM तत्व मौजूद है या नहीं? मैं इसे छेड़छाड़ करने के लिए बहुत चिंतित नहीं हूं, या यहां तक ​​कि वास्तव में इसे प्रति-लक्ष्य भी लक्षित करता हूं। मैं encapsulation के तर्क को समझता हूँ। लेकिन मैं छाया डीओएम तत्व मौजूद है या नहीं, इस पर आधारित नियमित डीओएम में अन्य तत्वों को स्टाइल करने में सक्षम होना चाहता हूं।जांचें कि तत्व में # छाया-रूट

तरह की क्रमबद्ध करें:

if ($('#element-id #shadow-root').length) { 
    // true 
} 

या अगर नहीं छाया-जड़, कम से कम के भीतर एक विशिष्ट तत्व, एक div की आईडी की तरह के लिए। तो यदि वह div मौजूद है, तो स्पष्ट रूप से छाया DOM तत्व पृष्ठ पर है।

मुझे पता है कि यह इतना आसान नहीं होगा ... मैंने कुछ शोध किए हैं, >>> और /deep/ जैसी चीजें हैं लेकिन उनका समर्थन कम/कोई/बहिष्कृत नहीं लगता है। शायद एक और तरीका खरीदें, हालांकि यह सुरुचिपूर्ण हो सकता है?

+2

आप किसी तत्व की छाया DOM एलीमेंट होस्ट कर रहा है अगर पता लगाने के लिए इच्छुक रहे हैं:

तो सब में, हम कुछ इस तरह होता है? या यह सहायक होगा? – KevBot

+1

जो मैं समझता हूं, छाया छाया में एक तत्व दिया गया है, एक जेएस var के माध्यम से एक छाया-डोम नोड का प्रतिनिधित्व करता है, आप यह निर्धारित कर सकते हैं कि वह नोड एक छाया डोम तत्व है या नहीं, और इसके पेड़ को नीचे या उसके पेड़ को पार कर सकता है गैर-छाया तत्व तक यह एक बच्चा हो सकता है (http://stackoverflow.com/questions/27453617/how-can-i-tell-if-an-element-is-in-a-shadow-dom) लेकिन पहले से ही उस नोड के बिना, जेएस क्वेरीसेलेक्टर एपीआई अपने आप पर छाया डोम को लक्षित नहीं कर सकता है, मुझे नहीं लगता कि आप जो कर रहे हैं वह कर सकते हैं – chiliNUT

+0

@ केवबॉट मुझे लगता है कि ओप क्या पूछ रहा है, अगर मैं नहीं जानना चाहता , क्या आप जानते हैं कि वह काम कैसे करना है? – chiliNUT

उत्तर

4

आप एक विशिष्ट तत्व एक छाया DOM एलीमेंट होस्ट कर रहा है या नहीं, जांच करना चाहते हैं, तो आप क्या कर सकते हैं निम्नलिखित:

var el = document.querySelector('#some-element'); 
if (el.shadowRoot === root) { 
    // Then it is hosting a Shadow DOM element 
} 

तुम भी छाया डोम तत्व प्राप्त कर सकते हैं, और फिर पर कार्य करते हैं यह एक सामान्य नोड की तरह:

<p>A Normal Paragraph</p> 
<div>A Normal Div</div> 

<script> 
    var host = document.querySelector('p'); 
    var root = host.createShadowRoot(); 
    root.textContent = 'A Shadow DOM Paragraph'; 

    // Let's go ahead and query it again so we can see this work in an actual scenario 
    var p = document.querySelector('p'); 
    var div = document.querySelector('div'); 

    console.log('Paragraph has Shadow DOM:', (p.shadowRoot === root)); // true 
    console.log('Div has Shadow DOM:', (div.shadowRoot === root)); // false 
</script> 
0:

var shadowEl = el.shadowRoot; 
// And for example: 
console.log(shadowEl.innerHTML); 

यहाँ एक उदाहरण है कि Chrome का नवीनतम संस्करण में काम करता है

मैंने आपको इन सभी उदाहरणों में स्थिति की जांच करने की सख्त विधि दी है। आप निश्चित रूप से और साथ ही निम्न कर सकते हैं:

if (el.shadowRoot) {} //to loosely check 
if (!!el.shadowRoot) {} //to force boolean 
+0

उत्तर के लिए धन्यवाद, यह अच्छा लग रहा है! आपका अनुच्छेद उदाहरण निश्चित रूप से काम करता प्रतीत होता है।अब जब मैं इसे और अधिक खोज रहा हूं, तो मुझे लगता है कि वास्तव में तत्व प्राप्त करने का आपका उदाहरण है जो मुझे वास्तव में चाहिए। कोई विचार क्यों यह काम करने के लिए प्रतीत नहीं होता है? http://codepen.io/chasebank/pen/WrPEzX/ मैंने नोटिस किया कि जब आप छाया रूट बनाते हैं, तो यह # छाया-रूट (खुला) 'के रूप में दिखाता है जबकि ब्राउज़र का 'छाया-रूट (उपयोगकर्ता-एजेंट' होता है) '। मुझे आशा है कि यह कोई मुद्दा नहीं है। इसके अलावा एफवाईआई, कोडपेन में अब एक कंसोल है। इसके लिए बटन नीचे बाईं ओर है। एक नई सुविधा का क्रमबद्ध करें ... – Chase

+0

@Chase, ऐसा लगता है कि इनपुट में कोई छाया डोम तत्व नहीं है। इसे [कोडपेन] आज़माएं (http://codepen.io/anon/pen/jWdYNm?editors=1111)। मैंने यह देखने के लिए कुछ जांच जोड़ दी कि क्या छाया डोम तत्व इसके आंतरिक HTML प्राप्त करने की कोशिश करने से पहले मौजूद था या नहीं। – KevBot

+0

दिलचस्प। जब मैं शो उपयोगकर्ता एजेंट shodow DOM सक्षम के साथ इसका निरीक्षण करता हूं, तो मुझे इनपुट टैग के भीतर '# छाया-रूट (उपयोगकर्ता-एजेंट)

'दिखाई देता है। क्या आप जानते हैं कि आपके कोड की जांच किस प्रकार से अलग है? – Chase

4

आप संपत्ति shadowRoot वाले एक तत्व की shadowRoot उपयोग कर सकते हैं, ताकि आप सभी नोड्स पार और देखें कि क्या संपत्ति रिक्त है या नहीं कर सका।

आप document.getElementsByTagName('*') वाले दस्तावेज़ में सभी नोड्स का चयन कर सकते हैं।

var allNodes = document.getElementsByTagName('*'); 
for (var i = 0; i < allNodes.length; i++) { 
    if(allNodes[i].shadowRoot) { 
    // Do some CSS styling 
    } 
} 
संबंधित मुद्दे