efront 3.21.3 → 3.21.6

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.
@@ -0,0 +1,23 @@
1
+ <script serverside>
2
+ // ?charset=utf-8&out_trade_no=alipay-2021120305080870&method=alipay.trade.page.pay.return&total_amount=1.01&sign=egtaa%2BmHp4JDDJL%2FeUc0Cw3E6WIJVBJL%2BWwRo2ntz824dxHY4xK0LTLgE2Pqoq8nqgBntZfLMgHvGjEq7GII0dlbX45JSe7eucgnhvyXXdQClkQLfAD0vGDEBcHylk6LkDumMwBqR12VX%2F%2FBCOlPdXx1fxzImZRwz6N72k6lmViPgrYdD17O%2Bhkg2fsN4kvMHPreIicChEfkNGtYCXZJm8iCYn3MyT4EMh0Yy2ppoW8yLHJ%2Bp4iVtJLkGCiAhYxij1eu5BveFk9aeyhEqDmAv0UoushtB6ZE2t%2BiXPvunnvM8cWUiXIJ6NRf87OLjkDSzdhkc5VTRVgPwv3KjGhSYw%3D%3D&trade_no=2021120322001426351454501632&auth_app_id=2021002143612677&version=1.0&app_id=2021002143612677&sign_type=RSA2&seller_id=2088702544831143&timestamp=2021-12-03+10%3A31%3A57
3
+ var query = parseURL(req.url).query;
4
+ var params = await _runtask("alipay-verify", query);
5
+ var id = params.out_trade_no;
6
+
7
+ var data = await _runtask("couchdb", "get", `alipay-log/${id}`);
8
+ await _runtask("couchdb", "put", `alipay-log/${id}?_rev=${data._rev}`, extend(data, {
9
+ alipay_trade_no: params.trade_no,
10
+ seller_id: params.seller_id,
11
+ return_amount: params.total_amount,
12
+ return_time: new Date().toISOString(),
13
+ }));
14
+ context.id = params.out_trade_no;
15
+ </script>
16
+ <script>
17
+ var id =<% JSON.stringify(context.id || null) %>;
18
+ if (id) parent.postMessage(id);
19
+ </script>
20
+ <script serverside>
21
+ if(context.id)return `<body style="color:green">支付完成</body>`;
22
+ else return `<body style="color:red">支付失败</body>`
23
+ </script>
Binary file
@@ -0,0 +1,99 @@
1
+ <script serverside>
2
+ var error_codes = `ACQ.SYSTEM_ERROR 接口返回错误 请立即调用查询订单API,查询当前订单的状态,并根据订单状态决定下一步的操作
3
+ ACQ.INVALID_PARAMETER 参数无效 检查请求参数,修改后重新发起请求
4
+ ACQ.ACCESS_FORBIDDEN 无权限使用接口 联系支付宝小二签约
5
+ ACQ.EXIST_FORBIDDEN_WORD 订单信息中包含违禁词 修改订单信息后,重新发起请求
6
+ ACQ.PARTNER_ERROR 应用APP_ID填写错误 联系支付宝小二,确认APP_ID的状态
7
+ ACQ.TOTAL_FEE_EXCEED 订单总金额超过限额 修改订单金额再发起请求
8
+ ACQ.CONTEXT_INCONSISTENT 交易信息被篡改 更换商家订单号后,重新发起请求
9
+ ACQ.TRADE_HAS_SUCCESS 交易已被支付 确认该笔交易信息是否为当前买家的,如果是则认为交易付款成功,如果不是则更换商家订单号后,重新发起请求
10
+ ACQ.TRADE_HAS_CLOSE 交易已经关闭 更换商家订单号后,重新发起请求
11
+ ACQ.BUYER_SELLER_EQUAL 买卖家不能相同 更换买家重新付款
12
+ ACQ.TRADE_BUYER_NOT_MATCH 交易买家不匹配 更换商家订单号后,重新发起请求
13
+ ACQ.BUYER_ENABLE_STATUS_FORBID 买家状态非法 用户联系支付宝小二,确认买家状态为什么非法
14
+ ACQ.BUYER_PAYMENT_AMOUNT_DAY_LIMIT_ERROR 买家付款日限额超限 更换买家进行支付
15
+ ACQ.BEYOND_PAY_RESTRICTION 商户收款额度超限 联系支付宝小二提高限额
16
+ ACQ.BEYOND_PER_RECEIPT_RESTRICTION 商户收款金额超过月限额 联系支付宝小二提高限额
17
+ ACQ.BUYER_PAYMENT_AMOUNT_MONTH_LIMIT_ERROR 买家付款月额度超限 让买家更换账号后,重新付款或者更换其它付款方式
18
+ ACQ.SELLER_BEEN_BLOCKED 商家账号被冻结 联系支付宝小二,解冻账号
19
+ ACQ.ERROR_BUYER_CERTIFY_LEVEL_LIMIT 买家未通过人行认证 让用户联系支付宝小二并更换其它付款方式
20
+ ACQ.INVALID_STORE_ID 商户门店编号无效 检查传入的门店编号是否符合规则
21
+ ACQ.APPLY_PC_MERCHANT_CODE_ERROR 申请二维码失败 请确认同样的订单号不能重复多次申请二维码,如有问题请联系支付宝小二处理
22
+ ACQ.SECONDARY_MERCHANT_STATUS_ERROR 商户状态异常 请联系对应的服务商咨询
23
+ ACQ.BEYOND_PER_RECEIPT_DAY_RESTRICTION 订单金额超过当日累计限额 联系支付宝小二提高限额(联系电话:95188)
24
+ ACQ.BEYOND_PER_RECEIPT_SINGLE_RESTRICTION 订单金额超过单笔限额 联系支付宝小二提高限额(联系电话:95188)
25
+ ACQ.TRADE_SETTLE_ERROR 交易结算异常 请检查传入的结算项信息是否正确,如果正确请联系支付宝小二
26
+ ACQ.SECONDARY_MERCHANT_ID_INVALID 二级商户不存在 请检查传入的二级商户编号是否正确
27
+ ACQ.SECONDARY_MERCHANT_ISV_PUNISH_INDIRECT 商户状态异常 请联系对应的服务商咨询
28
+ ACQ.SELLER_NOT_EXIST 卖家不存在 确认卖家信息是否传递正确
29
+ ACQ.SECONDARY_MERCHANT_ALIPAY_ACCOUNT_INVALID 二级商户账户异常 确认传入的二级商户结算账户是否与进件时设置的结算账户一致,如果一致可联系支付宝小二确认是否商户的账号信息有变更
30
+ ACQ.INVALID_RECEIVE_ACCOUNT 收款账户不支持 确认seller_id信息是否传递正确,如正确请确认seller_id是否在签约中设置了收款权限
31
+ ACQ.SECONDARY_MERCHANT_ID_BLANK 二级商户编号错误 请检查是否正确传入二级商户编号
32
+ ACQ.NOW_TIME_AFTER_EXPIRE_TIME_ERROR 当前时间已超过允许支付的时间 请检查传入的支付超时时间是否正确
33
+ ACQ.SECONDARY_MERCHANT_NOT_MATCH 二级商户信息不匹配 请检查传入的二级商户编号是否正确
34
+ ACQ.BUYER_NOT_EXIST 买家不存在 确认买家账号信息传递是否正确,如果正确可联系支付宝小二,确认买家账号是否已经注销
35
+ ACQ.SUB_GOODS_SIZE_MAX_COUNT 子商品明细超长 请检查子商品明细是否超过了150条
36
+ ACQ.DEFAULT_SETTLE_RULE_NOT_EXIST 默认结算条款不存在 请确认二级商户进件是已经设置了默认结算账户
37
+ ACQ.MERCHANT_PERM_RECEIPT_SUSPEND_LIMIT 商户暂停收款 联系支付宝小二处理(联系电话:95188)
38
+ ACQ.MERCHANT_PERM_RECEIPT_SINGLE_LIMIT 超过单笔收款限额 联系支付宝小二处理(联系电话:95188)
39
+ ACQ.MERCHANT_PERM_RECEIPT_DAY_LIMIT 超过单日累计收款额度 联系支付宝小二处理(联系电话:95188)`.split(/[\r\n]+/).map(s => {
40
+ var [code, error, info] = s.split('\t');
41
+ return { code, error, info };
42
+ });
43
+ function createId() {
44
+ var d = new Date();
45
+ var id = "00000000" + String(+d % 86400000 ^ (process.pid & 0xfff) << 12 ^ process.pid >> 12);
46
+ id = id.slice(-8);
47
+ return [d.getFullYear(), d.getMonth() + 1, d.getDate(), id].map(pad).join('');
48
+ }
49
+ function pad(a) {
50
+ if (a < 10) return "0" + a;
51
+ return a;
52
+ }
53
+ var now = new Date();
54
+ function createStamp(now) {
55
+ var d = now;
56
+ return [d.getFullYear(), d.getMonth() + 1, d.getDate()].map(pad).join("-") +
57
+ " " + [d.getHours(), d.getMinutes(), d.getSeconds()].map(pad).join(":");
58
+ }
59
+ var amount = request.id;
60
+ if (!/^(\d+)(\.\d+)?$/.test(amount)) amount = encode62.timedecode(request.id);
61
+ var [amount, subject = '网页扫码支付'] = amount.split(',');
62
+ if (!+amount) return forbidden("参数异常");
63
+ var biz_content = {
64
+ out_trade_no: "alipay-" + createId(),
65
+ product_code: 'FAST_INSTANT_TRADE_PAY',
66
+ total_amount: amount,
67
+ qr_pay_mode: 4,
68
+ qrcode_width: 256,
69
+ subject: subject,
70
+ body: subject,
71
+ };
72
+ var params = {
73
+ timestamp: createStamp(now),
74
+ method: "alipay.trade.page.pay",
75
+ app_id: "2021002143612677",
76
+ sign_type: "RSA2",
77
+ version: "1.0",
78
+ charset: "utf-8",
79
+ return_url: `${req.protocol}//${req.headers[":authority"] || req.headers.host}${req.url.replace(/[\.\:][\s\S]*$/, '')}-callback`,
80
+ biz_content: JSON.stringify(biz_content)
81
+ };
82
+ await _runtask("alipay-sign", params);
83
+
84
+ var log = await _runtask("couchdb", "put", "alipay-log/" + biz_content.out_trade_no, {
85
+ _id: biz_content.out_trade_no,
86
+ total_amount: biz_content.total_amount,
87
+ qr_pay_mode: biz_content.qr_pay_mode,
88
+ qrcode_width: biz_content.qrcode_width,
89
+ subject: biz_content.subject,
90
+ body: biz_content.body,
91
+ timestamp: params.timestamp,
92
+ create_time: now.toISOString(),
93
+ return_url: biz_content.return_url
94
+ });
95
+ res.writeHead(302, {
96
+ Location: "https://openapi.alipay.com/gateway.do?" + serialize(params)
97
+ });
98
+ res.end();
99
+ </script>
@@ -0,0 +1,3 @@
1
+ <!DOCTYPE html>
2
+ <script efrontloader></script>
3
+ <body main-path="/alipay_test"></body>
@@ -0,0 +1,16 @@
1
+ var pay = frame$payment([
2
+ {
3
+ url: './alipay:',
4
+ name: '支付宝',
5
+ icon: 'alipay.ico',
6
+ cost(price) {
7
+ return BigNumber.prd((0.6036218 + 0.204081632) / 100, price);
8
+ },
9
+ }
10
+ ], 1.00, '支付宝支付测试');
11
+ popup(pay, true);
12
+ console.log(pay)
13
+ care(pay, 'payment', function (a) {
14
+ remove(pay);
15
+ document.write("支付完成:" + a);
16
+ });
@@ -46,7 +46,9 @@ var fixde = function (numstr, fractionDigits, compare) {
46
46
  }
