2013-03-20 6 views
19

Kann der Shadow-DOM-W3C-Entwurf in JavaScript poly- gefüllt werden, indem benutzerdefinierte Funktionen zum Suchen und Durchlaufen des DOM bereitgestellt werden? Ist das gemacht worden? Die Versuche, die ich gefunden habe, waren eher bescheidene Shims und scheinen sich nicht viel Mühe zu geben, die Spezifikation nachzuahmen.In welchem ​​Maße kann das Shadow DOM mit einem Polyfill emuliert werden?

Ich weiß, dass dies keine einfache Aufgabe ist, aber sicherlich hat jemand eine gründliche Prüfung gegeben?

+0

Ich kann nicht vorstellen, wie dies funktionieren würde, da das Shadow DOM die Browser-interne Benutzeroberfläche freigibt, die bis zu diesem Zeitpunkt nicht verfügbar war. Eine Lösung müsste das Browser-UI-Verhalten von Grund auf vollständig replizieren. –

+1

@Matt Stone - Eine Idee könnte sein, CSS-dom-dom-Elemente zu verstecken, die Teil des shadow dom sind, und die Javascript-DOM-Abfragefunktionen (zum Beispiel getElementById) so anzupassen, dass sie keine versteckten DOM-Elemente zurückgeben. Natürlich gibt es viel mehr als das und ein Polyfill hätte natürlich Grenzen. –

+0

@ PatriciaBrothers - es könnte möglicherweise mit Hilfe von Dokumentfragmenten emuliert werden, oder indem die Schattenkomponenten aus dem DOM entfernt und in, sagen wir, ein div gesetzt werden. Ich bezweifle, dass dieses Zeug weit verbreitet ist und daher nicht viel benötigt wird. – RobG

Antwort

26

Ich habe in den letzten Monaten an genau diesem Problem gearbeitet.

Unterm Strich ein polyfill ist, die^immergrün auf Browsern funktioniert hier https://github.com/Polymer/ShadowDOM

^polyfilling von CSS-Funktionen wie @host noch nicht dort sind, werden bald

Also, ja, es ist ein harte Sache, Polyfill, speziell weil wir sekundäre DOM Bäume erfinden müssen. Wir haben versucht, es so benutzerfreundlich wie möglich zu machen, was eine ziemlich invasive Wrapper-Technik erforderte.

Mit anderen Worten, wenn Sie div = document.createElement('div'), erhalten Sie eine Sache, die wie ein DIV aussieht und funktioniert wie ein DIV, ist aber eigentlich ein Wrapper-Objekt. Das ultimative Ziel ist natürlich, dass Ihr Code gleich aussieht, egal ob er unter dem Polyfill oder unter einer nativen Implementierung läuft.

Es ist nicht 100% kugelsicher, insbesondere ist es uns nicht möglich, document für Sie zu wickeln, so dass Sie tun, dass Sie sich, a la:

wrap(document).querySelector(...) 

Anders als die document Ausgabe, die Wrapper beabsichtigt, transparent zu arbeiten. Das ist alles brandneu, also entschuldige ich mich für den Mangel an Dokumenten. Daran arbeiten wir gerade.

Bitte file issues Wenn Sie Fragen oder Probleme haben, wir lieben es, Feedback zu bekommen. Es gibt auch einen E-Mail-Kanal zur Diskussion dieses Polyfill (und der anderen Polyfills in dieser Organisation) unter [email protected]

Ich bezweifle das Zeug weit

implementiert

Das stimmt, aber es ist in Chrome dest an.

+0

Wow, Scott. Das ist großartig. Ich nehme an, das wäre (würde) ein Hit sein, wenn Sie diese Att Google I/O präsentieren. Wenn Webkomponenten in IE9/10 erfolgreich in irgendeiner Form oder Form polygefüllt werden können, wird der Browseranbieter, der nicht namentlich genannt werden darf, gezwungen, auf Ihre vorgeschlagenen und schönen W3C-Einsendungen zu springen. Ansonsten gibt es viele Gründe und Kräfte, um dies zu einem weiteren WebGL oder Dart zu machen.Dies führt dazu, dass viele ISVs für viele Anwendungskategorien eher auf das Web als auf den Desktop ausgerichtet sind. –

+1

Das Shim ist sehr beeindruckend ... Ich frage mich, ist es eine praktikable Option für Websites, die mobilfreundlich sein müssen? Ich bin mir sicher, dass es einen Leistungseinbruch geben muss, der mit der Verwaltung des Schatten-DOM verbunden ist. –

+1

Ja, es gibt Leistungseinbußen beim Füllen von Schatten-DOM, aber wir haben noch keine festen Zahlen. Die gesamte Entwicklung ist offen, also werden wir alle Daten teilen, die wir generieren. Die Hoffnung ist, dass die Nutzungsmuster, wenn sie mit anderen Technologien wie Custom Elements und MDV verwendet werden, dazu neigen, das Polyfill weniger häufig zu provozieren. –