efront 2.44.10 → 2.46.1

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 (54) hide show
  1. package/coms/basic/BitTree.js +1 -1
  2. package/coms/basic/crypt.js +1 -1
  3. package/coms/basic/decodeRange.js +0 -1
  4. package/coms/basic/loader.js +3 -2
  5. package/coms/basic/parseURL_test.js +32 -0
  6. package/coms/basic/refilm_decode.js +13 -2
  7. package/coms/basic/valid.js +10 -0
  8. package/coms/compile/scanner2.js +1 -1
  9. package/coms/zimoli/alert.js +12 -7
  10. package/coms/zimoli/appendChild.js +1 -0
  11. package/coms/zimoli/autodragchildren.js +96 -116
  12. package/coms/zimoli/avatar.js +0 -1
  13. package/coms/zimoli/button.js +5 -0
  14. package/coms/zimoli/button.less +6 -2
  15. package/coms/zimoli/checker.less +13 -14
  16. package/coms/zimoli/color.js +128 -83
  17. package/coms/zimoli/colorpad.js +2 -4
  18. package/coms/zimoli/cross.js +1 -1
  19. package/coms/zimoli/css.js +1 -0
  20. package/coms/zimoli/data.js +16 -9
  21. package/coms/zimoli/drag.js +2 -1
  22. package/coms/zimoli/encode62.js +13 -0
  23. package/coms/zimoli/field.html +2 -0
  24. package/coms/zimoli/field.js +41 -17
  25. package/coms/zimoli/field.less +19 -0
  26. package/coms/zimoli/form.js +8 -0
  27. package/coms/zimoli/gallery.js +2 -12
  28. package/coms/zimoli/getGenerator.js +16 -10
  29. package/coms/zimoli/getTreeFromData.js +9 -3
  30. package/coms/zimoli/image.less +4 -0
  31. package/coms/zimoli/list.js +2 -12
  32. package/coms/zimoli/menu.js +14 -14
  33. package/coms/zimoli/menu.less +1 -1
  34. package/coms/zimoli/menuItem.js +4 -1
  35. package/coms/zimoli/menuList.js +4 -3
  36. package/coms/zimoli/model.js +1 -0
  37. package/coms/zimoli/on.js +18 -0
  38. package/coms/zimoli/radio.html +1 -3
  39. package/coms/zimoli/radio.less +22 -16
  40. package/coms/zimoli/render.js +118 -151
  41. package/coms/zimoli/renderDefaults.js +1 -0
  42. package/coms/zimoli/submit.js +41 -0
  43. package/coms/zimoli/table.html +16 -0
  44. package/coms/zimoli/table.js +23 -1
  45. package/coms/zimoli/table.less +57 -39
  46. package/coms/zimoli/tree.js +4 -4
  47. package/coms/zimoli/view.js +0 -5
  48. package/coms/zimoli/view.less +21 -11
  49. package/coms/zimoli/zimoli.js +21 -13
  50. package/package.json +1 -1
  51. package/public/efront.js +1 -1
  52. package/coms/zimoli/beian.html +0 -1
  53. package/coms/zimoli/beian.js +0 -5
  54. package/coms/zimoli/beian.less +0 -13
