dom-render 1.0.73 → 1.0.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/Config.d.ts +38 -36
  2. package/Config.js +2 -2
  3. package/DomRender.d.ts +28 -4
  4. package/DomRender.js +90 -39
  5. package/DomRenderProxy.d.ts +29 -29
  6. package/DomRenderProxy.js +338 -327
  7. package/README.MD +638 -511
  8. package/RawSet.d.ts +140 -117
  9. package/RawSet.js +765 -882
  10. package/components/ComponentSet.d.ts +7 -0
  11. package/components/ComponentSet.js +14 -0
  12. package/dist/bundle.js +3796 -3133
  13. package/events/EventManager.d.ts +47 -47
  14. package/events/EventManager.js +499 -499
  15. package/iterators/Range.d.ts +22 -22
  16. package/iterators/Range.js +65 -65
  17. package/lifecycle/OnBeforeReturnGet.d.ts +3 -3
  18. package/lifecycle/OnBeforeReturnGet.js +2 -2
  19. package/lifecycle/OnBeforeReturnSet.d.ts +3 -3
  20. package/lifecycle/OnBeforeReturnSet.js +2 -2
  21. package/lifecycle/OnCreateRender.d.ts +3 -3
  22. package/lifecycle/OnCreateRender.js +2 -2
  23. package/lifecycle/OnDestroyRender.d.ts +4 -0
  24. package/lifecycle/OnDestroyRender.js +2 -0
  25. package/lifecycle/OnInitRender.d.ts +7 -7
  26. package/lifecycle/OnInitRender.js +2 -2
  27. package/lifecycle/OnProxyDomRender.d.ts +4 -0
  28. package/lifecycle/OnProxyDomRender.js +2 -0
  29. package/managers/RenderManager.d.ts +3 -3
  30. package/managers/RenderManager.js +18 -18
  31. package/messenger/DefaultMessenger.d.ts +3 -0
  32. package/messenger/DefaultMessenger.js +27 -0
  33. package/messenger/Messenger.d.ts +78 -0
  34. package/messenger/Messenger.js +201 -0
  35. package/operators/Appender.d.ts +7 -12
  36. package/operators/Appender.js +32 -39
  37. package/operators/AttrExpresion.d.ts +4 -0
  38. package/operators/AttrExpresion.js +68 -0
  39. package/operators/Dr.d.ts +4 -0
  40. package/operators/Dr.js +62 -0
  41. package/operators/DrAppender.d.ts +4 -0
  42. package/operators/DrAppender.js +65 -0
  43. package/operators/DrFor.d.ts +4 -0
  44. package/operators/DrFor.js +62 -0
  45. package/operators/DrForOf.d.ts +4 -0
  46. package/operators/DrForOf.js +65 -0
  47. package/operators/DrForm.d.ts +4 -0
  48. package/operators/DrForm.js +100 -0
  49. package/operators/DrIf.d.ts +4 -0
  50. package/operators/DrIf.js +72 -0
  51. package/operators/DrInnerHTML.d.ts +4 -0
  52. package/operators/DrInnerHTML.js +60 -0
  53. package/operators/DrInnerText.d.ts +4 -0
  54. package/operators/DrInnerText.js +58 -0
  55. package/operators/DrPre.d.ts +4 -0
  56. package/operators/DrPre.js +30 -0
  57. package/operators/DrRepeat.d.ts +4 -0
  58. package/operators/DrRepeat.js +63 -0
  59. package/operators/DrTargetAttr.d.ts +4 -0
  60. package/operators/DrTargetAttr.js +55 -0
  61. package/operators/DrTargetElement.d.ts +4 -0
  62. package/operators/DrTargetElement.js +65 -0
  63. package/operators/DrThis.d.ts +4 -0
  64. package/operators/DrThis.js +59 -0
  65. package/operators/OperatorRender.d.ts +41 -0
  66. package/operators/OperatorRender.js +21 -0
  67. package/package.json +94 -94
  68. package/routers/HashRouter.d.ts +9 -9
  69. package/routers/HashRouter.js +53 -53
  70. package/routers/PathRouter.d.ts +9 -9
  71. package/routers/PathRouter.js +52 -52
  72. package/routers/Router.d.ts +25 -22
  73. package/routers/Router.js +116 -94
  74. package/types/Types.d.ts +14 -14
  75. package/types/Types.js +36 -36
  76. package/utils/clipboard/ClipBoardUtils.d.ts +6 -6
  77. package/utils/clipboard/ClipBoardUtils.js +25 -25
  78. package/utils/dom/DomUtils.d.ts +13 -13
  79. package/utils/dom/DomUtils.js +47 -47
  80. package/utils/location/LocationUtils.d.ts +16 -16
  81. package/utils/location/LocationUtils.js +57 -57
  82. package/utils/node/NodeUtils.d.ts +10 -10
  83. package/utils/node/NodeUtils.js +27 -27
  84. package/utils/random/RandomUtils.d.ts +7 -7
  85. package/utils/random/RandomUtils.js +47 -47
  86. package/utils/script/ScriptUtils.d.ts +14 -14
  87. package/utils/script/ScriptUtils.js +89 -89
  88. package/utils/storage/StorageUtils.d.ts +9 -9
  89. package/utils/storage/StorageUtils.js +48 -48
  90. package/utils/string/StringUtils.d.ts +5 -5
  91. package/utils/string/StringUtils.js +41 -41
  92. package/utils/valid/ValidUtils.d.ts +10 -10
  93. package/utils/valid/ValidUtils.js +78 -78
  94. package/validators/AllCheckedValidatorArray.d.ts +6 -6
  95. package/validators/AllCheckedValidatorArray.js +32 -32
  96. package/validators/AllUnCheckedValidatorArray.d.ts +6 -6
  97. package/validators/AllUnCheckedValidatorArray.js +32 -32
  98. package/validators/CheckedValidator.d.ts +5 -5
  99. package/validators/CheckedValidator.js +32 -32
  100. package/validators/CountEqualsCheckedValidatorArray.d.ts +7 -7
  101. package/validators/CountEqualsCheckedValidatorArray.js +34 -34
  102. package/validators/CountEqualsUnCheckedValidatorArray.d.ts +7 -7
  103. package/validators/CountEqualsUnCheckedValidatorArray.js +34 -34
  104. package/validators/CountGreaterThanCheckedValidatorArray.d.ts +7 -7
  105. package/validators/CountGreaterThanCheckedValidatorArray.js +34 -34
  106. package/validators/CountGreaterThanEqualsCheckedValidatorArray.d.ts +7 -7
  107. package/validators/CountGreaterThanEqualsCheckedValidatorArray.js +34 -34
  108. package/validators/CountGreaterThanEqualsUnCheckedValidatorArray.d.ts +7 -7
  109. package/validators/CountGreaterThanEqualsUnCheckedValidatorArray.js +34 -34
  110. package/validators/CountGreaterThanUnCheckedValidatorArray.d.ts +7 -7
  111. package/validators/CountGreaterThanUnCheckedValidatorArray.js +34 -34
  112. package/validators/CountLessThanCheckedValidatorArray.d.ts +7 -7
  113. package/validators/CountLessThanCheckedValidatorArray.js +34 -34
  114. package/validators/CountLessThanEqualsCheckedValidatorArray.d.ts +7 -7
  115. package/validators/CountLessThanEqualsCheckedValidatorArray.js +34 -34
  116. package/validators/CountLessThanEqualsUnCheckedValidatorArray.d.ts +7 -7
  117. package/validators/CountLessThanEqualsUnCheckedValidatorArray.js +34 -34
  118. package/validators/CountLessThanUnCheckedValidatorArray.d.ts +7 -7
  119. package/validators/CountLessThanUnCheckedValidatorArray.js +34 -34
  120. package/validators/CountUnCheckedValidatorArray.d.ts +7 -7
  121. package/validators/CountUnCheckedValidatorArray.js +34 -34
  122. package/validators/EmptyValidator.d.ts +5 -5
  123. package/validators/EmptyValidator.js +33 -33
  124. package/validators/ExcludeCheckedValidatorArray.d.ts +8 -8
  125. package/validators/ExcludeCheckedValidatorArray.js +41 -41
  126. package/validators/FormValidator.d.ts +7 -7
  127. package/validators/FormValidator.js +37 -37
  128. package/validators/IncludeCheckedValidatorArray.d.ts +8 -8
  129. package/validators/IncludeCheckedValidatorArray.js +41 -41
  130. package/validators/MultipleValidator.d.ts +8 -8
  131. package/validators/MultipleValidator.js +48 -48
  132. package/validators/NonPassValidator.d.ts +5 -5
  133. package/validators/NonPassValidator.js +31 -31
  134. package/validators/NotEmptyValidator.d.ts +5 -5
  135. package/validators/NotEmptyValidator.js +34 -34
  136. package/validators/NotRegExpTestValidator.d.ts +6 -6
  137. package/validators/NotRegExpTestValidator.js +42 -42
  138. package/validators/PassValidator.d.ts +5 -5
  139. package/validators/PassValidator.js +31 -31
  140. package/validators/RegExpTestValidator.d.ts +6 -6
  141. package/validators/RegExpTestValidator.js +43 -43
  142. package/validators/RequiredValidator.d.ts +5 -5
  143. package/validators/RequiredValidator.js +33 -33
  144. package/validators/UnCheckedValidator.d.ts +5 -5
  145. package/validators/UnCheckedValidator.js +32 -32
  146. package/validators/ValidMultipleValidator.d.ts +9 -9
  147. package/validators/ValidMultipleValidator.js +34 -34
  148. package/validators/ValidValidator.d.ts +6 -6
  149. package/validators/ValidValidator.js +33 -33
  150. package/validators/ValidValidatorArray.d.ts +7 -7
  151. package/validators/ValidValidatorArray.js +33 -33
  152. package/validators/Validator.d.ts +57 -57
  153. package/validators/Validator.js +242 -242
  154. package/validators/ValidatorArray.d.ts +17 -17
  155. package/validators/ValidatorArray.js +99 -99
  156. package/validators/ValueEqualsValidator.d.ts +6 -6
  157. package/validators/ValueEqualsValidator.js +33 -33
  158. package/validators/ValueNotEqualsValidator.d.ts +6 -6
  159. package/validators/ValueNotEqualsValidator.js +33 -33