47
47
  var res = s1 + s2;
48
48
  if (frag) {
49
+ var res_length = res.length;
49
50
  res = BigNumber.add(res, 1);
51
+ if (res.length < res_length) res = repeat0(res_length - res.length) + res;
50
52
  }
51
53
  if (fractionDigits > 0) res = res.slice(0, res.length - fractionDigits) + '.' + res.slice(res.length - fractionDigits);
52
54
  if (/^\./.test(res)) res = "0" + res;
@@ -181,4 +183,24 @@ class BigNumber {
181
183
  res = res.reverse().join('');
182
184
  return fixme(neg1 ^ neg2, res, d);
183
185
  }
186
+ static sub(numstr1, numstr2) {
187
+ numstr2 = trim(numstr2);
188
+ if (/^\-/.test(numstr2)) numstr2 = numstr2.slice(1);
189
+ else numstr2 = '-' + numstr2;
190
+ return BigNumber.add(numstr1, numstr2);
191
+ }
192
+ // 按整数除法,超出输入的数字的位数之和
193
+ static div(numstr1, numstr2, decimal) {
194
+ if (isEmpty(decimal)) throw new Error("请输入保留小数的位数!");
195
+ var [neg1, s11, s12] = prepare(numstr1);
196
+ var [neg2, s21, s22] = prepare(numstr2);
197
+ var d = s12.length - s22.length;
198
+ numstr1 = s11 + s12;
199
+ numstr2 = s21 + s22;
200
+
201
+ if (d < 0) {
202
+ numstr2 += repeat0(0, -d);
203
+ }
204
+ numstr1 += repeat0(0);
205
+ }
184
206
  }
