2016-02-13 21 views
11

E 'possibile vedere se esiste un elemento DOM shadow? Non sono troppo interessato a manipolarlo, o addirittura a prenderlo di mira per dire. Capisco il ragionamento dell'incapsulamento. Ma mi piacerebbe essere in grado di disegnare altri elementi nel DOM normale, in base alla presenza o meno dell'elemento Shadow DOM.Verificare se l'elemento contiene # shadow-root

Un po 'come:

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

O se non per l'ombra-root, almeno un elemento specifico all'interno, come l'ID di un div. Quindi se quel div esiste, allora chiaramente l'elemento Shadow DOM è sulla pagina.

So che non sarebbe così semplice ... Da alcune ricerche che ho fatto, ci sono cose come >>> e /deep/ ma il loro supporto sembra essere basso/nessuno/deprecato. Compra forse c'è un altro modo, per quanto inelegante possa essere?

+2

Sei voler rilevare se un elemento ospita un elemento ombra DOM? O sarebbe utile? – KevBot

+1

Da quello che ho capito, dato un elemento nella dom shadow, tramite una js var che rappresenta un nodo shadow-dom, puoi determinare se quel nodo è un elemento dom shadow o no, e può attraversare il suo albero, o il suo albero fino all'elemento non-ombra potrebbe essere un figlio di (http://stackoverflow.com/questions/27453617/how-can-i-tell-if-an-element-is-in-a-hadow-dom) ma senza avere già quel nodo, dato che js queryselector api non può bersagliare shadow dom da solo, non penso che tu possa fare quello che stai chiedendo – chiliNUT

+0

@KevBot Penso che sia quello che l'op sta chiedendo, lol se non mi piacerebbe sapere , sai come farlo? – chiliNUT

risposta

4

Se si desidera controllare se un determinato elemento ospita un elemento Ombra DOM, è possibile effettuare le seguenti operazioni:

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

È anche possibile ottenere l'elemento Ombra DOM, e poi operare su come un nodo normale:

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

Ecco un esempio che funziona nella versione più recente di Chrome:

<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> 

Ti ho dato il metodo rigoroso di controllare la condizione in tutti questi esempi. Ovviamente si può effettuare le seguenti operazioni così:

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

Grazie per la risposta, questo sembra buono! Il tuo esempio di paragrafo sembra funzionare senz'altro.Ora che sto esplorando di più, penso che il tuo esempio di ottenere effettivamente l'elemento sia ciò di cui ho veramente bisogno. Qualche idea sul perché non sembra funzionare? http://codepen.io/chasebank/pen/WrPEzX/ Ho notato che quando create la Shadow Root, mostra come # # shadow-root (aperto) 'mentre il browser è' # shadow-root (user-agent) '. Spero che non sia un problema. Inoltre FYI, CodePen ha una console ora. Il pulsante per esso è in basso a sinistra. Una sorta di caratteristica nuova ... – Chase

+0

@Chase, sembra che non vi sia alcun elemento dom shadow nell'input. Prova questo [codepen] (http://codepen.io/anon/pen/jWdYNm?editors=1111). Ho aggiunto alcuni controlli per vedere se l'elemento dom shadow era presente prima di provare a ottenere il innerHTML. – KevBot

+0

Interessante. Quando lo controllo con show user agent shodow DOM abilitato, vedo '# shadow-root (user-agent)

' all'interno del tag di input. Sai come si differenzia da ciò che il tuo codice sta controllando? – Chase

4

È possibile accedere alla shadowRoot di un elemento con la proprietà shadowRoot, così da poter attraversare tutti i nodi e verificare se la proprietà è null o non.

È possibile selezionare tutti i nodi in un documento con document.getElementsByTagName('*').

Quindi, tutto sommato, avremmo qualcosa di simile:

var allNodes = document.getElementsByTagName('*'); 
for (var i = 0; i < allNodes.length; i++) { 
    if(allNodes[i].shadowRoot) { 
    // Do some CSS styling 
    } 
} 
Problemi correlati