@joyzl/eno 1.2.0 → 1.2.2
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.
- package/README.md +4 -543
- package/dist/joyzl-eno.js +1 -1
- package/index.js +63 -8
- package/package.json +2 -2
package/README.md
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# eno
|
2
|
-
|
2
|
+
简单易用,性能卓越,自由灵活的WEB前端组件
|
3
|
+
主要用于 JSON 与 HTML 操作交互的 JavaScript 方法库。
|
3
4
|
|
4
|
-
[joyzl eno](http://eno.joyzl.
|
5
|
+
[joyzl eno](http://eno.joyzl.net)
|
5
6
|
|
6
7
|
## 安装
|
7
8
|
``` cmd
|
@@ -13,544 +14,4 @@ import eno from '@joyzl/eno';
|
|
13
14
|
```
|
14
15
|
|
15
16
|
## 使用
|
16
|
-
|
17
|
-
### eno.sets()
|
18
|
-
|
19
|
-
eno.sets() 将数据对象(通常为JSON实例)设置到HTML标签显示。
|
20
|
-
|
21
|
-
参数形式:
|
22
|
-
* eno.sets(element, parameter);
|
23
|
-
* eno.sets(selector, parameter);
|
24
|
-
* eno.sets(element, selector, parameter);
|
25
|
-
* eno.sets(element, parameter, converter);
|
26
|
-
* eno.sets(element, selector, parameter, converter);
|
27
|
-
|
28
|
-
参数含义:
|
29
|
-
* element 元素实例/元素查找范围;
|
30
|
-
* selector 选择器字符串;
|
31
|
-
* parameter 数据对象/数据对象数组;
|
32
|
-
* converter 转换函数 function(element, parameter, name){};
|
33
|
-
|
34
|
-
转换函数参数含义:
|
35
|
-
* element 元素实例;
|
36
|
-
* parameter 对象实例;
|
37
|
-
* name 情形值;
|
38
|
-
|
39
|
-
#### 单个对象设置到HTML显示
|
40
|
-
|
41
|
-
将单个数据对象(例如从服务器获取的JSON对象)设置到HTML元素以显示数据。
|
42
|
-
|
43
|
-
首先建立HTML标签元素如下所示:
|
44
|
-
```html
|
45
|
-
<div id="user">
|
46
|
-
<span name="realname"></span>
|
47
|
-
<span name="birthday"></span>
|
48
|
-
</div>
|
49
|
-
```
|
50
|
-
|
51
|
-
将数据对象设置到HTML标签元素。
|
52
|
-
```javascript
|
53
|
-
let user = {
|
54
|
-
realname: "小明",
|
55
|
-
birthday: "1992-5-27"
|
56
|
-
};
|
57
|
-
let div = document.getElementById("user");
|
58
|
-
eno.sets(div, user);
|
59
|
-
```
|
60
|
-
|
61
|
-
数据对象的字段值将根据HTML标签元素指定的name属性插入到标签中。
|
62
|
-
```html
|
63
|
-
<div id="user">
|
64
|
-
<span name="realname">小明</span>
|
65
|
-
<span name="birthday">1992-5-27</span>
|
66
|
-
</div>
|
67
|
-
```
|
68
|
-
|
69
|
-
#### 多个对象设置到HTML显示
|
70
|
-
|
71
|
-
将多个数据对象(例如从服务器获取的JSON对象数组)设置到HTML元素以显示数据;
|
72
|
-
此时eno将自动克隆创建对应数量的HTML元素以对应多项数据。
|
73
|
-
|
74
|
-
首先建立HTML标签元素如下所示:
|
75
|
-
```html
|
76
|
-
<div id="users">
|
77
|
-
<div>
|
78
|
-
<span name="realname"></span>
|
79
|
-
<span name="birthday"></span>
|
80
|
-
</div>
|
81
|
-
</div>
|
82
|
-
```
|
83
|
-
|
84
|
-
将数据对象设置到HTML标签元素。
|
85
|
-
```javascript
|
86
|
-
let users = [{
|
87
|
-
realname: "小明",
|
88
|
-
birthday: "1992-5-27"
|
89
|
-
},
|
90
|
-
{
|
91
|
-
realname: "小王",
|
92
|
-
birthday: "1993-8-16"
|
93
|
-
}
|
94
|
-
];
|
95
|
-
eno.sets("#users", users);
|
96
|
-
```
|
97
|
-
|
98
|
-
数据对象的字段值将根据HTML标签元素指定的name属性插入到标签中;
|
99
|
-
此时eno将 "#users" DIV 的子元素作为模板,自动克隆以显示多项数据。
|
100
|
-
```html
|
101
|
-
<div id="users">
|
102
|
-
<div>
|
103
|
-
<span name="realname">小明</span>
|
104
|
-
<span name="birthday">1992-5-27</span>
|
105
|
-
</div>
|
106
|
-
<div>
|
107
|
-
<span name="realname">小王</span>
|
108
|
-
<span name="birthday">1993-8-16</span>
|
109
|
-
</div>
|
110
|
-
</div>
|
111
|
-
```
|
112
|
-
|
113
|
-
在相同元素实例多次执行eno.sets方法时,eno将自动维护对应的数量的子元素,以保持正确的显示;
|
114
|
-
如果传入的对象数组为[]或null这将清除所有子元素,eno会通过隐藏以保留原始模板。
|
115
|
-
|
116
|
-
#### 多个对象设置到HTML显示并指定模板
|
117
|
-
|
118
|
-
通过模板<template>显示多个对象到HTML中具有更好的灵活性,eno将保留模板标签之外的HTML。
|
119
|
-
```html
|
120
|
-
<div id="users">
|
121
|
-
<div>
|
122
|
-
<span>用户列表</span>
|
123
|
-
</div>
|
124
|
-
<template>
|
125
|
-
<div>
|
126
|
-
<span name="realname"></span>
|
127
|
-
<span name="birthday"></span>
|
128
|
-
</div>
|
129
|
-
</template>
|
130
|
-
</div>
|
131
|
-
```
|
132
|
-
|
133
|
-
执行eno.sets("#users",users)将得到如下HTML实例:
|
134
|
-
```html
|
135
|
-
<div id="users">
|
136
|
-
<div>
|
137
|
-
<span>用户列表</span>
|
138
|
-
</div>
|
139
|
-
<template>
|
140
|
-
<div>
|
141
|
-
<span name="realname"></span>
|
142
|
-
<span name="birthday"></span>
|
143
|
-
</div>
|
144
|
-
</template>
|
145
|
-
<div>
|
146
|
-
<span name="realname">小明</span>
|
147
|
-
<span name="birthday">1992-5-27</span>
|
148
|
-
</div>
|
149
|
-
<div>
|
150
|
-
<span name="realname">小王</span>
|
151
|
-
<span name="birthday">1993-8-16</span>
|
152
|
-
</div>
|
153
|
-
</div>
|
154
|
-
```
|
155
|
-
eno根据"#users"中的<template>创建对应数量的HTML元素显示数据,
|
156
|
-
并保留其它HTML标签(也保留<template>本身,因为此标签不会被显示)。
|
157
|
-
|
158
|
-
#### 在HTML指示对象字段
|
159
|
-
|
160
|
-
将对象通过HTML显示时,eno通过标签的"name"属性值确定对象字段(区分大小写);
|
161
|
-
属性值支持点语法分隔多级字段,例如:"department.name";
|
162
|
-
|
163
|
-
eno确定对象字段后将根据标签类型执行默认的值设置:
|
164
|
-
* input标签设置为value属性值;
|
165
|
-
* img标签设置为src属性值;
|
166
|
-
* 其它标签设置为内部文本(innerText);
|
167
|
-
|
168
|
-
```html
|
169
|
-
<div id="users">
|
170
|
-
<template>
|
171
|
-
<div>
|
172
|
-
<img name="avatar"/>
|
173
|
-
<span name="realname"></span>
|
174
|
-
<span name="birthday"></span>
|
175
|
-
<span name="department.name"></span>
|
176
|
-
</div>
|
177
|
-
</template>
|
178
|
-
</div>
|
179
|
-
```
|
180
|
-
```javascript
|
181
|
-
let users = [{
|
182
|
-
realname: "小明",
|
183
|
-
birthday: "1992-5-27",
|
184
|
-
avatar: "okjniybu.png",
|
185
|
-
department: {
|
186
|
-
name: "A部"
|
187
|
-
}
|
188
|
-
},
|
189
|
-
{
|
190
|
-
realname: "小王",
|
191
|
-
birthday: "1993-8-16",
|
192
|
-
avatar: "likjudde.png",
|
193
|
-
department: {
|
194
|
-
name: "B部"
|
195
|
-
}
|
196
|
-
}
|
197
|
-
];
|
198
|
-
eno.sets("#users", users);
|
199
|
-
```
|
200
|
-
|
201
|
-
#### 自定义对象字段与HTML显示方式
|
202
|
-
|
203
|
-
如果默认行为无法满足显示需求,例如根据状态字段更改颜色,
|
204
|
-
可通过"case"属性值和自定义转换函数执行特殊处理;
|
205
|
-
```html
|
206
|
-
<div id="users">
|
207
|
-
<template>
|
208
|
-
<div>
|
209
|
-
<img case="url"/>
|
210
|
-
<span name="realname"></span>
|
211
|
-
<span name="birthday"></span>
|
212
|
-
<span name="department.name"></span>
|
213
|
-
</div>
|
214
|
-
</template>
|
215
|
-
</div>
|
216
|
-
```
|
217
|
-
转换函数将在遇到的每一个"case"属性时触发,并传入三个参数
|
218
|
-
分别为element表示"case"所在的元素实例,
|
219
|
-
parameter表示当前数据对象,
|
220
|
-
name指示"case"的值;
|
221
|
-
```javascript
|
222
|
-
let users = [...];
|
223
|
-
eno.sets("#users", users, function(element, parameter, name){
|
224
|
-
if(name=="url"){
|
225
|
-
element.src = "http://joyzl.net/" + parameter.avatar;
|
226
|
-
}
|
227
|
-
});
|
228
|
-
```
|
229
|
-
通过转换函数可以执行任何需要的自定义处理;
|
230
|
-
但须注意的是,每个模板实例中的多个"case"都将调用转换函数,
|
231
|
-
如果同时指定"name"属性,将在调用转换函数后执行默认行为。
|
232
|
-
|
233
|
-
### eno.gets()
|
234
|
-
|
235
|
-
从HTML元素获取用户数据以形成JSON对象实例。
|
236
|
-
与eno.sets方法的行为正好相反,将从HTML中具有"name"属性的标签提取数据。
|
237
|
-
|
238
|
-
参数形式:
|
239
|
-
* eno.gets(element);
|
240
|
-
* eno.gets(selector);
|
241
|
-
* eno.gets(element, converter);
|
242
|
-
* eno.gets(selector, converter);
|
243
|
-
* eno.gets(element, selector, converter);
|
244
|
-
|
245
|
-
参数含义:
|
246
|
-
* element 元素实例;
|
247
|
-
* selector 选择器字符串;
|
248
|
-
* converter 转换函数 function(element, parameter, name){};
|
249
|
-
|
250
|
-
转换函数参数含义:
|
251
|
-
* element 元素实例;
|
252
|
-
* parameter 对象实例;
|
253
|
-
* name 情形值;
|
254
|
-
|
255
|
-
#### 从HTML中提取数据
|
256
|
-
|
257
|
-
假设有以下HTML实例:
|
258
|
-
```html
|
259
|
-
<div id="user">
|
260
|
-
<span name="realname">小明</span>
|
261
|
-
<span name="birthday">1992-5-27</span>
|
262
|
-
</div>
|
263
|
-
```
|
264
|
-
|
265
|
-
执行gets方法获取数据对象:
|
266
|
-
```javascript
|
267
|
-
let values = eno.gets(element);
|
268
|
-
// values 实例字段如下
|
269
|
-
// {
|
270
|
-
// realname: "小明",
|
271
|
-
// birthday: "1992-5-27"
|
272
|
-
// }
|
273
|
-
```
|
274
|
-
eno.gets将普通标签获取内部普通文本内容(innetText)。
|
275
|
-
|
276
|
-
#### 从表单中提取数据
|
277
|
-
|
278
|
-
获取表单输入值,gets将识别传入参数是否表单。
|
279
|
-
```html
|
280
|
-
<form>
|
281
|
-
<input type="text" name="user" value="小张"/>
|
282
|
-
<input type="text" name="birthday" value="1982-10-30"/>
|
283
|
-
</form>
|
284
|
-
```
|
285
|
-
|
286
|
-
执行gets方法获取form数据对象:
|
287
|
-
```javascript
|
288
|
-
let values = eno.gets(element);
|
289
|
-
// values 实例字段如下
|
290
|
-
// {
|
291
|
-
// realname: "小张",
|
292
|
-
// birthday: "1982-10-30"
|
293
|
-
// }
|
294
|
-
```
|
295
|
-
eno.gets将表单标签获取控件值内容(control.value)。
|
296
|
-
|
297
|
-
#### 自定义数据提取方式
|
298
|
-
|
299
|
-
与eno.sets方法相同,eno.gets也支持同样参数的数据转换函数用于自定义提取方式。
|
300
|
-
```javascript
|
301
|
-
let values = eno.gets(element, function(element, parameter, name){
|
302
|
-
if(name=="url"){
|
303
|
-
parameter.avatar = element.src.replace("http://joyzl.net/","");
|
304
|
-
}
|
305
|
-
});
|
306
|
-
// values 实例字段如下
|
307
|
-
// {
|
308
|
-
// realname: "小张",
|
309
|
-
// birthday: "1982-10-30",
|
310
|
-
// avatar: "okjniybu.png"
|
311
|
-
// }
|
312
|
-
```
|
313
|
-
|
314
|
-
### eno.create()
|
315
|
-
|
316
|
-
eno.create() 用于将字符串形式的HTML标签创建为HTML实例。
|
317
|
-
|
318
|
-
参数形式:
|
319
|
-
* eno.create(html);
|
320
|
-
|
321
|
-
参数含义:
|
322
|
-
* html 字符串;
|
323
|
-
|
324
|
-
```javascript
|
325
|
-
let element = eno.create("<div><a href='http://www.joyzl.com'>joyzl</a></div>");
|
326
|
-
```
|
327
|
-
|
328
|
-
注意:此时创建的标签实例未插入文档中,因此不会在浏览器网页呈现。
|
329
|
-
|
330
|
-
### eno.append()
|
331
|
-
|
332
|
-
eno.append() 用于将字符串形式的HTML标签创建为HTML实例,并插入文档指定的位置尾部。
|
333
|
-
|
334
|
-
参数形式:
|
335
|
-
* eno.append(element, html);
|
336
|
-
* eno.append(selector, html);
|
337
|
-
|
338
|
-
参数含义:
|
339
|
-
* element 元素实例;
|
340
|
-
* selector 选择器字符串;
|
341
|
-
* html 字符串;
|
342
|
-
|
343
|
-
```javascript
|
344
|
-
// 添加到<body>中尾部
|
345
|
-
let element1 = eno.append("<div><a href='http://www.joyzl.com'>joyzl</a></div>");
|
346
|
-
|
347
|
-
// 添加到指定元素中尾部
|
348
|
-
let parent = document.getElementById("main");
|
349
|
-
let element2 = eno.append(parent, "<div><a href='http://www.joyzl.com'>joyzl</a></div>");
|
350
|
-
```
|
351
|
-
|
352
|
-
### eno.replace()
|
353
|
-
|
354
|
-
eno.replace() 用于将字符串形式的HTML标签创建为HTML实例,并替换指定的元素。
|
355
|
-
|
356
|
-
参数形式:
|
357
|
-
* eno.replace(element, html);
|
358
|
-
* eno.replace(selector, html);
|
359
|
-
|
360
|
-
参数含义:
|
361
|
-
* element 元素实例;
|
362
|
-
* selector 选择器字符串;
|
363
|
-
* html 字符串;
|
364
|
-
|
365
|
-
```javascript
|
366
|
-
let element = document.getElementById("customer-define");
|
367
|
-
element = eno.replace(element, "<div><a href='http://www.joyzl.com'>joyzl</a></div>");
|
368
|
-
```
|
369
|
-
|
370
|
-
### eno.select()
|
371
|
-
|
372
|
-
eno.select() 用于在文档或指定范围查找元素。
|
373
|
-
|
374
|
-
参数形式:
|
375
|
-
* eno.select(selector);
|
376
|
-
* eno.select(element, selector);
|
377
|
-
|
378
|
-
参数含义:
|
379
|
-
* element 元素实例;
|
380
|
-
* selector 选择器字符串;
|
381
|
-
|
382
|
-
```javascript
|
383
|
-
// 在整个文档中查找
|
384
|
-
let element = eno.select("#id");
|
385
|
-
|
386
|
-
// 在指定元素中查找
|
387
|
-
element = eno.select(element, "div");
|
388
|
-
```
|
389
|
-
|
390
|
-
支持标准的CSS选择器字符串,如果匹配多个元素将以数组返回结果集,仅匹配单个时仅返回匹配的元素实例。
|
391
|
-
|
392
|
-
### eno.remove()
|
393
|
-
|
394
|
-
eno.remove() 用于移除文档中的指定元素。
|
395
|
-
|
396
|
-
参数形式:
|
397
|
-
* eno.remove(element);
|
398
|
-
* eno.remove(selector);
|
399
|
-
* eno.remove(element, selector);
|
400
|
-
|
401
|
-
参数含义:
|
402
|
-
* element 元素实例;
|
403
|
-
* selector 选择器字符串;
|
404
|
-
|
405
|
-
### eno.hide()
|
406
|
-
|
407
|
-
eno.hide() 用于隐藏元素。
|
408
|
-
|
409
|
-
参数形式:
|
410
|
-
* eno.hide(element);
|
411
|
-
* eno.hide(selector);
|
412
|
-
* eno.hide(element, selector);
|
413
|
-
|
414
|
-
参数含义:
|
415
|
-
* element 元素实例;
|
416
|
-
* selector 选择器字符串;
|
417
|
-
|
418
|
-
### eno.show()
|
419
|
-
|
420
|
-
eno.show() 用于显示元素。
|
421
|
-
|
422
|
-
参数形式:
|
423
|
-
* eno.show(element);
|
424
|
-
* eno.show(selector);
|
425
|
-
* eno.show(element, selector);
|
426
|
-
|
427
|
-
参数含义:
|
428
|
-
* element 元素实例;
|
429
|
-
* selector 选择器字符串;
|
430
|
-
|
431
|
-
### eno.toggle()
|
432
|
-
|
433
|
-
eno.toggle() 用于切换元素显示或样式类。
|
434
|
-
调用此方法仅指定元素或选择器参数,指定或匹配的元素将显示,其余同级元素全部隐藏;
|
435
|
-
如果指定了样式类参数(applyClass, otherClass),则匹配的元素将应用applyClass,其余同级元素应用otherClass样式类。
|
436
|
-
|
437
|
-
参数形式:
|
438
|
-
* eno.toggle(element);
|
439
|
-
* eno.toggle(selector);
|
440
|
-
* eno.toggle(element, selector);
|
441
|
-
* eno.toggle(element, applyClass, otherClass);
|
442
|
-
* eno.toggle(element, selector, applyClass, otherClass);
|
443
|
-
|
444
|
-
参数含义:
|
445
|
-
* element 元素实例;
|
446
|
-
* selector 选择器字符串;
|
447
|
-
* applyClass 当前元素应用的样式类;
|
448
|
-
* otherClass 其它元素应用的样式类;
|
449
|
-
|
450
|
-
此功能可用于层叠卡片显示切换或选中项高亮。
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
### eno.bind()
|
455
|
-
|
456
|
-
eno.bind() 用于绑定元素的事件。
|
457
|
-
|
458
|
-
参数形式:
|
459
|
-
* eno.bind(element, eventName, listener);
|
460
|
-
* eno.bind(selector, eventName, listener);
|
461
|
-
* eno.bind(element, selector, eventName, listener);
|
462
|
-
|
463
|
-
参数含义:
|
464
|
-
* element 元素实例;
|
465
|
-
* selector 选择器字符串;
|
466
|
-
* eventName 事件名称 "click"、"submit" ...;
|
467
|
-
* listener 事件处理函数 function(event){};
|
468
|
-
|
469
|
-
处理函数参数含义:
|
470
|
-
* this 元素实例;
|
471
|
-
* event 事件实例;
|
472
|
-
|
473
|
-
此方法的事件绑定与DOM API并无任何差异,其行为与Element.addEventListener()完全相同。
|
474
|
-
|
475
|
-
#### eno.sets()的事件处理
|
476
|
-
|
477
|
-
对于通过eno.sets()方法生成并填充值的元素,如果要监听每个元素的事件,
|
478
|
-
可通过eno.bind()配合eno.entity()和eno.element()方法优化事件处理,而无须为每个子元素绑定事件;
|
479
|
-
|
480
|
-
具体方法如下:
|
481
|
-
+ 容器绑定所需事件;
|
482
|
-
+ 在处理函数中通过eno.element()获取目标元素实例;
|
483
|
-
+ 在处理函数中通过eno.entity()获取目标对象实例;
|
484
|
-
|
485
|
-
示例代码:
|
486
|
-
```javascript
|
487
|
-
const element = eno.append(`
|
488
|
-
<div id="users">
|
489
|
-
<div>
|
490
|
-
<span>用户列表</span>
|
491
|
-
</div>
|
492
|
-
<template>
|
493
|
-
<div>
|
494
|
-
<span name="realname"></span>
|
495
|
-
<span name="birthday"></span>
|
496
|
-
</div>
|
497
|
-
</template>
|
498
|
-
</div>
|
499
|
-
`);
|
500
|
-
eno.bind(element,"click",function(event){
|
501
|
-
// 获取数据对象实例
|
502
|
-
eno.entity(event)
|
503
|
-
|
504
|
-
// 获取元素对象实例
|
505
|
-
eno.element(event);
|
506
|
-
});
|
507
|
-
eno.sets(element,data);
|
508
|
-
```
|
509
|
-
|
510
|
-
### eno.entity()
|
511
|
-
|
512
|
-
eno.entity() 用于获取通过eno.sets()方法填充元素的数据对象。
|
513
|
-
|
514
|
-
参数形式:
|
515
|
-
* eno.entity(event);
|
516
|
-
* eno.entity(element);
|
517
|
-
* eno.entity(element, selector);
|
518
|
-
|
519
|
-
参数含义:
|
520
|
-
* event 事件实例;
|
521
|
-
* element 元素实例;
|
522
|
-
* selector 选择器字符串;
|
523
|
-
|
524
|
-
### eno.element()
|
525
|
-
|
526
|
-
eno.element() 用于获取通过eno.sets()方法填充元素的实例。
|
527
|
-
|
528
|
-
参数形式:
|
529
|
-
* eno.element(event);
|
530
|
-
|
531
|
-
参数含义:
|
532
|
-
* event 事件实例;
|
533
|
-
|
534
|
-
### eno.query()
|
535
|
-
|
536
|
-
eno.query() 用于获取指定URL或当前URL中的查询字符串参数。
|
537
|
-
|
538
|
-
参数形式:
|
539
|
-
* eno.query();
|
540
|
-
* eno.query(url);
|
541
|
-
* eno.query(name);
|
542
|
-
* eno.query(url, name);
|
543
|
-
|
544
|
-
参数含义:
|
545
|
-
* url 字符串,如果未指定则默认当前页面URL;
|
546
|
-
* name 参数名字符串,区分大小写;
|
547
|
-
|
548
|
-
|
549
|
-
```javascript
|
550
|
-
// 从当前URL获取参数
|
551
|
-
let token = eno.query("token");
|
552
|
-
|
553
|
-
// 从指定URL获取参数
|
554
|
-
let url = "http://www.joyzl.net/test?name=value";
|
555
|
-
let value = eno.query(url, "name");
|
556
|
-
```
|
17
|
+
参考在线手册 [joyzl eno doc](http://eno.joyzl.net/document.html)
|
package/dist/joyzl-eno.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.eno=t():e.eno=t()}(self,(()=>(()=>{"use strict";var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{default:()=>n});const n={create:l,append:function(e,t,n){if(1==arguments.length)n=l(e),e=document.body;else if(2==arguments.length)e=i(e),n=l(t);else{if(3!=arguments.length)return null;e=i(e,t),n=l(n)}return e&&n?(e.appendChild(r.content),n):null},replace:function(e,t,n){if(2==arguments.length)e=i(e),n=l(t);else{if(3!=arguments.length)return null;e=i(e,t),n=l(n)}if(e&&n){if(Array.isArray(n))for(let t=0;t<n.length;t++)n[t].classList.add(e.classList),e.style.cssText&&(n[t].style.cssText+=e.style.cssText);else n.classList.add(e.classList),e.style.cssText&&(n.style.cssText+=e.style.cssText);return e.replaceWith(r.content),n}return null},selects:f,select:i,remove:function(e,t){if(1==arguments.length)e=f(e);else{if(2!=arguments.length)return;e=f(e,t)}if(e&&e.length)for(let t=0;t<e.length;t++)e[t].remove()},show:function(e,t){if(1==arguments.length)e=f(e);else{if(2!=arguments.length)return;e=f(e,t)}if(e&&e.length)for(let t=0;t<e.length;t++)
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.eno=t():e.eno=t()}(self,(()=>(()=>{"use strict";var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{default:()=>n});const n={create:l,append:function(e,t,n){if(1==arguments.length)n=l(e),e=document.body;else if(2==arguments.length)e=i(e),n=l(t);else{if(3!=arguments.length)return null;e=i(e,t),n=l(n)}return e&&n?(e.appendChild(r.content),n):null},replace:function(e,t,n){if(2==arguments.length)e=i(e),n=l(t);else{if(3!=arguments.length)return null;e=i(e,t),n=l(n)}if(e&&n){if(Array.isArray(n))for(let t=0;t<n.length;t++)n[t].classList.add(e.classList),e.style.cssText&&(n[t].style.cssText+=e.style.cssText);else n.classList.add(e.classList),e.style.cssText&&(n.style.cssText+=e.style.cssText);return e.replaceWith(r.content),n}return null},selects:f,select:i,remove:function(e,t){if(1==arguments.length)e=f(e);else{if(2!=arguments.length)return;e=f(e,t)}if(e&&e.length)for(let t=0;t<e.length;t++)e[t].remove()},show:function(e,t){if(1==arguments.length)e=f(e);else{if(2!=arguments.length)return;e=f(e,t)}if(e&&e.length)for(let t=0;t<e.length;t++)o(e[t])},hide:function(e,t){if(1==arguments.length)e=f(e);else{if(2!=arguments.length)return;e=f(e,t)}if(e&&e.length)for(let t=0;t<e.length;t++)u(e[t])},toggle:function(e,t,n,r){if(1==arguments.length){if(e=f(e))return c(e),e}else if(2==arguments.length){if(e=f(e,t))return c(e),e}else if(3==arguments.length){if(e=f(e))return s(e,t,n),e}else if(4==arguments.length&&(e=f(e,t)))return s(e,n,r),e;return null},get:function(e,t,n=h){if(1==arguments.length)e=i(e);else if(2==arguments.length)t instanceof Function?(e=i(e),n=t):e=i(e,t);else{if(3!=arguments.length)return null;e=i(e,t)}if(e){let t={};return a(e,t,n),t}return null},gets:function(e,t,n=h){if(1==arguments.length)e=f(e);else if(2==arguments.length)t instanceof Function?(e=f(e),n=t):e=f(e,t);else{if(3!=arguments.length)return null;e=f(e,t)}if(e){let t,r=new Array;for(let l=0;l<e.length;l++)t={},a(e[l],t,n),r.push(t);return r}return null},set:function(e,t,n,r=h){if(2==arguments.length)e=i(e),n=t;else if(3==arguments.length)n instanceof Function?(e=i(e),r=n,n=t):e=i(e,t);else{if(4!=arguments.length)return null;e=i(e,t)}if(e)return Array.isArray(n)&&(n=n[0]),_(e,n,r),e.__ENO_ENTITY=n,e},sets:function(e,t,n,r=h){if(2==arguments.length)e=i(e),n=t;else if(3==arguments.length)n instanceof Function?(e=i(e),r=n,n=t):e=i(e,t);else{if(4!=arguments.length)return null;e=i(e,t)}if(e){let t=0;if(void 0===e.__ENO_SETS){if(!e.childElementCount)return null;for(e.__ENO_SETS={},t=0;t<e.childElementCount;t++)if(e.children[t].content){e.__ENO_SETS.fragment=e.children[t].content,e.__ENO_SETS.before=++t,e.__ENO_SETS.after=e.childElementCount-t;break}if(void 0===e.__ENO_SETS.fragment){for(e.__ENO_SETS.fragment=new DocumentFragment;e.childElementCount>0;)e.__ENO_SETS.fragment.appendChild(e.children[0]);e.__ENO_SETS.before=0,e.__ENO_SETS.after=0}}if(n){let l,i;for(Array.isArray(n)||(n=[n]),t=0;t<n.length;t++)if(e.__ENO_SETS.before+t<e.childElementCount-e.__ENO_SETS.after)for(i=0;i<e.__ENO_SETS.fragment.childElementCount;i++)l=e.children[e.__ENO_SETS.before+t+i],_(l,n[t],r),l.__ENO_ENTITY=n[t];else{for(l=e.__ENO_SETS.fragment.cloneNode(!0),i=0;i<l.childElementCount;i++)_(l.children[i],n[t],r),l.children[i].__ENO_ENTITY=n[t];e.insertBefore(l,e.children[e.__ENO_SETS.before+t*l.childElementCount])}for(i=t*e.__ENO_SETS.fragment.childElementCount,t=e.__ENO_SETS.before+e.__ENO_SETS.after;e.childElementCount>t+i;)e.children[e.__ENO_SETS.before+i].remove()}else for(t=e.__ENO_SETS.before+e.__ENO_SETS.after;e.childElementCount>t;)e.children[e.childElementCount-e.__ENO_SETS.after-1].remove();return e}},bind:function(e,t,n,r){if(3==arguments.length)e=f(e),r=n,n=t;else{if(4!=arguments.length)return null;e=f(e,t)}if(e&&e.length){for(let t=0;t<e.length;t++)e[t].addEventListener(n,r);return e}return null},entity:function(e,t){if(1==arguments.length)e=e.target?e.target:e.srcElement?e.srcElement:i(e);else{if(2!=arguments.length)return null;e=i(e,t)}for(;e;){if(e.__ENO_ENTITY)return e.__ENO_ENTITY;e=e.parentElement}return null},element:function(e){if(e)for(e=e.target?e.target:e.srcElement?e.srcElement:i(e);e;){if(e.userData)return e;e=e.parentElement}return null},target:function(e,t,n){if(1==arguments.length)return e.target||e.srcElement;if(2==arguments.length){let n=e.target||e.srcElement;for(;n&&n!==e.currentTarget;){if(n.hasAttribute(t))return n;n=n.parentElement}}else if(3==arguments.length){let r=e.target||e.srcElement;for(;r&&r!==e.currentTarget;){if(r.getAttribute(t)==n)return r;r=r.parentElement}}return null},query:function(e,t){if(0==arguments.length)e=window.location.search;else if(1==arguments.length)if(e.startsWith("http://")||e.startsWith("https://")){let t=e.indexOf("?");if(!(t>0))return null;e=e.substring(t)}else t=e,e=window.location.search;else{if(2!=arguments.length)return null;{let t=e.indexOf("?");if(!(t>0))return null;e=e.substring(t)}}if(e){if(!t){let t,n=1,r=1,l={};for(;r>=0&&r<e.length&&(n=e.indexOf("=",r),n>=0);){if(t=e.substring(n,r),n=++r,r=e.indexOf("&",r),!(r>=0)){l[t]=e.substring(n);break}l[t]=e.substring(n,r),n=++r}return l}{let n=e.indexOf(t);if(n>=0&&(n+=t.length,"="==e.charAt(n))){n++;let t=e.indexOf("&",n);return t>=0?e.substring(n,t):e.substring(n)}}}return null}},r=document.createElement("template");function l(e){if(e)if(e.trim){if(r.innerHTML=e,1==r.content.childElementCount)return r.content.firstElementChild;if(r.content.childElementCount>1)return Array.from(r.content.children)}else{if(e.tagName)return r.innerHTML="",r.appendChild(e),e;if(e instanceof DocumentFragment)return r.innerHTML="",r.appendChild(e),Array.from(r.content.children)}return null}function i(e,t){if(1==arguments.length){if(e.tagName)return e;if(e.trim)return document.querySelector(e);if(e.length)return e[0]}else if(2==arguments.length){if(e.tagName)return e.querySelector(t);if(e.trim&&(e=document.querySelector(e)))return e.querySelector(t)}return null}function f(e,t){if(1==arguments.length){if(e.tagName)return[e];if(e.trim){if((e=document.querySelectorAll(e)).length>0)return Array.from(e)}else if(e.length)return Array.from(e)}else if(2==arguments.length)if(e.tagName){if((e=e.querySelectorAll(t)).length>0)return Array.from(e)}else if(e.trim&&(e=document.querySelector(e))&&(e=e.querySelectorAll(t)).length>0)return Array.from(e);return null}function u(e){if(e.hidden){if(void 0!==e.__ENO_DISPLAY)return}else e.hidden=!0;e.__ENO_DISPLAY=e.style.display,e.style.display="none"}function o(e){e.hidden&&(e.hidden=!1,void 0!==e.__ENO_DISPLAY&&(e.style.display=e.__ENO_DISPLAY))}function c(e){let t,n,r;for(let l=0;l<e.length;l++){if(t=e[l],t.parentElement!==n)for(n=t.parentElement,r=0;r<n.children.length;r++)t!==n.children[r]&&u(n.children[r]);o(t)}}function s(e,t,n){let r,l,i;for(let f=0;f<e.length;f++){if(r=e[f],r.parentElement!==l)for(l=r.parentElement,i=0;i<l.children.length;i++)r!==l.children[i]&&(l.children[i].classList.remove(t),l.children[i].classList.add(n));r.classList.remove(n),r.classList.add(t)}}function h(e,t,n){}function a(e,t,n){let r=e.getAttribute("case");if(r&&r.length&&n(e,t,r),r=e.getAttribute("name"),r&&r.length&&(e.type?e.disabled||("number"===e.type||"range"===e.type?isNaN(e.valueAsNumber)||d(t,r,e.valueAsNumber):"checkbox"===e.type||"radio"===e.type?e.checked&&d(t,r,e.value):e.value&&d(t,r,e.value)):e.src?d(t,r,e.src):d(t,r,e.innerText)),e.childElementCount)for(let r=0;r<e.children.length;r++)a(e.children[r],t,n)}function _(e,t,n){let r=e.getAttribute("case");if(r&&r.length&&n(e,t,r),r=e.getAttribute("name"),r&&r.length&&(e.type?"checkbox"===e.type||"radio"===e.type?e.checked=e.value==g(t,r):e.value=E(g(t,r)):void 0!==e.src?(void 0===e.__ENO_SRC&&(e.__ENO_SRC=e.src),e.src=E(g(t,r)),0==e.src.length&&(e.src=e.__ENO_SRC)):(void 0===e.__ENO_TEXT&&(e.__ENO_TEXT=e.innerText,e.__ENO_TITLE=!e.title),e.innerText=E(g(t,r)),0==e.innerText.length&&(e.innerText=e.__ENO_TEXT),e.__ENO_TITLE&&(e.title=e.innerText))),e.childElementCount)for(let r=0;r<e.children.length;r++)_(e.children[r],t,n)}function g(e,t){t=t.split(".");for(let n=0;n<t.length&&e;n++)if(Array.isArray(e)){const r=new Array;for(let l=0;l<e.length;l++)e[l]&&r.push(e[l][t[n]]);e=r}else e=e[t[n]];return e}function d(e,t,n){t=t.split(".");let r=0;for(;r<t.length-1;r++)e=e[t[r]]?e[t[r]]:e[t[r]]={};void 0===e[t=t[r]]?e[t]=n:Array.isArray(e[t])?e[t].push(n):e[t]=[e[t],n]}function E(e){return Array.isArray(e)?e.join(","):null!=e?e.toString():""}return t})()));
|
package/index.js
CHANGED
@@ -20,8 +20,8 @@ export default {
|
|
20
20
|
|
21
21
|
bind,
|
22
22
|
entity,
|
23
|
-
action,
|
24
23
|
element,
|
24
|
+
target,
|
25
25
|
|
26
26
|
query
|
27
27
|
}
|
@@ -89,6 +89,7 @@ function append(element, selector, html) {
|
|
89
89
|
if (arguments.length == 2) {
|
90
90
|
// append(element,selector); 无效
|
91
91
|
// append(element,html);
|
92
|
+
// append(selector,html);
|
92
93
|
element = select(element);
|
93
94
|
html = create(selector);
|
94
95
|
} else
|
@@ -119,6 +120,7 @@ function append(element, selector, html) {
|
|
119
120
|
function replace(element, selector, html) {
|
120
121
|
if (arguments.length == 2) {
|
121
122
|
// replace(element,html);
|
123
|
+
// replace(selector,html);
|
122
124
|
element = select(element);
|
123
125
|
html = create(selector);
|
124
126
|
} else
|
@@ -165,6 +167,7 @@ function select(element, selector) {
|
|
165
167
|
if (arguments.length == 1) {
|
166
168
|
// 仅指定1个参数
|
167
169
|
// select(element);
|
170
|
+
// select(selector);
|
168
171
|
if (element.tagName) {
|
169
172
|
return element;
|
170
173
|
} else
|
@@ -366,7 +369,7 @@ function toggle(element, selector, applyClass, otherClass) {
|
|
366
369
|
// toggle(element,applyClass,otherClass)
|
367
370
|
element = selects(element);
|
368
371
|
if (element) {
|
369
|
-
|
372
|
+
toggleClasses(element, selector, applyClass);
|
370
373
|
return element;
|
371
374
|
}
|
372
375
|
} else
|
@@ -497,7 +500,7 @@ function gets(element, selector, converter = defaultConverter) {
|
|
497
500
|
// gets(element,selector)
|
498
501
|
// gets(element,converter)
|
499
502
|
if (selector instanceof Function) {
|
500
|
-
element =
|
503
|
+
element = selects(element);
|
501
504
|
converter = selector;
|
502
505
|
} else {
|
503
506
|
element = selects(element, selector);
|
@@ -560,6 +563,10 @@ function set(element, selector, entity, converter = defaultConverter) {
|
|
560
563
|
|
561
564
|
if (element) {
|
562
565
|
// Object -> Element
|
566
|
+
if (Array.isArray(entity)) {
|
567
|
+
entity = entity[0];
|
568
|
+
}
|
569
|
+
|
563
570
|
setEntity(element, entity, converter);
|
564
571
|
element.__ENO_ENTITY = entity;
|
565
572
|
return element;
|
@@ -655,7 +662,7 @@ function sets(element, selector, entity, converter = defaultConverter) {
|
|
655
662
|
}
|
656
663
|
} else {
|
657
664
|
// 克隆新的元素(DocumentFragment)
|
658
|
-
node = element.fragment.cloneNode(true);
|
665
|
+
node = element.__ENO_SETS.fragment.cloneNode(true);
|
659
666
|
for (n = 0; n < node.childElementCount; n++) {
|
660
667
|
setEntity(node.children[n], entity[i], converter);
|
661
668
|
node.children[n].__ENO_ENTITY = entity[i];
|
@@ -664,7 +671,7 @@ function sets(element, selector, entity, converter = defaultConverter) {
|
|
664
671
|
}
|
665
672
|
}
|
666
673
|
// 移除多余元素
|
667
|
-
n = i * element.__ENO_SETS.
|
674
|
+
n = i * element.__ENO_SETS.fragment.childElementCount;
|
668
675
|
i = element.__ENO_SETS.before + element.__ENO_SETS.after;
|
669
676
|
while (element.childElementCount > i + n) {
|
670
677
|
element.children[element.__ENO_SETS.before + n].remove();
|
@@ -696,9 +703,22 @@ function getEntity(element, entity, converter) {
|
|
696
703
|
if (name && name.length) {
|
697
704
|
if (element.type) {
|
698
705
|
// 所有控件具有type属性
|
706
|
+
// 所有控件具有disabled属性
|
707
|
+
// <select> <textarea> 没有checked属性,其余均有
|
699
708
|
if (!element.disabled) {
|
700
|
-
if (element.
|
701
|
-
|
709
|
+
if (element.type === "number" || element.type === "range") {
|
710
|
+
if (!isNaN(element.valueAsNumber)) {
|
711
|
+
setValue(entity, name, element.valueAsNumber);
|
712
|
+
}
|
713
|
+
} else
|
714
|
+
if (element.type === "checkbox" || element.type === "radio") {
|
715
|
+
if (element.checked) {
|
716
|
+
setValue(entity, name, element.value);
|
717
|
+
}
|
718
|
+
} else {
|
719
|
+
if (element.value) {
|
720
|
+
setValue(entity, name, element.value);
|
721
|
+
}
|
702
722
|
}
|
703
723
|
}
|
704
724
|
} else
|
@@ -732,7 +752,7 @@ function setEntity(element, entity, converter) {
|
|
732
752
|
if (name && name.length) {
|
733
753
|
if (element.type) {
|
734
754
|
// 所有控件具有type属性
|
735
|
-
if (element.
|
755
|
+
if (element.type === "checkbox" || element.type === "radio") {
|
736
756
|
// Radio / Check
|
737
757
|
element.checked = element.value == getValue(entity, name);
|
738
758
|
} else {
|
@@ -861,6 +881,7 @@ function text(value) {
|
|
861
881
|
function bind(element, selector, eventName, listener) {
|
862
882
|
if (arguments.length == 3) {
|
863
883
|
// bind(element,eventName,listener);
|
884
|
+
// bind(selector,eventName,listener);
|
864
885
|
element = selects(element);
|
865
886
|
listener = eventName;
|
866
887
|
eventName = selector;
|
@@ -946,6 +967,40 @@ function element(e) {
|
|
946
967
|
return null;
|
947
968
|
}
|
948
969
|
|
970
|
+
/**
|
971
|
+
* 获取具有指定属性的事件目标
|
972
|
+
* @param {Event} event
|
973
|
+
* @param {String} name
|
974
|
+
* @param {String} value
|
975
|
+
*/
|
976
|
+
function target(event, name, value) {
|
977
|
+
if (arguments.length == 1) {
|
978
|
+
// target(event);
|
979
|
+
return event.target || event.srcElement;
|
980
|
+
} else
|
981
|
+
if (arguments.length == 2) {
|
982
|
+
// target(event, name);
|
983
|
+
let element = event.target || event.srcElement;
|
984
|
+
while (element && element !== event.currentTarget) {
|
985
|
+
if (element.hasAttribute(name)) {
|
986
|
+
return element;
|
987
|
+
}
|
988
|
+
element = element.parentElement;
|
989
|
+
}
|
990
|
+
} else
|
991
|
+
if (arguments.length == 3) {
|
992
|
+
// target(event, name, value);
|
993
|
+
let element = event.target || event.srcElement;
|
994
|
+
while (element && element !== event.currentTarget) {
|
995
|
+
if (element.getAttribute(name) == value) {
|
996
|
+
return element;
|
997
|
+
}
|
998
|
+
element = element.parentElement;
|
999
|
+
}
|
1000
|
+
}
|
1001
|
+
return null;
|
1002
|
+
}
|
1003
|
+
|
949
1004
|
/**
|
950
1005
|
* 获取 URL 中的 Query String 指定名称的参数值或包含所有参数的实体对象
|
951
1006
|
* @param {String} url URL
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@joyzl/eno",
|
3
|
-
"version": "1.2.
|
3
|
+
"version": "1.2.2",
|
4
4
|
"description": "Easy Node Object",
|
5
5
|
"main": "dist/joyzl-eno.js",
|
6
6
|
"module": "index.js",
|
@@ -24,7 +24,7 @@
|
|
24
24
|
"bugs": {
|
25
25
|
"url": "https://github.com/JoyLinks/eno/issues"
|
26
26
|
},
|
27
|
-
"homepage": "
|
27
|
+
"homepage": "http://eno.joyzl.net",
|
28
28
|
"devDependencies": {
|
29
29
|
"webpack": "^5.91.0",
|
30
30
|
"webpack-cli": "^5.1.4"
|