@@ -433,18 +433,8 @@ function list() {
433
433
  bindSrc = container;
434
434
  container = div();
435
435
  } else if (container && !generator) {
436
- var src = container.getAttribute("src") || container.getAttribute("ng-src") || container.getAttribute("v-src");
437
- if (src) {
438
- var parsedSrc = render.parseRepeat(src);
439
- if (!parsedSrc) {
440
- container.setAttribute("ng-src", src);
441
- container.removeAttribute("src");
442
- var generator = getGenerator(container);
443
- } else {
444
- container.setAttribute("ng-src", parsedSrc.srcName);
445
- container.removeAttribute("src");
446
- var generator = getGenerator(container, parsedSrc);
447
- }
436
+ if ("$src" in container) {
437
+ generator = getGenerator(container);
448
438
  care(container, function () {
449
439
  var index = container.index();
450
440
  container.clean();
@@ -101,19 +101,15 @@ function main(elem, mode) {
101
101
  // }
102
102
  // elem.setAttribute('browser', os);
103
103
  var mode = elem.getAttribute('mode') || elem.getAttribute('type');
104
- mode = mode ? mode.toLowerCase() : "horizonal";
105
- var src = elem.getAttribute("src") || elem.getAttribute("ng-src") || elem.getAttribute("v-src");
106
- if (src) {
107
- var parsedSrc = render.parseRepeat(src);
108
- if (!parsedSrc) {
109
- elem.removeAttribute("src");
110
- var generator = getGenerator(elem);
111
- } else {
112
- elem.removeAttribute("src");
113
- var generator = getGenerator(elem, parsedSrc);
104
+ if (!mode) {
105
+ if (/^[xyhvtci]/i.test(elem.tagName)) {
106
+ mode = elem.tagName.slice(0, 1);
107
+ }
108
+ else if (/[xyhvtci]$/i.test(elem.tagName)) {
109
+ mode = elem.tagName.slice(0, 1);
114
110
  }
115
- elem.setAttribute("ng-src", parsedSrc ? parsedSrc.srcName : src);
116
111
  }
112
+ mode = mode ? mode.toLowerCase() : "horizonal";
117
113
 
118
114
  switch (mode) {
119
115
  case "i":
@@ -122,6 +118,7 @@ function main(elem, mode) {
122
118
  case "t":
123
119
  case "tree":
124
120
  if (elem) {
121
+ var generator = getGenerator(elem);
125
122
  tree(elem, function (index, item) {
126
123
  var e = generator(index, item);
127
124
  if (!e || e.children.length) return e;
@@ -133,12 +130,14 @@ function main(elem, mode) {
133
130
  });
134
131
  elem.renders.push(function () {
135
132
  var src = this.src;
133
+ var hasIcon = false;
136
134
  for (var cx = 0, dx = src; cx < dx; cx++) {
137
135
  if (src[cx].icon) {
136
+ hasIcon = true;
138
137
  break;
139
138
  }
140
139
  }
141
- elem.useIcon = true;
140
+ elem.useIcon = hasIcon;
142
141
  });
143
142
  } else {
144
143
  var nodes = getTreeNodes(elem);
@@ -155,9 +154,10 @@ function main(elem, mode) {
155
154
  var emit = function (item) {
156
155
  active(elem, item, item.value);
157
156
  };
158
- if (src) {
157
+ if ("$src" in elem) {
158
+ getGenerator(elem);
159
159
  care(elem, function (src) {
160
- menuList(elem, getTreeFromData(src), emit, generator, direction);
160
+ menuList(elem, getTreeFromData(src), emit, direction);
161
161
  });
162
162
  } else {
163
163
  var nodes = getArrayNodes(elem);
@@ -160,7 +160,7 @@ body:active & {
160
160
  background: #1e282c;
161
161
 
162
162
  & s:after {
163
- top: -10px;
163
+ top: -9.2px;
164
164
  }
165
165
  }
166
166
 
@@ -2,7 +2,10 @@ function main(elem, scope, hasIcon) {
2
2
  var item = elem || document.createElement('menu-item');
3
3
  item.innerHTML = menuItem;
4
4
  if (isObject(scope) && scope !== elem.$scope) {
5
- render(item, { menu: scope, useIcon: hasIcon })
5
+ render(item, { menu: scope, useIcon: hasIcon, hasIcon })
6
+ }
7
+ else {
8
+ extendIfNeeded(elem.$scope, { useIcon: false, hasIcon: false })
6
9
  }
7
10
  return item;
8
11
  }
@@ -8,7 +8,7 @@ var release = function () {
8
8
  var clear = function () {
9
9
  clearTimeout(releaseTimer);
10
10
  };
11
- function main(page, items, active, generator, direction = 'y') {
11
+ function main(page, items, active, direction = 'y') {
12
12
  if (!isNode(page)) {
13
13
  var page = div();
14
14
  }
@@ -21,7 +21,7 @@ function main(page, items, active, generator, direction = 'y') {
21
21
  if (!item.children || !item.children.length) return;
22
22
  var clone = template.cloneNode();
23
23
  clone.innerHTML = template.innerHTML;
24
- var menu = main(clone, item.children, active, generator);
24
+ var menu = main(clone, item.children, active);
25
25
  mounted_menus.push(menu);
26
26
 
27
27
  page.active = menu;
@@ -46,7 +46,7 @@ function main(page, items, active, generator, direction = 'y') {
46
46
  template.innerHTML = page.innerHTML;
47
47
  page.tempalte = template;
48
48
  }
49
- if (!generator || !page.children.length || page.menutype === 1) {
49
+ if (!page.children.length || page.menutype === 1) {
50
50
  page.innerHTML = menuList;
51
51
  page.menutype = 1;
52
52
  var hasIcon = function () {
@@ -82,6 +82,7 @@ function main(page, items, active, generator, direction = 'y') {
82
82
  this.$scope.hasIcon = hasIcon();
83
83
  });
84
84
  } else {
85
+ var generator = getGenerator(page);
85
86
  list(page, function (index) {
86
87
  var elem = generator(index);
87
88
  if (!elem) return;
@@ -38,6 +38,7 @@ var constructors = {
38
38
  input,
39
39
  raw: input,
40
40
  row: textarea,
41
+ password,
41
42
  text: textarea,
42
43
  date() {
43
44
  var elem = document.createElement("input");
package/coms/zimoli/on.js CHANGED
@@ -144,6 +144,22 @@ function checkKeyNeed(eventtypes, e) {
144
144
  }
145
145
  return true;
146
146
  }
147
+ function wrapHandler(h) {
148
+ if (h instanceof Function) {
149
+ return function () {
150
+ var res = h.apply(this, arguments);
151
+ if (res && isFunction(res.then)) {
152
+ this.setAttribute('pending', '');
153
+ var removePending = () => {
154
+ this.removeAttribute('pending');
155
+ };
156
+ res.then(removePending, removePending);
157
+ }
158
+ return res;
159
+ }
160
+ }
161
+ return h;
162
+ }
147
163
  if (is_addEventListener_enabled) {
148
164
  var on = function (k) {
149
165
  var on_event_path = "on" + k;
@@ -151,6 +167,7 @@ if (is_addEventListener_enabled) {
151
167
  var eventtypes = parseEventTypes(k);
152
168
  k = k.replace(eventtypereg, '');
153
169
  function addhandler(element, handler, firstmost) {
170
+ handler = wrapHandler(handler);
154
171
  if (eventtypes.capture) firstmost = true;
155
172
  if (k === changes_key) {
156
173
  if (!element.needchanges) element.needchanges = 0;
@@ -190,6 +207,7 @@ if (is_addEventListener_enabled) {
190
207
 
191
208
  if (handlersMap[on_event_path]) return handlersMap[on_event_path];
192
209
  function addhandler(element, handler, firstmost = false) {
210
+ handler = wrapHandler(handler);
193
211
  if (eventtypes.capture) {
194
212
  console.warn("当前运行环境不支持事件capture");
195
213
  firstmost = true;
@@ -1,6 +1,4 @@
1
1
  <a ng-repeat="o in options" ng-click="select(o)" ng-class="{activate:o===options.active}">
2
- <r>
3
- <s></s>
4
- </r>
2
+ <r><s></s></r>
5
3
  <span ng-bind=o.name||o></span>
6
4
  </a>
@@ -1,38 +1,44 @@
1
- & {
2
- vertical-align: top;
3
- }
4
-
5
1
  >a {
6
2
  line-height: inherit;
7
3
  margin-right: 10px;
8
- vertical-align: top;
9
4
 
10
5
  >r {
6
+ font-family: sans-serif;
11
7
  display: inline-block;
12
- height: 1em;
13
- width: 1em;
14
- border-radius: 50%;
15
- border: .1em solid;
16
8
  position: relative;
9
+ margin-right: .3em;
10
+ text-align: center;
17
11
  vertical-align: middle;
18
- margin-right: 4px;
12
+ width: 1em;
13
+ height: 1em;
14
+ border: .1em solid;
15
+ border-radius: 50%;
19
16
 
20
17
  >s {
21
18
  display: none;
19
+ position: absolute;
20
+ text-decoration: none;
21
+ overflow: hidden;
22
22
  border-radius: 50%;
23
- border: .2em solid;
24
23
  width: .4em;
25
24
  height: .4em;
26
- position: absolute;
27
- margin: -.2em;
28
25
  top: 50%;
29
26
  left: 50%;
27
+ margin: -.2em;
28
+
29
+ text-indent: -.5em;
30
+
31
+ &:after {
32
+ position: absolute;
33
+ left: 0;
34
+ top: 0;
35
+ display: block;
36
+ content: "";
37
+ border: .3em solid;
38
+ }
30
39
  }
31
40
  }
32
41
 
33
- >span {
34
- vertical-align: middle;
35
- }
36
42
 
37
43
  &.activate {
38
44
  >r {
@@ -55,7 +55,7 @@ var variableReg = /([^\:\,\+\=\-\!%\^\|\/\&\*\!\;\?\>\<~\{\}\s]|\?\s*\.(?=[^\d])
55
55
  var createGetter = function (search, isprop = true) {
56
56
  var [withContext, searchContext] = search;
57
57
  if (!searchContext) return function () { };
58
- var ret = /\;|(\d\.|[^\{\.\+\:\?\-\=\*\/\?\\,~!<>%\^&\}\s])\s*([\r\n\u2028\u2029])\s*(\.\d|[^\.\+\-\=\*\/\?\\,~!<>%\^&\[\}\(\?\:\s])/.test(searchContext) ? "" : "return ";
58
+ var ret = /\;/.test(searchContext) ? "" : "return ";
59
59
  if (/\?\s*\.(?=[^\d])/.test(searchContext)) {
60
60
  searchContext = searchContext.replace(variableReg, function (context) {
61
61
  var dist;
@@ -71,7 +71,7 @@ var createGetter = function (search, isprop = true) {
71
71
  });
72
72
  }
73
73
  if (isprop) {
74
- return new Function('event', `try{${withContext}with(this.$scope){${ret}${searchContext}}}catch(e){/*console.warn(String(e))*/}`);
74
+ return new Function('event', `${withContext}with(this.$scope){${ret}${searchContext}}`);
75
75
  }
76
76
  return new Function("event", `${withContext}with(this.$scope){${/([\=\(\+\-])/.test(searchContext) ? ret + searchContext : `${ret}${searchContext}.call(this.$scope,event)`}}`);
77
77
  };
@@ -144,7 +144,10 @@ var createRepeat = function (search, id = 0) {
144
144
  throw new Error("数据量过大,取消绘制!");
145
145
  }
146
146
  var $parentScopes = element.$parentScopes || [];
147
- if (element.$scope) $parentScopes = $parentScopes.concat(element.$scope);
147
+ var $struct = element.$struct;
148
+ if (element.$scope) {
149
+ $struct = Object.assign({}, $struct, { context: $struct.context + `with(this.$parentScopes[${$parentScopes.length}])` }), $parentScopes = $parentScopes.concat(element.$scope);
150
+ }
148
151
  var clonedElements1 = Object.create(null);
149
152
  var cloned = keys.map(function (key, cx) {
150
153
  var k = isArrayResult ? cx : key;
@@ -161,6 +164,7 @@ var createRepeat = function (search, id = 0) {
161
164
  };
162
165
  clone.$scope = $scope;
163
166
  clone.$parentScopes = $parentScopes;
167
+ clone.$struct = $struct;
164
168
  clone = render(clone, $scope, clone.$parentScopes);
165
169
  clonedElements1[k] = clone;
166
170
  return clone;
@@ -302,19 +306,17 @@ var parseIfWithRepeat = function (ifExpression, repeatExpression) {
302
306
 
303
307
  var createStructure = function ({ name: ifkey, key, value: ifexp } = {}, { name: forkey, value: repeat } = {}, context) {
304
308
  var element = this;
305
- if (!ifkey) return structures.repeat.call(element, [context, repeat]);
306
- if (!repeat) return structures[key].call(element, [context, ifexp]);
309
+ if (!ifkey) return element.removeAttribute(forkey), structures.repeat.call(element, [context, repeat]);
310
+ if (!repeat) return element.removeAttribute(ifkey), structures[key].call(element, [context, ifexp]);
307
311
  if (!ifexp) {
308
312
  element.removeAttribute(ifkey);
309
313
  return structures[key].call(element, [context, ifexp]);
310
314
  }
311
315
  var { before, after } = parseIfWithRepeat(ifexp, repeat);
312
- if (!after.length) {
313
- element.removeAttribute(ifkey);
314
- } else {
315
- element.setAttribute(ifkey, after.join("&&"));
316
+ element.removeAttribute(ifkey);
317
+ if (after.length) {
318
+ element.setAttribute("a-if", after.join("&&"));
316
319
  }
317
-
318
320
  if (before.length > 0) {
319
321
  // 懒渲染
320
322
  createIf.call(element, [context, before.join("&&")], null);
@@ -346,60 +348,13 @@ var structures = {
346
348
  };
347
349
  structures["else-if"] = structures.elseif = structures.else;
348
350
  structures["for-each"] = structures.foreach = structures.for = structures.each = structures.repeat;
349
- var changed = function () {
350
- if (!this.dirty) this.dirty = true, this.setAttribute('dirty', '');
351
- };
352
- var directives = {
353
- src(search) {
354
- var getter = createGetter(search).bind(this);
355
- var savedValue, savedOrigin, pending;
356
- var refresh = function () {
357
- that.src = savedValue;
358
- removeClass(that, "pending");
359
- pending = 0;
360
- };
361
- var img = document.createElement("img");
362
- var that = this;
363
- this.renders.push(function () {
364
- var origin = getter();
365
- var temp = origin;
366
- if (origin instanceof Array) {
367
- temp = extend([], origin);
368
- } else if (isObject(origin)) {
369
- temp = extend({}, origin);
370
- } else if (isEmpty(origin)) {
371
- temp = "";
372
- }
373
- var changes = getChanges(temp, savedValue);
374
- if (!changes) return;
375
- savedOrigin = origin;
376
- savedValue = temp;
377
- if (/^img$/i.test(this.tagName)) {
378
- // this.setAttribute("src", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=");
379
- if (!isString(origin)) {
380
- return;
381
- }
382
- if (origin) {
383
- img.src = origin;
384
- if (img.complete) {
385
- this.src = origin;
386
- } else if (!pending) {
387
- addClass(this, "pending");
388
- pending = setTimeout(refresh);
389
- }
390
- }
391
- } else {
392
- this.src = origin;
393
- cast(this, origin);
394
- }
395
- });
396
- },
397
- bind(search) {
351
+ var createBinder = function (binder) {
352
+ return function (search) {
398
353
  var getter = createGetter(search).bind(this);
399
354
  var oldValue;
400
355
  this.renders.push(function () {
401
356
  var value = getter();
402
- if (deepEqual(value, oldValue)) return;
357
+ if (deepEqual.shallow(value, oldValue)) return;
403
358
  oldValue = value;
404
359
  if (isNode(value) || isArray(value)) {
405
360
  if (value !== this.firstChild) {
@@ -407,9 +362,49 @@ var directives = {
407
362
  appendChild(this, value);
408
363
  }
409
364
  } else {
410
- if (text(this) !== value) text(this, value);
365
+ if (isEmpty(value)) value = '';
366
+ if (binder(this) !== value) binder(this, value);
411
367
  }
412
368
  });
369
+
370
+ }
371
+ }
372
+
373
+ var src2 = function (search) {
374
+ var getter = createGetter(search).bind(this);
375
+ var savedValue;
376
+ this.renders.push(function () {
377
+ var origin = getter();
378
+ var temp = origin;
379
+ if (origin instanceof Array) {
380
+ temp = extend([], origin);
381
+ } else if (isObject(origin)) {
382
+ temp = extend({}, origin);
383
+ } else if (isEmpty(origin)) {
384
+ temp = "";
385
+ }
386
+ var changes = getChanges(temp, savedValue);
387
+ if (!changes || isEmpty(origin) && isEmpty(this.src)) return;
388
+ savedValue = temp;
389
+ this.src = origin;
390
+ cast(this, origin);
391
+ });
392
+ }
393
+ var directives = {
394
+ bind: createBinder(text),
395
+ html: createBinder(html),
396
+ hide: createBinder(function (elem, value) {
397
+ if (arguments.length === 1) return elem.style.display === 'none';
398
+ elem.style.display = value ? 'none' : '';
399
+ }),
400
+ show: createBinder(function (elem, value) {
401
+ if (arguments.length === 1) return elem.style.display !== 'none';
402
+ elem.style.display = value ? '' : 'none';
403
+ }),
404
+ style: createBinder(css),
405
+ src([s, src]) {
406
+ var parsedSrc = this.$src;
407
+ return src2.call(this, [s, parsedSrc ? parsedSrc.srcName : src]);
413
408
  },
414
409
  model(search) {
415
410
  var getter = createGetter(search).bind(this);
@@ -462,35 +457,6 @@ var directives = {
462
457
  }
463
458
  var onchange = change;
464
459
  eventsHandlers.map(on => on(this, onchange));
465
- eventsHandlers.map(on => on(this, changed));
466
- },
467
- hide(search) {
468
- var getter = createGetter(search).bind(this);
469
- var oldValue;
470
- this.renders.push(function () {
471
- var value = !!getter();
472
- if (deepEqual(oldValue, value)) return;
473
- oldValue = value;
474
- if (value) {
475
- this.style.display = "none";
476
- } else {
477
- this.style.display = "";
478
- }
479
- });
480
- },
481
- show(search) {
482
- var getter = createGetter(search).bind(this);
483
- var oldValue;
484
- this.renders.push(function () {
485
- var value = !!getter();
486
- if (deepEqual(oldValue, value)) return;
487
- oldValue = value;
488
- if (value) {
489
- this.style.display = "";
490
- } else {
491
- this.style.display = "none";
492
- }
493
- });
494
460
  },
495
461
 
496
462
  "class"(search) {
@@ -528,17 +494,8 @@ var directives = {
528
494
  }
529
495
  });
530
496
  },
531
- style(search) {
532
- var getter = createGetter(search).bind(this);
533
- var oldValue;
534
- this.renders.push(function () {
535
- var stylesheet = getter();
536
- if (deepEqual(oldValue, stylesheet)) return;
537
- oldValue = stylesheet;
538
- css(this, stylesheet);
539
- });
540
- }
541
497
  };
498
+ directives.text = directives.bind;
542
499
  // property binder
543
500
  var binders = {
544
501
  _(attr, search) {
@@ -580,6 +537,7 @@ var emiters = {
580
537
  var res = getter.call(this, e);
581
538
  if (res && isFunction(res.then)) res.then(digest, digest);
582
539
  digest();
540
+ return res;
583
541
  });
584
542
  },
585
543
  once(key, search) {
@@ -588,6 +546,7 @@ var emiters = {
588
546
  var res = getter.call(this, e);
589
547
  if (res && isFunction(res.then)) res.then(digest, digest);
590
548
  digest();
549
+ return res;
591
550
  });
592
551
  }
593
552
  };
@@ -636,10 +595,14 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
636
595
  if (parentNode) {
637
596
  if (parentNode.renderid > 1 || parentNode.isMounted) element.renderid = 2;
638
597
  }
639
- var ons = [];
640
598
 
641
599
  if (isFirstRender) {
642
- var attrs = [].concat.apply([], element.attributes);
600
+ element.renders = element.renders ? [].concat(element.renders) : [];
601
+ var { ons, copys, attrs, props, binds, context: withContext } = element.$struct;
602
+ delete element.$struct;
603
+ if (binds.src) {
604
+ element.$src = parseRepeat(binds.src);
605
+ }
643
606
  var { tagName, parentNode, nextSibling } = element;
644
607
  // 替换元素
645
608
  var constructor = getFromScopes(tagName, scope, parentScopes);
@@ -652,13 +615,12 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
652
615
  constructor = getFromScopes(tagName, scope, parentScopes);
653
616
  }
654
617
  if (isFunction(constructor)) {
655
- var attrsMap = {};
656
618
  var replacer = constructor.call(scope, element, scope, parentScopes);
657
619
  if (isNode(replacer) && element !== replacer) {
658
620
  if (nextSibling) appendChild.before(nextSibling, replacer);
659
621
  else if (parentNode) appendChild(parentNode, replacer);
660
622
  if (element.parentNode === parentNode) remove(element);
661
- attrs.map(function (attr) {
623
+ copys.forEach(function (attr) {
662
624
  var { name, value } = attr;
663
625
  switch (name.toLowerCase()) {
664
626
  case "class":
@@ -672,62 +634,39 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
672
634
  replacer[name] = value;
673
635
  break;
674
636
  default:
675
- if (!/[\-@\:\._]/.test(name)) {
676
- replacer.setAttribute(name, value);
677
- } else {
678
- attrsMap[name] = attr;
679
- }
637
+ replacer.setAttribute(name, value);
680
638
  }
681
639
  });
682
640
  replacer.renderid = element.renderid;
641
+ replacer.renders = element.renders;
642
+ if (binds.src) replacer.$src = element.$src;
683
643
  element = replacer;
684
644
  element.$scope = scope;
685
645
  element.$parentScopes = parentScopes;
686
646
  }
687
- [].concat.apply([], element.attributes).forEach(attr => {
688
- if (attrsMap[attr.name]) {
689
- delete attrsMap[attr.name];
690
- }
691
- attrsMap[attr.name] = attr;
692
- });
693
- attrs = Object.keys(attrsMap).map(key => attrsMap[key]);
694
647
  }
695
648
  }
696
649
  if (element.children.length) renderElement(element.children, scope, parentScopes);
697
650
  if (!isFirstRender) return element;
698
- // 解析属性
699
- element.renders = element.renders ? [].concat(element.renders) : [];
700
- var withContext = parentScopes ? parentScopes.map((_, cx) => `with(this.$parentScopes[${cx}])`).join("") : '';
701
- var emiter_reg = /^(?:(v|ng|on|once)\-|v\-on\:|@|once|on)/i;
702
- attrs.map(function (attr) {
703
- var { name, value } = attr;
704
- if (/^(?:class|style|src|\:)$/i.test(name)) return;
705
- var key = name.replace(/^(ng|v|.*?)\-|^[\:\_\.]/i, "").toLowerCase();
706
- if (directives.hasOwnProperty(key) && isFunction(directives[key])) {
707
- directives[key].call(element, [withContext, value]);
708
- element.removeAttribute(name);
709
- } else if (emiter_reg.test(name)) {
710
- var match = emiter_reg.exec(name);
711
- var ngon = (match[1] || match[0]).toLowerCase() === 'once' ? 'once' : 'on';
712
- element.removeAttribute(name);
713
- ons.push([emiters[ngon], name.replace(emiter_reg, ''), value]);
714
- } else if (/^([\_\:\.]|v\-bind\:)/.test(name)) {
715
- binders._.call(element, name.replace(/^([\_\:\.]|v\-bind\:)/, ""), [withContext, value]);
716
- element.removeAttribute(name);
717
- } else if (/[_@\:\.]$/.test(name)) {
718
- binders[""].call(element, name.replace(/[_@\:\.]$/, ""), [withContext, value]);
719
- element.removeAttribute(name);
720
- } else {
721
- name = name.replace(/\-(\w)/g, (_, w) => w.toUpperCase());
722
- try {
723
- element[name] = value === '' ? true : value;
724
- } catch (e) {
725
- }
651
+ for (var k in binds) {
652
+ if (directives.hasOwnProperty(k)) {
653
+ directives[k].call(element, [withContext, binds[k]])
726
654
  }
727
- });
728
- rebuild(element);
655
+ else {
656
+ binders._.call(element, k, [withContext, binds[k]]);
657
+ }
658
+ }
659
+ for (var k in attrs) {
660
+ binders[""].call(element, k, [withContext, attrs[k]]);
661
+ }
662
+ for (var k in props) {
663
+ try {
664
+ element[k] = props[k];
665
+ } catch (e) { }
666
+ }
729
667
  ons.forEach(([on, key, value]) => on.call(element, key, [withContext, value]));
730
668
  if (element.renders.length) {
669
+ rebuild(element);
731
670
  onappend(element, addRenderElement);
732
671
  onremove(element, removeRenderElement);
733
672
  if (element.isMounted || element.renderid > 1) addRenderElement.call(element);
@@ -749,11 +688,19 @@ function renderStructure(element, scope, parentScopes = []) {
749
688
  }
750
689
  var attrs = [].concat.apply([], element.attributes);
751
690
  var withContext = parentScopes ? parentScopes.map((_, cx) => `with(this.$parentScopes[${cx}])`).join("") : '';
752
- attrs = attrs.filter(a => structures.hasOwnProperty(a.name.replace(/^(ng|V|.*?)\-/i, '').toLowerCase()));
753
691
  var types = {};
754
- if (attrs.length > 2) throw new Error(`请不要在同一元素上使用三次及以上的结构属性:${attrs.map(a => a.name)}`);
755
- attrs.map(function (attr) {
756
- var { name } = attr;
692
+ var emiter_reg = /^(?:(v|ng|on|once)\-|v\-on\:|@|once|on)/i;
693
+ var ons = [];
694
+ var copys = [];
695
+ var binds = {};
696
+ var attr1 = {};
697
+ var props = {};
698
+ for (var attr of attrs) {
699
+ var { name, value } = attr;
700
+ if (/^(?:class|style|src|\:|placeholder)$/i.test(name)) {
701
+ copys.push(attr);
702
+ continue;
703
+ }
757
704
  var key = name.replace(/^(ng|v|.*?)\-/i, "").toLowerCase();
758
705
  if (structures.hasOwnProperty(key) && isFunction(structures[key])) {
759
706
  if (element.renderid <= -2) {
@@ -776,9 +723,29 @@ function renderStructure(element, scope, parentScopes = []) {
776
723
  }
777
724
  if (!element.renderid) element.renderid = -1;
778
725
  else element.renderid = -2;
726
+ // element.removeAttribute(name);
727
+ }
728
+ if (element.$struct) continue;
729
+ var key = name.replace(/^(ng|v|.*?)\-|^[\:\_\.]|^v\-bind\:/i, "").toLowerCase();
730
+ if (directives.hasOwnProperty(key) || /^([\_\:\.]|v\-bind\:)/.test(name)) {
731
+ binds[key] = value;
779
732
  element.removeAttribute(name);
780
733
  }
781
- });
734
+ else if (emiter_reg.test(name)) {
735
+ var match = emiter_reg.exec(name);
736
+ var ngon = (match[1] || match[0]).toLowerCase() === 'once' ? 'once' : 'on';
737
+ element.removeAttribute(name);
738
+ ons.push([emiters[ngon], name.replace(emiter_reg, ''), value]);
739
+ }
740
+ else if (/[_@\:\.]$/.test(name)) {
741
+ attr1[name.replace(/[_@\:\.]$/, "")] = value;
742
+ element.removeAttribute(name);
743
+ }
744
+ else {
745
+ props[name.replace(/\-(\w)/g, (_, w) => w.toUpperCase())] = value === "" ? true : value;
746
+ }
747
+ }
748
+ if (!element.$struct) element.$struct = { ons, copys, binds, attrs: attr1, props, context: withContext };
782
749
  if (element.renderid <= -1) createStructure.call(element, types.if, types.repeat, withContext);
783
750
  }
784
751
  function render(element, scope, parentScopes) {
@@ -38,4 +38,5 @@ extend(renderDefaults, {
38
38
  swap,
39
39
  password,
40
40
  table,
41
+ form,
41
42
  });