2016-02-13 8 views
11

Ist es möglich zu sehen, ob ein Shadow-DOM-Element existiert? Ich bin nicht zu sehr damit beschäftigt, es zu manipulieren oder es sogar per-say wirklich anzusprechen. Ich verstehe die Argumentation der Kapselung. Aber ich würde gerne in der Lage sein, andere Elemente im regulären DOM zu stylen, abhängig davon, ob das Shadow-DOM-Element vorhanden ist oder nicht.Prüfen, ob das Element # shadow-root enthält

Art wie:

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

Oder wenn nicht für die Schatten-Wurzel, zumindest ein bestimmtes Element in der, wie die ID eines div. Wenn also dieses div existiert, dann ist klar, dass das Shadow-DOM-Element auf der Seite ist.

Ich weiß, es wäre nicht so einfach sein ... Von einigen Recherchen habe ich getan, es gibt Dinge, wie >>> und /deep/ aber ihre Unterstützung scheint niedrig/keine/veraltet zu sein. Kauf vielleicht gibt es einen anderen Weg, wie unelegant es auch sein mag?

+2

Wollen Sie, um herauszufinden, ob ein Element ein Schatten DOM-Element präsentiert? Oder wäre das hilfreich? – KevBot

+1

Soweit ich weiß, kann man bei einem Element im Schatten-Dom über eine js-Var, die einen Schatten-Dom-Knoten darstellt, bestimmen, ob dieser Knoten ein Schatten-Dom-Element ist oder nicht, und seinen Baum oder seinen Baum nach oben durchlaufen bis zu dem Nicht-Schatten-Element kann es ein Kind von sein (http://stackoverflow.com/questions/27453617/how-can-i-tell-if-an-element-is-in-a-shidow-dom) Aber ohne diesen Knoten bereits, da die js Queryselector API kann nicht auf Shadow Dom selbst ausrichten, ich glaube nicht, dass Sie tun können, was Sie fragen – chiliNUT

+0

@KevBot Ich denke, das ist, was OP fragt, lol, wenn nicht ich würde gerne wissen Weißt du, wie das geht? – chiliNUT

Antwort

4

Wenn Sie überprüfen wollen, ob ein spezifischen Element ist ein Schatten DOM-Element-Hosting, können Sie wie folgt vorgehen:

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

Sie können auch die Schatten DOM-Element, und dann arbeiten auf es wie ein normaler Knoten:

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

Hier ist ein Beispiel, das in der neuesten Version von Chrome funktioniert:

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

Ich gab Ihnen die strenge Methode zur Überprüfung der Bedingung in all diesen Beispielen. Sie können natürlich auch Sie wie folgt auch:

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

Danke für die Antwort, das sieht gut aus! Ihr Absatzbeispiel scheint definitiv zu funktionieren.Jetzt, wo ich das mehr erforsche, denke ich, dass dein Beispiel, das Element wirklich zu bekommen, das ist, was ich wirklich brauche. Irgendeine Idee, warum das nicht zu funktionieren scheint? http://codepen.io/chasebank/pen/WrPEzX/ Ich habe bemerkt, dass wenn Sie die Schattenwurzel erstellen, es als '# shadow-root (open)' angezeigt wird, während der Browser '# shadow-root (user-agent) '. Ich hoffe, das ist kein Problem. Auch FYI, CodePen hat jetzt eine Konsole. Der Knopf dafür ist unten links. Eine Art neuartiges Feature ... – Chase

+0

@Chase, es sieht so aus, als ob kein shadow dom Element im Eingang vorhanden ist. Versuchen Sie das [codepen] (http://codepen.io/anon/pen/jWdYNm?editors=1111). Ich habe etwas überprüft, um zu sehen, ob ein Schatten-DOM-Element vorhanden war, bevor ich versuche, das innereHTML-Element zu erhalten. – KevBot

+0

Interessant. Wenn ich es mit Show User Agent Shodow DOM aktiviert überprüfe, sehe ich '# shadow-root (user-agent)

' innerhalb des Input-Tags. Weißt du, wie sich das von dem unterscheidet, nach dem dein Code sucht? – Chase

4

Sie die shadowRoot eines Elements zugreifen können mit der Eigenschaft shadowRoot, so dass Sie alle Knoten durchqueren können und überprüfen, ob die Eigenschaft null ist oder nicht.

Sie können alle Knoten in einem Dokument mit document.getElementsByTagName('*') auswählen.

Also alles in allem, würden wir etwas davon haben:

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