@@ -8,7 +8,7 @@ import { ILyricItem } from "./lyric";
88const defaultPoster = require ( '../defaultposter.jpg' )
99const htmlTemplate = require ( '../cplayer.html' ) ;
1010const playIcon = require ( '../playicon.svg' ) ;
11- require ( '../scss/cplayer.scss' ) ;
11+ const style = require ( '!css-loader!postcss-loader!sass-loader! ../scss/cplayer.scss' ) ;
1212
1313function kanaFilter ( str : string ) {
1414 const starttag = '<span class="cp-lyric-text-zoomout">' ;
@@ -54,6 +54,38 @@ const defaultOption: ICplayerViewOption = {
5454 showPlaylist : false
5555}
5656
57+ function createShadowElement ( targetElement : Element , htmlTemplate : string ) {
58+ let shadowRoot = ( targetElement as any ) . createShadowRoot ( ) as ShadowRoot ;
59+ shadowRoot . innerHTML = htmlTemplate ;
60+ let styleElement = document . createElement ( 'style' ) ;
61+ styleElement . innerText = style ;
62+ shadowRoot . appendChild ( styleElement ) ;
63+ return shadowRoot . firstChild as Element ;
64+ }
65+
66+ function createBeforeElement ( targetElement : Element , htmlTemplate : string ) {
67+ let element = document . createElement ( 'div' ) ;
68+ element . innerHTML = htmlTemplate ;
69+ targetElement . parentNode . insertBefore ( element , targetElement ) ;
70+ return targetElement . previousSibling as Element ;
71+ }
72+
73+ function createBeforeShadowElement ( targetElement : Element , htmlTemplate : string ) {
74+ let element = document . createElement ( 'div' ) ;
75+ let shadowRoot = ( element as any ) . createShadowRoot ( ) as ShadowRoot ;
76+ shadowRoot . innerHTML = htmlTemplate ;
77+ let styleElement = document . createElement ( 'style' ) ;
78+ styleElement . innerText = style ;
79+ shadowRoot . appendChild ( styleElement ) ;
80+ targetElement . parentNode . insertBefore ( element , targetElement ) ;
81+ return targetElement . previousSibling as Element ;
82+ }
83+
84+ function createElement ( targetElement : Element , htmlTemplate : string ) {
85+ targetElement . innerHTML = htmlTemplate ;
86+ return targetElement . lastChild as Element ;
87+ }
88+
5789export default class cplayerView extends EventEmitter {
5890 private elementLinks = returntypeof ( this . getElementLinks ) ;
5991 private rootElement : Element ;
@@ -69,12 +101,17 @@ export default class cplayerView extends EventEmitter {
69101 } ;
70102 this . player = player ;
71103 if ( this . options . generateBeforeElement ) {
72- let newFragment = parseHTML ( htmlTemplate ) ;
73- this . options . element . parentNode . insertBefore ( newFragment , this . options . element ) ;
74- this . rootElement = this . options . element . previousSibling as Element ;
104+ if ( ( this . options . element as any ) . createShadowRoot ) {
105+ this . rootElement = createBeforeShadowElement ( this . options . element , htmlTemplate ) ;
106+ } else {
107+ this . rootElement = createBeforeElement ( this . options . element , htmlTemplate ) ;
108+ }
75109 } else {
76- this . options . element . appendChild ( parseHTML ( htmlTemplate ) ) ;
77- this . rootElement = this . options . element . lastChild as Element ;
110+ if ( ( this . options . element as any ) . createShadowRoot ) {
111+ this . rootElement = createShadowElement ( this . options . element , htmlTemplate ) ;
112+ } else {
113+ this . rootElement = createElement ( this . options . element , htmlTemplate ) ;
114+ }
78115 }
79116 if ( options . deleteElementAfterGenerate ) {
80117 options . element . parentElement . removeChild ( options . element ) ;
0 commit comments