package/README.MD CHANGED
@@ -1,511 +1,638 @@
1
- DOM-RENDER
2
- ===
3
- [![typescript](https://img.shields.io/badge/-npm-black?logo=npm)](https://www.npmjs.com/package/dom-render) [![license](https://img.shields.io/badge/license-MIT-green)](LICENSE.md)
4
- * view template engine
5
- * Dom control and reorder and render
6
- * all internal variables are managed by proxy. (DomRenderProxy)
7
-
8
- # 🚀 Quick start
9
- ```html
10
- <script src="https://visualkhh.github.io/dom-render/cdn/dom-render@1.0.73.js"></script>
11
- ```
12
- ```html
13
- <!DOCTYPE html>
14
- <html lang="en">
15
- <head>
16
- <meta charset="UTF-8">
17
- <title>Title</title>
18
- </head>
19
- <body id="app">
20
- ${this.name}$
21
- <script src="https://visualkhh.github.io/dom-render/cdn/dom-render@1.0.73.js"></script>
22
- <script>
23
- let data = {
24
- name: 'my name is dom-render'
25
- };
26
- data = DomRender.run(data , document.querySelector('#app'));
27
- </script>
28
- </body>
29
- </html>
30
- ```
31
-
32
- # 😃 examples
33
- - [examples](./examples)
34
-
35
-
36
- ## Expression
37
- <details>
38
- <summary>${...}$, #{...}# <strong>🔻(click)</strong></summary>
39
-
40
- ### ${}$ innerTEXT, #{}# innerHTML
41
- ```html
42
- <body id="app">
43
- ${this.name}$ <!-- outout: <i>my name is dom-render</i> -->
44
- #{this.name}# <!-- outout text is italic: my name is dom-render -->
45
- <script>
46
- let data = {
47
- name: '<i>my name is dom-render</i>'
48
- };
49
- data = DomRender.run(data , document.querySelector('#app'));
50
- </script>
51
- </body>
52
- ```
53
- </details>
54
-
55
- # dom-render attributes
56
-
57
- ## control, print Statement
58
- <details>
59
- <summary>dr-if<strong>🔻(click)</strong></summary>
60
-
61
- ### if element render
62
- ```html
63
- <body id="app">
64
- <div dr-if="true">true</div> <!-- render -->
65
- <div dr-if="this.gender === 'M'">gender: M</div> <!-- No Render -->
66
- <script>
67
- let data = {
68
- gender: 'F'
69
- };
70
- data = DomRender.run(data , document.querySelector('#app'));
71
- </script>
72
- </body>
73
- ```
74
- </details>
75
-
76
- <details>
77
- <summary>dr-for, dr-for-of<strong>🔻(click)</strong></summary>
78
-
79
- ```html
80
- <div dr-for="var i = 0; i < this.friends.length; i++"> friend</div>
81
- <div dr-for-of="this.friends"> ${#it#.name}$</div>
82
- <div dr-for-of="$range(10, 20)"><div>${#it#}$</div><div>
83
- <div dr-for="var i = 1 ; i <= 9 ; i++" dr-it="i">
84
- ${#it#}$ *
85
- <scope dr-for="var y = 1 ; y <= 9 ; y++" dr-it="y" dr-var="superIt=#it#" dr-strip="true">
86
- #it# = ${var.superIt * #it#}$
87
- </scope>
88
- </div>
89
- ```
90
- </details>
91
-
92
- <details>
93
- <summary>dr-repeat<strong>🔻(click)</strong></summary>
94
-
95
- ```html
96
- <div dr-repeat="10"><div>#it#</div></div>
97
- <div dr-repeat="$range(10, 20)"><div>#it#</div></div>
98
- <div dr-repeat="$range(10, 20, 5)"><div>#it#</div></div>
99
- <div dr-repeat="$range('10..5, 2')"><div>#it#</div></div>
100
- ```
101
- </details>
102
-
103
- <details>
104
- <summary>dr-inner-text, dr-inner-html<strong>🔻(click)</strong></summary>
105
-
106
- ```html
107
- <div dr-inner-text="'<b>aa</b> <button dr-event-click=\'alert(1)\'>aa</button>'"> friend</div>
108
- <div dr-inner-html="'<b>aa</b> <button dr-event-click=\'alert(1)\'>aa</button>'"> friend</div>
109
- ```
110
- </details>
111
-
112
-
113
- ## event
114
- <details>
115
- <summary>dr-event-(name)<strong>🔻(click)</strong></summary>
116
-
117
- * click, mousedown, mouseup, dblclick, mouseover, mouseout, mousemove, mouseenter, mouseleave, contextmenu, keyup, keydown, keypress, change, input, submit, resize, focus, blur
118
- * ref: element
119
- * variable: $event, $target
120
- ```html
121
- click: <button dr-event-click="this.name = 'name' + new Date()">click</button> <br>
122
- change: <input type="text" dr-event-change="this.name = $target.value"> <br>
123
- input: <input type="text" dr-event-input="this.name = $target.value"> <br>
124
- keyup: <input type="text" dr-event-keyup="this.name = $target.value"> <br>
125
- ...
126
- keydown: <input type="text" dr-event-keydown="this.name = $target.value"><br>
127
- submit: <form dr-event-submit="console.log($event); $event.preventDefault();"><input type="text"> <button type="submit">submit</button></form><br>
128
- ```
129
- </details>
130
-
131
- <details>
132
- <summary>dr-window-event-popstate<strong>🔻(click)</strong></summary>
133
-
134
- * ref: window
135
- * variable: $target
136
-
137
- ```html
138
- window-event-popstate: <input type="text" dr-window-event-popstate="alert(this.name)"><br>
139
- ```
140
- </details>
141
-
142
- <details>
143
- <summary>dr-event<strong>🔻(click)</strong></summary>
144
-
145
- * other event
146
- * ref: element
147
- * variable: $params, $event
148
-
149
-
150
- ```html
151
- <input dr-event:bind='eventName1, eventName2' dr-event="console.log('event', $params, $event)" type="text">
152
- ```
153
- </details>
154
-
155
-
156
-
157
- ## value
158
- <details>
159
- <summary>dr-value, value-link<strong>🔻(click)</strong></summary>
160
-
161
- * dr-value
162
- * The value is assigned the first time.
163
- * dr-value-link
164
- * Value and variable values are referencing each other. It affects each other when changing. (Immediate reflection event: input)
165
-
166
- ```html
167
- dr-value: <input type="text" dr-value="this.office.name"> <br>
168
- dr-value-link: <input type="text" dr-value-link="this.office.addr.street"> <br>
169
- ```
170
- </details>
171
-
172
- ## other
173
- <details>
174
- <summary>dr-attr<strong>🔻(click)</strong></summary>
175
-
176
- ```html
177
- <textarea dr-attr="{rows: this.age/2, cols: this.age}"></textarea>
178
- <div dr-attr="{wow: '123', good: 123444}"></div>
179
- <div dr-attr="['wow=123', 'good=123444']"></div>
180
- <div dr-attr="'wow=123, good=123444'"></div>
181
- ```
182
- </details>
183
-
184
- <details>
185
- <summary>dr-class<strong>🔻(click)</strong></summary>
186
-
187
- ```html
188
- <div dr-class="{big: this.age > 50, red: this.age > 50}"></div>
189
- <div dr-class="'big yellow ' + (this.age > 50 ? 'old' : 'young')"></div>
190
- <div dr-class="['small', 'yellow']"></div>
191
- ```
192
- </details>
193
-
194
- <details>
195
- <summary>dr-style<strong>🔻(click)</strong></summary>
196
-
197
- ```html
198
- <div dr-style="{fontSize: this.age + 'px'}"> style </div>
199
- <div dr-style="{'font-size': '20px'}"> style</div>
200
- <div dr-style="'font-size: ' + this.age +'px; margin: ' + this.age + 'px'"> style </div>
201
- <div dr-style="['font-size: ' + this.age +'px', 'margin: ' + this.age + 'px']"> style </div>
202
- ```
203
- </details>
204
-
205
- <details>
206
- <summary>dr-strip<strong>🔻(click)</strong></summary>
207
-
208
- ```html
209
- <div dr-strip="true"><span>hello</span></div> <!-- output html : <span>hello</span> -->
210
- ```
211
- </details>
212
-
213
- <details>
214
- <summary>dr-before, dr-after<strong>🔻(click)</strong></summary>
215
-
216
- ```html
217
- <div dr-before="console.log('process before')" dr-after="console.log('process after')"></div>
218
- ```
219
- </details>
220
-
221
- <details>
222
- <summary>dr-complete<strong>🔻(click)</strong></summary>
223
-
224
- ```html
225
- <select dr-value-link="this.currentContry" dr-event-change="this.contryChange($event)">
226
- <option dr-for-of="this.languages" dr-value="#it#.key" dr-complete="this.currentContry='defaultValue'">${#it#.title}$</option>
227
- </select>
228
- ```
229
- </details>
230
-
231
- ## dr-form
232
- <details>
233
- <summary>form<strong>🔻(click)</strong></summary>
234
- * event: change
235
- * modify change: dr-form:event="input"
236
-
237
- ```html
238
- <body id="app">
239
- <form dr-form="this.form" dr-event-submit="this.submit(); $event.preventDefault();">
240
- name: <input name="name">
241
- age: <input name="age">
242
- <button type="submit">submit</button>
243
- </form>
244
- <script>
245
- let data = {
246
- form: {},
247
- submit() {
248
- console.log(this.form);
249
- }
250
- };
251
- data = DomRender.run(data , document.querySelector('#app'));
252
- </script>
253
- </body>
254
- <!-- 💥 submit call -->
255
- <!-- console: {name: 'name data', age: 'age data'} -->
256
- ```
257
- </details>
258
-
259
- <details>
260
- <summary>validator<strong>🔻(click)</strong></summary>
261
-
262
- ```html
263
- <body id="app">
264
- <form dr-form="this.form" dr-event-submit="this.submit(); $event.preventDefault();">
265
- name: <input name="name">
266
- age: <input name="age">
267
- <button type="submit">submit</button>
268
- </form>
269
- <script>
270
- const form = new FormValidator();
271
- form.name = new NotEmptyValidator();
272
- form.age = new NotEmptyValidator();
273
- let data = {
274
- form,
275
- submit() {
276
- if (this.form.valid()){
277
- console.log('valid');
278
- } else {
279
- console.log('inValid');
280
- }
281
- }
282
- };
283
- data = DomRender.run(data , document.querySelector('#app'));
284
- </script>
285
- </body>
286
- ```
287
- validator
288
- - Validator (abstract)
289
- - ValidatorArray (abstract)
290
- - AllCheckedValidatorArray
291
- - AllUnCheckedValidatorArray
292
- - CheckedValidator
293
- - CountEqualsCheckedValidatorArray
294
- - CountEqualsUnCheckedValidatorArray
295
- - CountGreaterThanCheckedValidatorArray
296
- - CountGreaterThanEqualsCheckedValidatorArray
297
- - CountGreaterThanEqualsUnCheckedValidatorArray
298
- - CountGreaterThanUnCheckedValidatorArray
299
- - CountLessThanCheckedValidatorArray
300
- - CountLessThanEqualsCheckedValidatorArray
301
- - CountLessThanEqualsUnCheckedValidatorArray
302
- - CountLessThanUnCheckedValidatorArray
303
- - CountUnCheckedValidatorArray
304
- - EmptyValidator
305
- - ExcludeCheckedValidatorArray
306
- - FormValidator
307
- - IncludeCheckedValidatorArray
308
- - MultipleValidator
309
- - NonPassValidator
310
- - NotEmptyValidator
311
- - NotRegExpTestValidator
312
- - PassValidator
313
- - RegExpTestValidator
314
- - RequiredValidator
315
- - UnCheckedValidator
316
- - ValidMultipleValidator
317
- - ValidValidator
318
- - ValidValidatorArray
319
- - ValueEqualsValidator
320
- - ValueNotEqualsValidator
321
- </details>
322
-
323
-
324
-
325
- ## Route
326
- <details>
327
- <summary>Route<strong>🔻(click)</strong></summary>
328
-
329
- - [examples](./examples/router)
330
-
331
- * config routerType: 'hash' | 'path' (default: 'hash')
332
- ```typescript
333
- // Config
334
- const config: Config = {
335
- window
336
- };
337
- config.targetElements = [
338
- RawSet.createComponentTargetElement('page-main', (e, o, r) => new Main(), MainTemplate, undefined, config),
339
- RawSet.createComponentTargetElement('page-second', (e, o, r) => new Second(), SecondTemplate, undefined, config),
340
- RawSet.createComponentTargetElement('page-detail', (e, o, r) => new Detail(), DetailTemplate, undefined, config)
341
- ];
342
- config.routerType = 'hash';
343
- const data = DomRender.run(new Data(), document.querySelector('#app')!, config);
344
- ```
345
- ```html
346
- <header>
347
- <button dr-event-click="$router.go('/')">main</button>
348
- <button dr-event-click="$router.go('/second', {secondata: 555})">second</button>
349
- <button dr-event-click="$router.go('/detail/25?name=zzz')">detail</button>
350
- </div>
351
- </header>
352
- <main>
353
- <page-main dr-if="$router.test('/')"></page-main>
354
- <page-second dr-if="$router.test('/second')"></page-second>
355
- <page-detail url='/detail/{id:[0-9]+}' dr-if="$router.test($attribute.url)" dr-on-create="$router.getRouteData($attribute.url)"></page-detail>
356
- </main>
357
- ```
358
-
359
- ```typescript
360
- import {RouteData} from 'dom-render/routers/Router';
361
- import {OnCreateRender} from 'dom-render/lifecycle/OnCreateRender';
362
-
363
- export class Detail implements OnCreateRender {
364
- name = 'Detail';
365
-
366
- onCreateRender(routeData: RouteData) {
367
- console.log('routeData->', routeData);
368
- }
369
- }
370
- ```
371
- ```typescript
372
- // RouteData type
373
- type RouteData = {
374
- path: string;
375
- url: string;
376
- data?: any;
377
- searchParams: URLSearchParams;
378
- pathData?: any;
379
- }
380
- ```
381
- </details>
382
-
383
-
384
-
385
- ## Class
386
- <details>
387
- <summary>Range<strong>🔻(click)</strong></summary>
388
-
389
- ```javascript
390
- const range = new Range(100,55, 10);
391
- for (let data of new Range(100,55, 10)) {
392
- console.log(data);
393
- }
394
- const rangeArray = new Range(100,55, 10).toArray();
395
- ```
396
- </details>
397
-
398
- ## Detect Get, Set
399
- <details>
400
- <summary>Method Proxy<strong>🔻(click)</strong></summary>
401
-
402
- ### using detect
403
- ```typescript
404
- {
405
- name: 'dom-render'
406
- onBeforeReturnSet: (name: string, value: any, fullpath: string[]) => {
407
- console.log('set name-->', name, value, fullpath);
408
- }
409
- onBeforeReturnGet: (name: string, value: any, fullpath: string[]) => {
410
- console.log('get name-->', name, value, fullpath);
411
- }
412
- }
413
- ```
414
- exclude detect property: Config
415
- - proxyExcludeOnBeforeReturnGets: ['propertyName']
416
- - proxyExcludeOnBeforeReturnSets: ['propertyName']
417
- ---
418
-
419
- ### OnBeforeReturnSet
420
- ```typescript
421
- export interface OnBeforeReturnSet {
422
- onBeforeReturnSet(name: string, value: any, fullPath?: string[]): void;
423
- }
424
- ```
425
- ### OnBeforeReturnGet
426
- ```typescript
427
- export interface OnBeforeReturnGet {
428
- onBeforeReturnGet(name: string, value: any, fullPath?: string[]): void;
429
- }
430
- ```
431
- </details>
432
-
433
-
434
-
435
- ## Proxy
436
- all internal variables are managed by proxy. (DomRenderProxy)
437
- ### exclude proxy (situation: Maximum call stack error)
438
- exclude detect property: Config
439
- - proxyExcludeTyps: [Class...]
440
-
441
- Code base
442
- ```typescript
443
- // frezz
444
- {name : Object.freeze({...})}
445
-
446
- // Shield Object type: {[k: string]: any}
447
- {name : new Shield()}
448
-
449
- // DomRenderProxy Final
450
- {name : DomRenderProxy.final({...})}
451
- ```
452
- ---
453
-
454
-
455
- ## LifeCycle
456
- * OnInitRender
457
- * onInitRender(): init render call
458
-
459
- ## Script
460
- ```typescript
461
- new DomRender.run(obj, target, {
462
- scripts: {
463
- concat: function (head: string, tail: string) {
464
- return head + tail;
465
- }
466
- }
467
- });
468
- ```
469
- using script
470
- ```typescript
471
- const data = config.scripts.concat('head', 'tail')
472
- ```
473
- ```html
474
- <div>${$scripts.concat('head', 'tail')}</div>
475
- <div dr-if="$scripts.concat('wow', 'good') === 'wowgood'"> is wowgood</div>
476
- ```
477
-
478
- ---
479
- # Component
480
- ```typescript
481
- const templat = '<div>aaaaa${this.name}aaaaa </div>';
482
- const styles = ['p {color: red}', 'div {margin: ${this.margin} + \'px\' }'];
483
- class Component {
484
- public name = 'default name';
485
- public margin = 5;
486
- public say() {
487
- console.log('say!~')
488
- }
489
- }
490
-
491
- new DomRender.run(obj, target, {
492
- targetElements: [
493
- RawSet.createComponentTargetElement('my-element', (e, o, r) => new Component(), templat, styles, config)
494
- ],
495
- });
496
- ```
497
- using component
498
- ```html
499
- <my-element dr-on-component-init="$component.say();"></my-element>
500
- ```
501
- - attribute
502
- - dr-on-component-init: component created init call script
503
- - $component: component instance
504
- - $element: element instance
505
- - $attribute: element attribute object
506
- - $innerHTML: element innerHTML string
507
- ---
508
-
509
- # License
510
- * MIT
511
- * visualkhh@gmail.com
1
+ DOM-RENDER
2
+ ===
3
+ [![typescript](https://img.shields.io/badge/-npm-black?logo=npm)](https://www.npmjs.com/package/dom-render) [![license](https://img.shields.io/badge/license-MIT-green)](LICENSE.md)
4
+ * view template engine
5
+ * Dom control and reorder and render
6
+ * all internal variables are managed by proxy. (DomRenderProxy)
7
+
8
+ # 🚀 Quick start
9
+ ```html
10
+ <script src="https://cdn.jsdelivr.net/npm/dom-render@1.0.75/dist/bundle.js"></script>
11
+ ```
12
+ ```html
13
+ <!DOCTYPE html>
14
+ <html lang="en">
15
+ <head>
16
+ <meta charset="UTF-8">
17
+ <title>Title</title>
18
+ </head>
19
+ <body id="app">
20
+ ${this.name}$
21
+ <script src="https://cdn.jsdelivr.net/npm/dom-render@1.0.74/dist/bundle.js"></script>
22
+ <script>
23
+ let data = {
24
+ name: 'my name is dom-render'
25
+ };
26
+ data = DomRender.run(data , document.querySelector('#app'));
27
+ </script>
28
+ </body>
29
+ </html>
30
+ ```
31
+
32
+ # 😃 examples
33
+ - [examples](./examples)
34
+
35
+
36
+ ## Expression
37
+ <details>
38
+ <summary>${...}$, #{...}# <strong>🔻(click)</strong></summary>
39
+
40
+ ### ${}$ innerTEXT, #{}# innerHTML
41
+ ```html
42
+ <body id="app">
43
+ ${this.name}$ <!-- outout: <i>my name is dom-render</i> -->
44
+ #{this.name}# <!-- outout text is italic: my name is dom-render -->
45
+ <script>
46
+ let data = {
47
+ name: '<i>my name is dom-render</i>'
48
+ };
49
+ data = DomRender.run(data , document.querySelector('#app'));
50
+ </script>
51
+ </body>
52
+ ```
53
+ </details>
54
+
55
+ # dom-render attributes
56
+
57
+
58
+ ## attribute change, bind
59
+ <details>
60
+ <summary>attribute<strong>🔻(click)</strong></summary>
61
+
62
+ ### attribute
63
+ ```html
64
+ <body id="app">
65
+ <input type="text" value="${this.name}$" style="${'color: '+this.color}$">
66
+ <button dr-event-click="this.changeData();">change</button>
67
+ </body>
68
+ ```
69
+ ```typescript
70
+ class Data {
71
+ name = 'my name is dom-render';
72
+ color = '#ff0000';
73
+
74
+ changeData() {
75
+ this.name = RandomUtils.getRandomString(10);
76
+ this.color = RandomUtils.getRandomColor();
77
+ }
78
+ }
79
+ const data = DomRender.run(new Data(), document.querySelector('#app')!);
80
+ ```
81
+ </details>
82
+
83
+ ## control, print Statement
84
+ <details>
85
+ <summary>dr-if<strong>🔻(click)</strong></summary>
86
+
87
+ ### if element render
88
+ ```html
89
+ <body id="app">
90
+ <div dr-if="true">true</div> <!-- render -->
91
+ <div dr-if="this.gender === 'M'">gender: M</div> <!-- No Render -->
92
+ <script>
93
+ let data = {
94
+ gender: 'F'
95
+ };
96
+ data = DomRender.run(data , document.querySelector('#app'));
97
+ </script>
98
+ </body>
99
+ ```
100
+ </details>
101
+
102
+
103
+
104
+
105
+
106
+ <details>
107
+ <summary>dr-for, dr-for-of<strong>🔻(click)</strong></summary>
108
+
109
+ ```html
110
+ <div dr-for="var i = 0; i < this.friends.length; i++"> friend</div>
111
+ <div dr-for-of="this.friends"> ${#it#.name}$</div>
112
+ <div dr-for-of="$range(10, 20)"><div>${#it#}$</div><div>
113
+ <div dr-for="var i = 1 ; i <= 9 ; i++" dr-it="i">
114
+ ${#it#}$ *
115
+ <scope dr-for="var y = 1 ; y <= 9 ; y++" dr-it="y" dr-var="superIt=#it#" dr-strip="true">
116
+ #it# = ${var.superIt * #it#}$
117
+ </scope>
118
+ </div>
119
+ ```
120
+ </details>
121
+
122
+ <details>
123
+ <summary>dr-repeat<strong>🔻(click)</strong></summary>
124
+
125
+ ```html
126
+ <div dr-repeat="10"><div>#it#</div></div>
127
+ <div dr-repeat="$range(10, 20)"><div>#it#</div></div>
128
+ <div dr-repeat="$range(10, 20, 5)"><div>#it#</div></div>
129
+ <div dr-repeat="$range('10..5, 2')"><div>#it#</div></div>
130
+ ```
131
+ </details>
132
+
133
+ <details>
134
+ <summary>dr-inner-text, dr-inner-html<strong>🔻(click)</strong></summary>
135
+
136
+ ```html
137
+ <div dr-inner-text="'<b>aa</b> <button dr-event-click=\'alert(1)\'>aa</button>'"> friend</div>
138
+ <div dr-inner-html="'<b>aa</b> <button dr-event-click=\'alert(1)\'>aa</button>'"> friend</div>
139
+ ```
140
+ </details>
141
+
142
+
143
+ ## event
144
+ <details>
145
+ <summary>dr-event-(name)<strong>🔻(click)</strong></summary>
146
+
147
+ * click, mousedown, mouseup, dblclick, mouseover, mouseout, mousemove, mouseenter, mouseleave, contextmenu, keyup, keydown, keypress, change, input, submit, resize, focus, blur
148
+ * ref: element
149
+ * variable: $event, $target
150
+ ```html
151
+ click: <button dr-event-click="this.name = 'name' + new Date()">click</button> <br>
152
+ change: <input type="text" dr-event-change="this.name = $target.value"> <br>
153
+ input: <input type="text" dr-event-input="this.name = $target.value"> <br>
154
+ keyup: <input type="text" dr-event-keyup="this.name = $target.value"> <br>
155
+ ...
156
+ keydown: <input type="text" dr-event-keydown="this.name = $target.value"><br>
157
+ submit: <form dr-event-submit="console.log($event); $event.preventDefault();"><input type="text"> <button type="submit">submit</button></form><br>
158
+ ```
159
+ </details>
160
+
161
+ <details>
162
+ <summary>dr-window-event-popstate<strong>🔻(click)</strong></summary>
163
+
164
+ * ref: window
165
+ * variable: $target
166
+
167
+ ```html
168
+ window-event-popstate: <input type="text" dr-window-event-popstate="alert(this.name)"><br>
169
+ ```
170
+ </details>
171
+
172
+ <details>
173
+ <summary>dr-event<strong>🔻(click)</strong></summary>
174
+
175
+ * other event
176
+ * ref: element
177
+ * variable: $params, $event
178
+
179
+
180
+ ```html
181
+ <input dr-event:bind='eventName1, eventName2' dr-event="console.log('event', $params, $event)" type="text">
182
+ ```
183
+ </details>
184
+
185
+
186
+
187
+ ## value
188
+ <details>
189
+ <summary>dr-value, value-link<strong>🔻(click)</strong></summary>
190
+
191
+ * dr-value
192
+ * The value is assigned the first time.
193
+ * dr-value-link
194
+ * Value and variable values are referencing each other. It affects each other when changing. (Immediate reflection event: input)
195
+
196
+ ```html
197
+ dr-value: <input type="text" dr-value="this.office.name"> <br>
198
+ dr-value-link: <input type="text" dr-value-link="this.office.addr.street"> <br>
199
+ ```
200
+ </details>
201
+
202
+ ## other
203
+ <details>
204
+ <summary>dr-attr<strong>🔻(click)</strong></summary>
205
+
206
+ ```html
207
+ <textarea dr-attr="{rows: this.age/2, cols: this.age}"></textarea>
208
+ <div dr-attr="{wow: '123', good: 123444}"></div>
209
+ <div dr-attr="['wow=123', 'good=123444']"></div>
210
+ <div dr-attr="'wow=123, good=123444'"></div>
211
+ ```
212
+ </details>
213
+
214
+ <details>
215
+ <summary>dr-class<strong>🔻(click)</strong></summary>
216
+
217
+ ```html
218
+ <div dr-class="{big: this.age > 50, red: this.age > 50}"></div>
219
+ <div dr-class="'big yellow ' + (this.age > 50 ? 'old' : 'young')"></div>
220
+ <div dr-class="['small', 'yellow']"></div>
221
+ ```
222
+ </details>
223
+
224
+ <details>
225
+ <summary>dr-style<strong>🔻(click)</strong></summary>
226
+
227
+ ```html
228
+ <div dr-style="{fontSize: this.age + 'px'}"> style </div>
229
+ <div dr-style="{'font-size': '20px'}"> style</div>
230
+ <div dr-style="'font-size: ' + this.age +'px; margin: ' + this.age + 'px'"> style </div>
231
+ <div dr-style="['font-size: ' + this.age +'px', 'margin: ' + this.age + 'px']"> style </div>
232
+ ```
233
+ </details>
234
+
235
+ <details>
236
+ <summary>dr-strip<strong>🔻(click)</strong></summary>
237
+
238
+ ```html
239
+ <div dr-strip="true"><span>hello</span></div> <!-- output html : <span>hello</span> -->
240
+ ```
241
+ </details>
242
+
243
+ <details>
244
+ <summary>dr-before, dr-after<strong>🔻(click)</strong></summary>
245
+
246
+ ```html
247
+ <div dr-before="console.log('process before')" dr-after="console.log('process after')"></div>
248
+ ```
249
+ </details>
250
+
251
+ <details>
252
+ <summary>dr-complete<strong>🔻(click)</strong></summary>
253
+
254
+ ```html
255
+ <select dr-value-link="this.currentContry" dr-event-change="this.contryChange($event)">
256
+ <option dr-for-of="this.languages" dr-value="#it#.key" dr-complete="this.currentContry='defaultValue'">${#it#.title}$</option>
257
+ </select>
258
+ ```
259
+ </details>
260
+
261
+ ## dr-form
262
+ <details>
263
+ <summary>form<strong>🔻(click)</strong></summary>
264
+ * event: change
265
+ * modify change: dr-form:event="input"
266
+
267
+ ```html
268
+ <body id="app">
269
+ <form dr-form="this.form" dr-event-submit="this.submit(); $event.preventDefault();">
270
+ name: <input name="name">
271
+ age: <input name="age">
272
+ <button type="submit">submit</button>
273
+ </form>
274
+ <script>
275
+ let data = {
276
+ form: {},
277
+ submit() {
278
+ console.log(this.form);
279
+ }
280
+ };
281
+ data = DomRender.run(data , document.querySelector('#app'));
282
+ </script>
283
+ </body>
284
+ <!-- 💥 submit call -->
285
+ <!-- console: {name: 'name data', age: 'age data'} -->
286
+ ```
287
+ </details>
288
+
289
+ <details>
290
+ <summary>validator<strong>🔻(click)</strong></summary>
291
+
292
+ ```html
293
+ <body id="app">
294
+ <form dr-form="this.form" dr-event-submit="this.submit(); $event.preventDefault();">
295
+ name: <input name="name">
296
+ age: <input name="age">
297
+ <button type="submit">submit</button>
298
+ </form>
299
+ <script>
300
+ const form = new FormValidator();
301
+ form.name = new NotEmptyValidator();
302
+ form.age = new NotEmptyValidator();
303
+ let data = {
304
+ form,
305
+ submit() {
306
+ if (this.form.valid()){
307
+ console.log('valid');
308
+ } else {
309
+ console.log('inValid');
310
+ }
311
+ }
312
+ };
313
+ data = DomRender.run(data , document.querySelector('#app'));
314
+ </script>
315
+ </body>
316
+ ```
317
+ validator
318
+ - Validator (abstract)
319
+ - ValidatorArray (abstract)
320
+ - AllCheckedValidatorArray
321
+ - AllUnCheckedValidatorArray
322
+ - CheckedValidator
323
+ - CountEqualsCheckedValidatorArray
324
+ - CountEqualsUnCheckedValidatorArray
325
+ - CountGreaterThanCheckedValidatorArray
326
+ - CountGreaterThanEqualsCheckedValidatorArray
327
+ - CountGreaterThanEqualsUnCheckedValidatorArray
328
+ - CountGreaterThanUnCheckedValidatorArray
329
+ - CountLessThanCheckedValidatorArray
330
+ - CountLessThanEqualsCheckedValidatorArray
331
+ - CountLessThanEqualsUnCheckedValidatorArray
332
+ - CountLessThanUnCheckedValidatorArray
333
+ - CountUnCheckedValidatorArray
334
+ - EmptyValidator
335
+ - ExcludeCheckedValidatorArray
336
+ - FormValidator
337
+ - IncludeCheckedValidatorArray
338
+ - MultipleValidator
339
+ - NonPassValidator
340
+ - NotEmptyValidator
341
+ - NotRegExpTestValidator
342
+ - PassValidator
343
+ - RegExpTestValidator
344
+ - RequiredValidator
345
+ - UnCheckedValidator
346
+ - ValidMultipleValidator
347
+ - ValidValidator
348
+ - ValidValidatorArray
349
+ - ValueEqualsValidator
350
+ - ValueNotEqualsValidator
351
+ </details>
352
+
353
+
354
+
355
+ ## Route
356
+ <details>
357
+ <summary>Route<strong>🔻(click)</strong></summary>
358
+
359
+ - [examples](./examples/router)
360
+
361
+ * config routerType: 'hash' | 'path' | 'none' (default: 'none')
362
+ ```typescript
363
+ // Config
364
+ const config: Config = {
365
+ window
366
+ };
367
+ DomRender.addComponent(config, {type: Main, tagName: 'page-main'}, {template: MainTemplate})
368
+ .add({type: Second, tagName: 'page-second'}, {template: SecondTemplate})
369
+ .add({type: Detail, tagName: 'page-detail'}, {template: DetailTemplate});
370
+ config.routerType = 'hash';
371
+ config.routerType = 'hash';
372
+ const data = DomRender.run(new Data(), document.querySelector('#app')!, config);
373
+ ```
374
+ ```html
375
+ <header>
376
+ <button dr-event-click="$router.go('/')">main</button>
377
+ <button dr-event-click="$router.go('/second', {secondata: 555})">second</button>
378
+ <button dr-event-click="$router.go('/detail/25?name=zzz')">detail</button>
379
+ </div>
380
+ </header>
381
+ <main>
382
+ <page-main dr-if="$router.test('/')"></page-main>
383
+ <page-second dr-if="$router.test('/second')"></page-second>
384
+ <page-detail url='/detail/{id:[0-9]+}' dr-if="$router.test($attribute.url)" dr-on-create="$router.getRouteData($attribute.url)"></page-detail>
385
+ </main>
386
+ ```
387
+
388
+ ```typescript
389
+ import {RouteData} from 'dom-render/routers/Router';
390
+ import {OnCreateRender} from 'dom-render/lifecycle/OnCreateRender';
391
+
392
+ export class Detail implements OnCreateRender {
393
+ name = 'Detail';
394
+
395
+ onCreateRender(routeData: RouteData) {
396
+ console.log('routeData->', routeData);
397
+ }
398
+ }
399
+ ```
400
+ ```typescript
401
+ // RouteData type
402
+ type RouteData = {
403
+ path: string;
404
+ url: string;
405
+ data?: any;
406
+ searchParams: URLSearchParams;
407
+ pathData?: any;
408
+ }
409
+ ```
410
+ </details>
411
+
412
+ ## Messenger (Data transmission)
413
+ * publish, subscribe
414
+ <details>
415
+ <summary>publish<strong>🔻(click)</strong></summary>
416
+
417
+ ```typescript
418
+ export class Home implements OnProxyDomRender {
419
+ private channel?: Channel;
420
+
421
+ sendIndexMessage() {
422
+ const rtn = this.channel?.publish(Index, {
423
+ name: this.name,
424
+ age: this.age,
425
+ title: this.title
426
+ });
427
+ console.log('sendIndexMessage return value: ', rtn);
428
+ }
429
+
430
+ onProxyDomRender({messenger}: Config): void {
431
+ this.channel = messenger?.createChannel(Home);
432
+ }
433
+ }
434
+ ```
435
+ </details>
436
+ <details>
437
+ <summary>subscribe<strong>🔻(click)</strong></summary>
438
+
439
+ ```typescript
440
+ class Index implements OnProxyDomRender {
441
+ onProxyDomRender({messenger}: Config): void {
442
+ messenger?.createChannel(this).filter((data) => (data.age ?? 0) > 5).subscribe((data) => {
443
+ this.rcvData = data;
444
+ return {data: 'good', action: 'actionGood'}
445
+ });
446
+ // messenger?.createChannel(this).subscribe((data) => {
447
+ // this.rcvData = data;
448
+ // return {data: 'good', action: 'actionGood'}
449
+ // });
450
+ }
451
+ }
452
+ ````
453
+ </details>
454
+
455
+ ## Class
456
+ <details>
457
+ <summary>Range<strong>🔻(click)</strong></summary>
458
+
459
+ ```javascript
460
+ const range = new Range(100,55, 10);
461
+ for (let data of new Range(100,55, 10)) {
462
+ console.log(data);
463
+ }
464
+ const rangeArray = new Range(100,55, 10).toArray();
465
+ ```
466
+ </details>
467
+
468
+ ## Detect Get, Set
469
+ <details>
470
+ <summary>Method Proxy<strong>🔻(click)</strong></summary>
471
+
472
+ ### using detect
473
+ ```typescript
474
+ {
475
+ name: 'dom-render'
476
+ onBeforeReturnSet: (name: string, value: any, fullpath: string[]) => {
477
+ console.log('set name-->', name, value, fullpath);
478
+ }
479
+ onBeforeReturnGet: (name: string, value: any, fullpath: string[]) => {
480
+ console.log('get name-->', name, value, fullpath);
481
+ }
482
+ }
483
+ ```
484
+ exclude detect property: Config
485
+ - proxyExcludeOnBeforeReturnGets: ['propertyName']
486
+ - proxyExcludeOnBeforeReturnSets: ['propertyName']
487
+ ---
488
+
489
+ ### OnBeforeReturnSet
490
+ ```typescript
491
+ export interface OnBeforeReturnSet {
492
+ onBeforeReturnSet(name: string, value: any, fullPath?: string[]): void;
493
+ }
494
+ ```
495
+ ### OnBeforeReturnGet
496
+ ```typescript
497
+ export interface OnBeforeReturnGet {
498
+ onBeforeReturnGet(name: string, value: any, fullPath?: string[]): void;
499
+ }
500
+ ```
501
+ </details>
502
+
503
+
504
+
505
+ ## Proxy
506
+ all internal variables are managed by proxy. (DomRenderProxy)
507
+ ### exclude proxy (situation: Maximum call stack error)
508
+ exclude detect property: Config
509
+ - proxyExcludeTyps: [Class...]
510
+
511
+ Code base
512
+ ```typescript
513
+ // frezz
514
+ {name : Object.freeze({...})}
515
+
516
+ // Shield Object type: {[k: string]: any}
517
+ {name : new Shield()}
518
+
519
+ // DomRenderProxy Final
520
+ {name : DomRenderProxy.final({...})}
521
+ ```
522
+ ---
523
+
524
+
525
+ ## LifeCycle
526
+ * OnCreateRender
527
+ * onCreateRender(): created call
528
+ * OnInitRender
529
+ * onInitRender(): init render call
530
+ * OnDestroyRender
531
+ * onDestroyRender(): component Destroy call
532
+
533
+ ## Script
534
+ ```typescript
535
+ new DomRender.run(obj, target, {
536
+ scripts: {
537
+ concat: function (head: string, tail: string) {
538
+ return head + tail;
539
+ }
540
+ }
541
+ });
542
+ ```
543
+ using script
544
+ ```typescript
545
+ const data = config.scripts.concat('head', 'tail')
546
+ ```
547
+ ```html
548
+ <div>${$scripts.concat('head', 'tail')}</div>
549
+ <div dr-if="$scripts.concat('wow', 'good') === 'wowgood'"> is wowgood</div>
550
+ ```
551
+
552
+ ---
553
+ # Component, Attribute, AttributeCallBack
554
+ # 😃 examples
555
+ - [examples](./examples/component_script_attr)
556
+ ```html
557
+ <body id="app">
558
+ ${this.name}$
559
+ <h1>component</h1>
560
+ <profile dr-on-component-init="$component.name='jhone'; $component.age=55;"><b>${#component#.details}$</b></profile>
561
+ <profile dr-on-component-init="$component.name='cal'; $component.age=56;"><b>detail-2</b></profile>
562
+ <profile dr-on-component-init="$component.name='rose'; $component.age=57;">
563
+ <profile dr-on-component-init="$component.name='rose-sub'; $component.age=156;">
564
+ <b>${this.name}$</b>
565
+ </profile>
566
+ </profile>
567
+ <h3>component data link and detect</h3>
568
+ <Profile dr-if="this.toggle" dr-detect="$component.age = this.age" dr-on-component-init="$component.name='papa'; $component.age=58;">
569
+ <b>${this.name}$</b>
570
+ </Profile>
571
+
572
+ <button dr-event-click="this.name = new Date().toString();">change name</button>
573
+ <button dr-event-click="this.age = Date.now();">change age</button>
574
+ <button dr-event-click="this.toggle = !this.toggle;">change toggle</button>
575
+
576
+ <j1>component constructor, on-create, dr-on-component-init</j1>
577
+ <home dr-constructor="[this.name, this.age, 'home welcom']" dr-on-create="{type: 'onCreate', data: 'datadata'}" dr-on-component-init="$component.onInit('data')"></home>
578
+
579
+
580
+
581
+ <h1>scripts</h1>
582
+ <div>
583
+ ${$scripts.concat('hello', 'tail')}$
584
+ </div>
585
+
586
+ <h1>attr</h1>
587
+ <button link="this.link">
588
+ link attribute
589
+ </button>
590
+ <h1>attrCallBack</h1>
591
+ <input id="callback" type="text" wow>
592
+ </body>
593
+ ```
594
+ ```typescript
595
+ DomRender
596
+ .addComponent(config, {type: Profile}, {template: ProfileTemplate})
597
+ .add({type: Home}, {template: HomeTemplate});
598
+
599
+ DomRender.addAttribute(config, 'link',
600
+ (element: Element, attrValue: string, obj: any, rawSet: RawSet) => {
601
+ return obj;
602
+ },
603
+ (element: Element, attrValue: string, obj: any, rawSet: RawSet) => {
604
+ const fag = window.document.createDocumentFragment();
605
+ if (attrValue) {
606
+ const n = element.cloneNode(true) as Element;
607
+ attrValue = ScriptUtils.eval(`return ${attrValue}`, obj)
608
+ n.addEventListener('click', () => {
609
+ location.href = attrValue;
610
+ });
611
+ fag.append(n);
612
+ }
613
+ return fag;
614
+ }
615
+ );
616
+
617
+ DomRender.addAttributeCallBack(config, 'wow', (e, a, o) => {
618
+ e.addEventListener('click', (event) => {
619
+ alert((event.target as any).value);
620
+ })
621
+ })
622
+ const data = DomRender.run(new Data(), document.querySelector('#app')!, config);
623
+ ```
624
+ using component
625
+ ```html
626
+ <my-element dr-on-component-init="$component.say();"></my-element>
627
+ ```
628
+ - attribute
629
+ - dr-on-component-init: component created init call script
630
+ - $component: component instance
631
+ - $element: element instance
632
+ - $attribute: element attribute object
633
+ - $innerHTML: element innerHTML string
634
+ ---
635
+
636
+ # License
637
+ * MIT
638
+ * visualkhh@gmail.com