@@ -38,6 +38,7 @@ assert(BigNumber.fix(2.235, 2), '2.24');
38
38
  assert(BigNumber.fix(2.234, 2), '2.23');
39
39
  assert(BigNumber.fix(2.2351, 2), '2.24');
40
40
  assert(BigNumber.fix(2.2349, 2), '2.23');
41
+ assert(BigNumber.fix(0.00807703432, 2), '0.01');
41
42
  assert(BigNumber.round(2.2349), '2');
42
43
  assert(BigNumber.round(2.4999), '2');
43
44
  assert(BigNumber.round(2.5000), '3');
@@ -1,10 +1,10 @@
1
1
  var paytype = data.getInstance("paytype");
2
- function main(paytypes, price) {
2
+ function main(paytypes, price, subject = '网站扫码支付') {
3
3
  var page = view();
4
4
  page.innerHTML = payment;
5
5
  renderWithDefaults(page, {
6
6
  get paytype() {
7
- return paytype.value;
7
+ return paytype.value || '0';
8
8
  },
9
9
  set paytype(value) {
10
10
  data.patchInstance("paytype", { value }, true);
@@ -21,8 +21,8 @@ function main(paytypes, price) {
21
21
  var pay = this.paytypes[this.paytype - 1];
22
22
  if (!pay) return 'about:blank';
23
23
  var url = pay.url;
24
- if (isFunction(url)) url = url.call(pay, this.finalpay);
25
- else if (url) url += this.finalpay;
24
+ if (isFunction(url)) url = url.call(pay, this.finalpay, subject);
25
+ else if (url) url += encode62.timeencode(this.finalpay + "," + subject);
26
26
  return url;
27
27
  },
28
28
  get finalpay() {
@@ -36,15 +36,10 @@ function main(paytypes, price) {
36
36
  });
37
37
  drag.on(page.firstChild, page);
38
38
  resize.on(page);
39
- data.bindInstance("paytype", function (type) {
40
- console.log(type)
41
- });
42
39
  var frame = page.querySelector("iframe");
43
- on("mounted")(frame, function () {
44
- frame.contentWindow.onmessage = function (e) {
45
- var id = e.data;
46
- cast(page, 'payment', id);
47
- };
40
+ bind("message")(frame, function (e) {
41
+ var id = e.data;
42
+ cast(page, 'payment', id);
48
43
  });
49
44
  return page;
50
45
  }
@@ -7,7 +7,7 @@ var createTemplateNodes = function (text) {
7
7
  remove(this.with);
8
8
  this.with = [].slice.call(node.childNodes, 0);
9
9
  appendChild.after(this, this.with);
10
- renderElement(this.with, this.$scope, this.$parentScopes, this.renderid === 9);
10
+ this.with = renderElement(this.with, this.$scope, this.$parentScopes, this.renderid === 9);
11
11
  };
12
12
  presets.template = function (t) {
13
13
  var comment = document.createComment('template');
@@ -23,7 +23,7 @@ presets.template = function (t) {
23
23
  }
24
24
  return comment;
25
25
  };
26
- window.renderElements = renderElements;
26
+ if (!isProduction) window.renderElements = renderElements;
27
27
  var renderidOffset = 10;
28
28
  var renderidClosed = 0;
29
29
  var addRenderElement = function () {
@@ -87,14 +87,22 @@ var createGetter = function (search, isprop = true) {
87
87
  }
88
88
  return new Function("event", `${withContext}with(this.$scope){${/([\=\(\+\-])/.test(searchContext) ? ret + searchContext : `${ret}${searchContext}.call(this.$scope,event)`}}`);
89
89
  };
90
- var initialComment = function (renders, type, expression) {
90
+ var createComment = function (renders, type, expression) {
91
91
  var comment = document.createComment(`${type} ${expression}`);
92
92
  comment.renders = renders;
93
93
  comment.$scope = this.$scope;
94
+ comment.$struct = this.$struct;
94
95
  comment.$parentScopes = this.$parentScopes;
95
- appendChild.after(this, comment);
96
- if (!/if/i.test(type)) remove(this);
97
- if (!this.$struct.once) {
96
+ if (this.parentNode) {
97
+ appendChild.after(this, comment);
98
+ if (!/^if|^else/i.test(type)) remove(this);
99
+ }
100
+ comment.template = this;
101
+ return comment;
102
+ };
103
+
104
+ var initialComment = function (comment) {
105
+ if (!comment.$struct.once) {
98
106
  comment.renderid = ++renderidOffset;
99
107
  onmounted(comment, addRenderElement);
100
108
  onremove(comment, removeRenderElement);
@@ -105,8 +113,8 @@ var initialComment = function (renders, type, expression) {
105
113
  rebuild(comment);
106
114
  remove(comment);
107
115
  }
108
- return comment;
109
116
  };
117
+
110
118
  var parseRepeat = function (expression) {
111
119
  var reg =
112
120
  // /////////////////////////////////////////// i // r ///////////////////////// o ///// a ///////////////////// t /////
@@ -141,7 +149,6 @@ var parseRepeat = function (expression) {
141
149
  var createRepeat = function (search, id = 0) {
142
150
  // 懒渲染
143
151
  // throw new Error("repeat is not supported! use list component instead");
144
-
145
152
  var [context, expression] = search;
146
153
  var res = parseRepeat(expression);
147
154
  if (!res) throw new Error(`不能识别循环表达式: ${expression} `);
@@ -206,33 +213,15 @@ var createRepeat = function (search, id = 0) {
206
213
  if (clonedElements1[k] !== clonedElements[k]) remove(clonedElements[k]);
207
214
  }
208
215
  clonedElements = clonedElements1;
216
+ this.with = cloned;
209
217
  }];
210
- if (this.parentNode) {
211
- initialComment.call(this, renders, 'repeat', expression);
212
- } else {
213
- once("append")(this, initialComment.bind(this, renders, "repeat", expression));
214
- }
215
- };
216
- var comment = function (elements) {
217
- for (var cx = elements.length - 2; cx > 1; cx -= 2) {
218
- var e = elements[cx];
219
- if (e.previousSibling === this) var c = this;
220
- else {
221
- var c = document.createComment('else' + (cx < elements.length - 2 ? "if .." : ''));
222
- e.parentNode.insertBefore(c, e);
223
- }
224
- elements.splice(cx, 0, c);
225
- remove(e);
226
- }
218
+ var comment = createComment.call(this, renders, 'repeat', expression);
219
+ initialComment(comment);
220
+ return comment;
227
221
  };
228
222
  var initIf = function (ifs) {
229
223
  for (var s of ifs) {
230
- comment(s);
231
- if (s.parent) {
232
- initialComment.call(s[0], s.renders, "if", s.comment);
233
- } else {
234
- once("append")(s[0], initialComment.bind(s[0], s.renders, "if", s.comment));
235
- }
224
+ initialComment(s[0]);
236
225
  }
237
226
  };
238
227
  var createIf = function (search, id = 0) {
@@ -246,7 +235,7 @@ var createIf = function (search, id = 0) {
246
235
  elements.comment = search[1];
247
236
  elements.renders = [function () {
248
237
  var shouldMount = -1;
249
- for (var cx = 0, dx = elements.length; cx < dx; cx += 3) {
238
+ for (var cx = 0, dx = elements.length; cx < dx; cx += 2) {
250
239
  var getter = elements[cx + 1];
251
240
  if (!getter || getter()) {
252
241
  shouldMount = cx;
@@ -255,21 +244,23 @@ var createIf = function (search, id = 0) {
255
244
  }
256
245
  if (savedValue === shouldMount) return;
257
246
  savedValue = shouldMount;
258
- for (var cx = 0, dx = elements.length; cx < dx; cx += 3) {
259
- var element = elements[cx];
247
+ for (var cx = 0, dx = elements.length; cx < dx; cx += 2) {
248
+ var c = elements[cx];
260
249
  if (cx === shouldMount) {
261
- appendChild.after(cx > 0 ? elements[cx - 1] : this, element);
262
- if (element.renderid < 0) {
263
- element.renderid = id;
264
- elements[cx] = render(element, this.$scope, this.$parentScopes);
250
+ var e = c.template;
251
+ appendChild.after(c, e);
252
+ if (e.renderid < 0) {
253
+ e.renderid = id;
254
+ c.template = render(e, this.$scope, this.$parentScopes);
265
255
  }
266
256
  }
267
257
  else {
268
- remove(element);
258
+ remove(c.template);
269
259
  }
270
260
  }
271
261
 
272
262
  }];
263
+ return elements[0] = createComment.call(element, elements.renders, 'if', elements.comment);
273
264
  };
274
265
  var parseIfWithRepeat = function (ifExpression, repeatExpression) {
275
266
  var repeater = parseRepeat(repeatExpression);
@@ -350,17 +341,17 @@ var createStructure = function ({ name: ifkey, key, value: ifexp } = {}, { name:
350
341
  }
351
342
  if (before.length > 0) {
352
343
  // 懒渲染
353
- createIf.call(element, [context, before.join("&&")], null);
344
+ return createIf.call(element, [context, before.join("&&")], null);
354
345
  } else {
355
346
  element.removeAttribute(forkey);
356
- createRepeat.call(element, [context, repeat], null);
347
+ return createRepeat.call(element, [context, repeat], null);
357
348
  }
358
349
  };
359
350
 
360
351
  var if_top = [];
361
352
  var structures = {
362
353
  "if"(search) {
363
- createIf.call(this, search);
354
+ return createIf.call(this, search);
364
355
  },
365
356
  "else"(search) {
366
357
  for (var cx = if_top.length - 1; cx >= 0; cx--) {
@@ -374,10 +365,11 @@ var structures = {
374
365
  if (search && search[1]) {
375
366
  var getter = createGetter(search).bind(this);
376
367
  }
377
- top.push(this, getter);
368
+ var comment = createComment.call(this, undefined, search[1] ? 'elseif' : 'else', search[1]);
369
+ top.push(comment, getter);
378
370
  },
379
371
  repeat(search) {
380
- createRepeat.call(this, search);
372
+ return createRepeat.call(this, search);
381
373
  },
382
374
  };
383
375
  structures["else-if"] = structures.elseif = structures.else;
@@ -629,7 +621,7 @@ function getFromScopes(key, scope, parentScopes) {
629
621
 
630
622
  function renderElement(element, scope = element.$scope, parentScopes = element.$parentScopes, once) {
631
623
  if (!isNode(element) && element.length) {
632
- return [].concat.apply([], element).map(function (element) {
624
+ return Array.prototype.slice.call(element, 0, element.length).map(function (element) {
633
625
  return renderElement(element, scope, parentScopes, once);
634
626
  });
635
627
  }
@@ -637,19 +629,20 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
637
629
  return element;
638
630
  }
639
631
  if (!isNumber(element.renderid)) {
640
- renderStructure(element, scope, parentScopes, once);
641
- }
642
- var elementid = element.getAttribute("renderid") || element.getAttribute("elementid") || element.getAttribute("id");
643
- if (elementid) {
644
- if (scope[elementid]) {
645
- if (scope[elementid] !== element) throw new Error("同一个id不能使用两次:" + elementid);
646
- } else {
647
- scope[elementid] = element;
632
+ let element1 = renderStructure(element, scope, parentScopes, once);
633
+ if (element1 !== element) {
634
+ element = element1;
648
635
  }
636
+ if (!element) return;
649
637
  }
650
- if (element.renderid < 0) {
638
+ if (element.renderid < 0 || element.nodeType !== 1) {
651
639
  return element;
652
640
  }
641
+ var elementid = element.getAttribute("renderid") || element.getAttribute("elementid") || element.getAttribute("id");
642
+ if (elementid) {
643
+ if (scope[elementid] && scope[elementid] !== element) throw new Error("同一个id不能使用两次:" + elementid);
644
+ scope[elementid] = element;
645
+ }
653
646
  var isFirstRender = !element.renderid;
654
647
 
655
648
  if (isFirstRender) {
@@ -842,7 +835,8 @@ function renderStructure(element, scope, parentScopes = [], once) {
842
835
  if (props["zimoli"] || props["fresh"] || props["once"]) once = true;
843
836
  else if (props["refresh"] || props["digest"] || props["mount"]) once = false;
844
837
  if (!element.$struct) element.$struct = { ons, copys, binds, attrs: attr1, props, context: withContext, ids, once };
845
- if (element.renderid <= -1) createStructure.call(element, types.if, types.repeat, withContext);
838
+ if (element.renderid <= -1) return createStructure.call(element, types.if, types.repeat, withContext);
839
+ return element;
846
840
  }
847
841
  var eagermount = false, renderlock = false;
848
842
  function render(element, scope, parentScopes, lazy = true) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efront",
3
- "version": "3.21.3",
3
+ "version": "3.21.6",
4
4
  "description": "一个开发工具,开放源代码,自带组件库和编译环境,可以用来开发web组件,web应用或nodejs模块,或做为已有代码的加密工具,也可以做为静态页面服务器或跨域中转服务器使用",
5
5
  "main": "public/efront.js",
6
6
  "directories": {