@xwadex/fesd 0.0.2 → 0.0.5
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/package.json +5 -11
- package/20240328-video4-setting.png +0 -0
- package/CHANGELOG.md +0 -41
- package/index.html +0 -25
- package/prepros.config +0 -883
- package/src/fesd/anchor4/anchor4.js +0 -179
- package/src/fesd/aost4/_aost4.sass +0 -64
- package/src/fesd/aost4/aost4.js +0 -138
- package/src/fesd/article4/article4.js +0 -280
- package/src/fesd/article4/article4.md +0 -1
- package/src/fesd/category-slider/_category-slider.sass +0 -33
- package/src/fesd/category-slider/category-slider.js +0 -332
- package/src/fesd/collapse4/collapse4.js +0 -159
- package/src/fesd/detect4/detect4.js +0 -70
- package/src/fesd/dropdown4/_dropdown4.sass +0 -185
- package/src/fesd/dropdown4/cityData.js +0 -830
- package/src/fesd/dropdown4/dropdown4.js +0 -647
- package/src/fesd/image-preview/_image-preview.sass +0 -26
- package/src/fesd/image-preview/image-preview.js +0 -209
- package/src/fesd/image-validate/_image-validate.sass +0 -21
- package/src/fesd/image-validate/image-validate.js +0 -84
- package/src/fesd/marquee4/_marquee4.sass +0 -45
- package/src/fesd/marquee4/marquee4.js +0 -371
- package/src/fesd/modal4/_modal4.sass +0 -134
- package/src/fesd/modal4/modal4.js +0 -236
- package/src/fesd/modal4/modernModal.js +0 -182
- package/src/fesd/multipurpose4/_multipurpose4.sass +0 -282
- package/src/fesd/multipurpose4/multipurpose4.js +0 -562
- package/src/fesd/ripple4/_ripple4.sass +0 -44
- package/src/fesd/ripple4/ripple4.js +0 -138
- package/src/fesd/share4/share4.js +0 -191
- package/src/fesd/shared/shared.js +0 -59
- package/src/fesd/shared/utils.js +0 -98
- package/src/fesd/tab4/_tab4.sass +0 -25
- package/src/fesd/tab4/tab4.js +0 -473
- package/src/fesd/video4/README.md +0 -3
- package/src/fesd/video4/_video4.sass +0 -117
- package/src/fesd/video4/video4.js +0 -237
- package/src/fesd/video4/videoPlayer.js +0 -195
- package/src/fesd.js +0 -53
- package/src/fesd.sass +0 -29
- package/src/fesdDB.js +0 -282
- package/vite.config.js +0 -37
@@ -1,332 +0,0 @@
|
|
1
|
-
// 判斷操作事件使用 mouse 或是 touch
|
2
|
-
let operateStart = 'ontouchstart' in document.documentElement ? 'touchstart' : 'mousedown';
|
3
|
-
let operateEnd = 'ontouchend' in document.documentElement ? 'touchend' : 'mouseup';
|
4
|
-
let operateMove = 'ontouchmove' in document.documentElement ? 'touchmove' : 'mousemove';
|
5
|
-
|
6
|
-
/* ---------------------------- Function 宣告 --------------------------------- */
|
7
|
-
|
8
|
-
// 獲取 translate 數值
|
9
|
-
function getTranslateValues(element) {
|
10
|
-
const style = window.getComputedStyle(element);
|
11
|
-
const matrix = style['transform'] || style.mozTransform;
|
12
|
-
|
13
|
-
// No transform property. Simply return 0 values.
|
14
|
-
if (matrix === 'none') {
|
15
|
-
return {
|
16
|
-
x: 0,
|
17
|
-
y: 0,
|
18
|
-
z: 0,
|
19
|
-
};
|
20
|
-
}
|
21
|
-
|
22
|
-
// Can either be 2d or 3d transform
|
23
|
-
const matrixType = matrix.includes('3d') ? '3d' : '2d';
|
24
|
-
const matrixValues = matrix.match(/matrix.*\((.+)\)/)[1].split(', ');
|
25
|
-
|
26
|
-
// 2d matrices have 6 values
|
27
|
-
// Last 2 values are X and Y.
|
28
|
-
// 2d matrices does not have Z value.
|
29
|
-
if (matrixType === '2d') {
|
30
|
-
return {
|
31
|
-
x: Number(matrixValues[4]),
|
32
|
-
y: Number(matrixValues[5]),
|
33
|
-
z: 0,
|
34
|
-
};
|
35
|
-
}
|
36
|
-
|
37
|
-
// 3d matrices have 16 values
|
38
|
-
// The 13th, 14th, and 15th values are X, Y, and Z
|
39
|
-
if (matrixType === '3d') {
|
40
|
-
return {
|
41
|
-
x: Number(matrixValues[12]),
|
42
|
-
y: Number(matrixValues[13]),
|
43
|
-
z: Number(matrixValues[14]),
|
44
|
-
};
|
45
|
-
}
|
46
|
-
}
|
47
|
-
|
48
|
-
// 計算輪播內容總寬度
|
49
|
-
function getSlideTotalW(element) {
|
50
|
-
const slideWrap = element.querySelector('.wrapper');
|
51
|
-
const items = slideWrap.querySelectorAll('.item');
|
52
|
-
let slideTotalWidth = 0; //輪播內容總寬度
|
53
|
-
items.forEach((item) => {
|
54
|
-
const style = getComputedStyle(item);
|
55
|
-
const marginL = parseInt(style.marginLeft);
|
56
|
-
const marginR = parseInt(style.marginRight);
|
57
|
-
slideTotalWidth += item.getBoundingClientRect().width + marginL + marginR;
|
58
|
-
});
|
59
|
-
return slideTotalWidth;
|
60
|
-
}
|
61
|
-
|
62
|
-
// 偵測目前輪播位置
|
63
|
-
function detectPos(self) {
|
64
|
-
// 拖拉在最左邊時
|
65
|
-
if (getTranslateValues(self.slideWrapEl).x >= self.translateMin) {
|
66
|
-
return 'is-start';
|
67
|
-
}
|
68
|
-
// 拖拉在最右邊時
|
69
|
-
else if (getTranslateValues(self.slideWrapEl).x <= self.translateMax) {
|
70
|
-
return 'is-end';
|
71
|
-
}
|
72
|
-
// 拖拉在中間時
|
73
|
-
else if (
|
74
|
-
getTranslateValues(self.slideWrapEl).x < self.translateMin &&
|
75
|
-
getTranslateValues(self.slideWrapEl).x > self.translateMax
|
76
|
-
) {
|
77
|
-
return 'is-middle';
|
78
|
-
}
|
79
|
-
}
|
80
|
-
|
81
|
-
// 綁定事件
|
82
|
-
function eventHandler(self) {
|
83
|
-
const element = self.el;
|
84
|
-
const slideWrap = element.querySelector('.wrapper');
|
85
|
-
//滑鼠按住或是行動裝置手指按住
|
86
|
-
slideWrap.addEventListener(operateStart, function (e) {
|
87
|
-
self.isDown = true;
|
88
|
-
if (self.slidable) slideWrap.classList.add('dragging');
|
89
|
-
switch (operateStart) {
|
90
|
-
case 'mousedown':
|
91
|
-
self.startX = e.pageX;
|
92
|
-
break;
|
93
|
-
case 'touchstart':
|
94
|
-
self.startX = e.changedTouches[0].pageX;
|
95
|
-
break;
|
96
|
-
}
|
97
|
-
self.nowTranslateX = getTranslateValues(slideWrap).x;
|
98
|
-
});
|
99
|
-
|
100
|
-
//滑鼠放開或是行動裝置手指放開
|
101
|
-
slideWrap.addEventListener(operateEnd, function (e) {
|
102
|
-
self.isDown = false;
|
103
|
-
slideWrap.classList.remove('dragging');
|
104
|
-
slideWrap.classList.remove('moving');
|
105
|
-
//移動距離
|
106
|
-
let moveDistance;
|
107
|
-
switch (operateMove) {
|
108
|
-
case 'mousemove':
|
109
|
-
moveDistance = e.pageX - self.startX;
|
110
|
-
break;
|
111
|
-
case 'touchmove':
|
112
|
-
moveDistance = e.changedTouches[0].pageX - self.startX;
|
113
|
-
break;
|
114
|
-
}
|
115
|
-
if (moveDistance === 0 && e.target.closest('.item')) {
|
116
|
-
if (operateEnd === 'mouseup' && e.button !== 0) return;
|
117
|
-
const items = slideWrap.querySelectorAll('.item');
|
118
|
-
items.forEach((item) => {
|
119
|
-
item.classList.remove('active');
|
120
|
-
});
|
121
|
-
e.target.closest('.item').classList.add('active');
|
122
|
-
self.moveActive(self.params.speed);
|
123
|
-
} else {
|
124
|
-
if (self.slidable) self.resetPos(element);
|
125
|
-
}
|
126
|
-
});
|
127
|
-
|
128
|
-
//滑鼠離開
|
129
|
-
slideWrap.addEventListener('mouseleave', function () {
|
130
|
-
if (!self.isDown) return;
|
131
|
-
if (self.slidable) {
|
132
|
-
self.isDown = false;
|
133
|
-
slideWrap.classList.remove('dragging');
|
134
|
-
slideWrap.classList.remove('moving');
|
135
|
-
self.resetPos(element);
|
136
|
-
}
|
137
|
-
});
|
138
|
-
|
139
|
-
//滑鼠移動或是行動裝置手指移動
|
140
|
-
slideWrap.addEventListener(operateMove, function (e) {
|
141
|
-
if (!self.draggable) return;
|
142
|
-
if (self.slidable) {
|
143
|
-
if (!self.isDown) return;
|
144
|
-
e.preventDefault();
|
145
|
-
//移動距離
|
146
|
-
let moveDistance;
|
147
|
-
switch (operateMove) {
|
148
|
-
case 'mousemove':
|
149
|
-
moveDistance = e.pageX - self.startX;
|
150
|
-
break;
|
151
|
-
case 'touchmove':
|
152
|
-
moveDistance = e.changedTouches[0].pageX - self.startX;
|
153
|
-
break;
|
154
|
-
}
|
155
|
-
if (moveDistance !== 0) {
|
156
|
-
slideWrap.classList.add('moving');
|
157
|
-
const styles = {
|
158
|
-
transition: 'all 0ms ease 0s',
|
159
|
-
transform: `translate3d(${self.nowTranslateX + moveDistance}px,0,0)`,
|
160
|
-
};
|
161
|
-
Object.assign(slideWrap.style, styles);
|
162
|
-
}
|
163
|
-
}
|
164
|
-
});
|
165
|
-
}
|
166
|
-
|
167
|
-
// 取消 a 的拖拉
|
168
|
-
function disableLinkDrag(element) {
|
169
|
-
const aTag = element.querySelectorAll('a');
|
170
|
-
for (var i = 0, len = aTag.length; i < len; i++) {
|
171
|
-
aTag[i].draggable = false;
|
172
|
-
}
|
173
|
-
}
|
174
|
-
|
175
|
-
export default class CategorySlider {
|
176
|
-
constructor(element, params) {
|
177
|
-
this.el = typeof element === 'string' ? document.querySelector(element) : element;
|
178
|
-
this.slideWrapEl = this.el.querySelector('.wrapper');
|
179
|
-
// default params
|
180
|
-
this.params = {
|
181
|
-
speed: 300,
|
182
|
-
clickSwitch: true,
|
183
|
-
breakpoint: false,
|
184
|
-
};
|
185
|
-
Object.assign(this.params, params);
|
186
|
-
|
187
|
-
this.draggable = true;
|
188
|
-
this.isDown = false; //按下
|
189
|
-
this.startX = 0; //按下初始位置
|
190
|
-
this.nowTranslateX = getTranslateValues(this.slideWrapEl).x; //目前X軸偏移輛
|
191
|
-
this.slideTotalWidth = getSlideTotalW(this.el);
|
192
|
-
this.translateMin = 0;
|
193
|
-
this.translateMax = -Math.floor(
|
194
|
-
Math.abs(
|
195
|
-
getSlideTotalW(this.el) - this.el.querySelector('.wrapper').getBoundingClientRect().width
|
196
|
-
)
|
197
|
-
);
|
198
|
-
this.slidable =
|
199
|
-
this.slideTotalWidth > Math.round(this.el.getBoundingClientRect().width) &&
|
200
|
-
(!this.params.breakpoint || window.innerWidth <= this.params.breakpoint);
|
201
|
-
this.init();
|
202
|
-
}
|
203
|
-
init() {
|
204
|
-
const self = this;
|
205
|
-
if (self.slidable) {
|
206
|
-
self.slideWrapEl.style.width = `${self.slideTotalWidth}px`;
|
207
|
-
self.el.classList.add('slidable');
|
208
|
-
if (self.slideWrapEl.querySelector('.item.active')) self.moveActive();
|
209
|
-
}
|
210
|
-
window.addEventListener('resize', function () {
|
211
|
-
self.update();
|
212
|
-
});
|
213
|
-
eventHandler(self);
|
214
|
-
disableLinkDrag(self.el);
|
215
|
-
}
|
216
|
-
moveActive(speed) {
|
217
|
-
const self = this;
|
218
|
-
const activeItem = self.slideWrapEl.querySelector('.item.active');
|
219
|
-
const prevItem = activeItem.previousElementSibling;
|
220
|
-
const prevOffsetLeft = prevItem
|
221
|
-
? activeItem.offsetLeft - self.el.clientWidth / 2 + activeItem.clientWidth / 2
|
222
|
-
: 0;
|
223
|
-
if (self.slidable) {
|
224
|
-
if (-prevOffsetLeft < 0 && -prevOffsetLeft > self.translateMax) {
|
225
|
-
const styles = {
|
226
|
-
transition: `all ${speed ? speed : 0}ms ease 0s`,
|
227
|
-
transform: `translate3d(-${prevOffsetLeft}px,0,0)`,
|
228
|
-
};
|
229
|
-
Object.assign(self.slideWrapEl.style, styles);
|
230
|
-
} else if (-prevOffsetLeft >= 0) {
|
231
|
-
const styles = {
|
232
|
-
transition: `all ${speed ? speed : 0}ms ease 0s`,
|
233
|
-
transform: `translate3d(0,0,0)`,
|
234
|
-
};
|
235
|
-
Object.assign(self.slideWrapEl.style, styles);
|
236
|
-
} else {
|
237
|
-
const styles = {
|
238
|
-
transition: `all ${speed ? speed : 0}ms ease 0s`,
|
239
|
-
transform: `translate3d(${self.translateMax}px,0,0)`,
|
240
|
-
};
|
241
|
-
Object.assign(self.slideWrapEl.style, styles);
|
242
|
-
}
|
243
|
-
if (speed) {
|
244
|
-
self.slideWrapEl.addEventListener(
|
245
|
-
'transitionend',
|
246
|
-
function () {
|
247
|
-
self.nowTranslateX = getTranslateValues(self.slideWrapEl).x;
|
248
|
-
switch (detectPos(self)) {
|
249
|
-
case 'is-start':
|
250
|
-
self.el.classList.add('is-start');
|
251
|
-
self.el.classList.remove('is-end');
|
252
|
-
break;
|
253
|
-
case 'is-middle':
|
254
|
-
self.el.classList.remove('is-start');
|
255
|
-
self.el.classList.remove('is-end');
|
256
|
-
break;
|
257
|
-
case 'is-end':
|
258
|
-
self.el.classList.remove('is-start');
|
259
|
-
self.el.classList.add('is-end');
|
260
|
-
break;
|
261
|
-
}
|
262
|
-
},
|
263
|
-
false
|
264
|
-
);
|
265
|
-
} else {
|
266
|
-
self.nowTranslateX = getTranslateValues(self.slideWrapEl).x;
|
267
|
-
switch (detectPos(self)) {
|
268
|
-
case 'is-start':
|
269
|
-
self.el.classList.add('is-start');
|
270
|
-
self.el.classList.remove('is-end');
|
271
|
-
break;
|
272
|
-
case 'is-middle':
|
273
|
-
self.el.classList.remove('is-start');
|
274
|
-
self.el.classList.remove('is-end');
|
275
|
-
break;
|
276
|
-
case 'is-end':
|
277
|
-
self.el.classList.remove('is-start');
|
278
|
-
self.el.classList.add('is-end');
|
279
|
-
break;
|
280
|
-
}
|
281
|
-
}
|
282
|
-
}
|
283
|
-
}
|
284
|
-
resetPos() {
|
285
|
-
const self = this;
|
286
|
-
switch (detectPos(self)) {
|
287
|
-
case 'is-start':
|
288
|
-
self.el.classList.add('is-start');
|
289
|
-
self.el.classList.remove('is-end');
|
290
|
-
Object.assign(self.slideWrapEl.style, {
|
291
|
-
transition: `all ${self.params.speed}ms ease 0s`,
|
292
|
-
transform: 'translate3d(0,0,0)',
|
293
|
-
});
|
294
|
-
break;
|
295
|
-
case 'is-middle':
|
296
|
-
self.el.classList.remove('is-start');
|
297
|
-
self.el.classList.remove('is-end');
|
298
|
-
break;
|
299
|
-
case 'is-end':
|
300
|
-
self.el.classList.remove('is-start');
|
301
|
-
self.el.classList.add('is-end');
|
302
|
-
Object.assign(self.slideWrapEl.style, {
|
303
|
-
transition: `all ${self.params.speed}ms ease 0s`,
|
304
|
-
transform: `translate3d(${self.translateMax}px,0,0)`,
|
305
|
-
});
|
306
|
-
break;
|
307
|
-
}
|
308
|
-
}
|
309
|
-
update() {
|
310
|
-
const self = this;
|
311
|
-
self.el.querySelector('.wrapper').removeAttribute('style');
|
312
|
-
self.slideTotalWidth = getSlideTotalW(self.el);
|
313
|
-
self.translateMax = -Math.floor(
|
314
|
-
Math.abs(
|
315
|
-
getSlideTotalW(self.el) - self.el.querySelector('.wrapper').getBoundingClientRect().width
|
316
|
-
)
|
317
|
-
);
|
318
|
-
self.slidable =
|
319
|
-
self.slideTotalWidth > Math.round(self.el.getBoundingClientRect().width) &&
|
320
|
-
(!self.params.breakpoint || window.innerWidth <= self.params.breakpoint);
|
321
|
-
if (self.slidable) {
|
322
|
-
self.slideWrapEl.style.width = `${self.slideTotalWidth}px`;
|
323
|
-
self.el.classList.add('slidable');
|
324
|
-
if (self.slideWrapEl.querySelector('.item.active')) self.moveActive();
|
325
|
-
} else {
|
326
|
-
self.el.classList.remove('slidable');
|
327
|
-
self.el.classList.remove('is-start');
|
328
|
-
self.el.classList.remove('is-end');
|
329
|
-
self.slideWrapEl.removeAttribute('style');
|
330
|
-
}
|
331
|
-
}
|
332
|
-
}
|
@@ -1,159 +0,0 @@
|
|
1
|
-
import SHARED from '../shared/shared';
|
2
|
-
import { isString, isElement, isNodeList, isElementExist, isFunction, getElement, getAllElements, createUid, toHTMLElement, jsonParse, warn, error } from '../shared/utils';
|
3
|
-
|
4
|
-
('use strict');
|
5
|
-
|
6
|
-
const collapseHandle = $wrapper => {
|
7
|
-
const { defaultOptions } = $wrapper.collapse;
|
8
|
-
const { collapseClass, target, transition } = defaultOptions;
|
9
|
-
|
10
|
-
const $target = $wrapper.querySelector(target);
|
11
|
-
|
12
|
-
$wrapper.classList.add(collapseClass);
|
13
|
-
|
14
|
-
$target.style.height = 0;
|
15
|
-
$target.style['transition-property'] = transition.property;
|
16
|
-
$target.style['transition-duration'] = transition.duration;
|
17
|
-
$target.style['transition-timing-function'] = transition.function;
|
18
|
-
$target.style['transition-delay'] = transition.delay;
|
19
|
-
$target.style.overflow = 'hidden';
|
20
|
-
};
|
21
|
-
|
22
|
-
const expandHandle = $wrapper => {
|
23
|
-
const { defaultOptions } = $wrapper.collapse;
|
24
|
-
const { collapseClass, target, transition } = defaultOptions;
|
25
|
-
|
26
|
-
const $target = $wrapper.querySelector(target);
|
27
|
-
const height = $target.children[0].offsetHeight;
|
28
|
-
$wrapper.collapse.height = height;
|
29
|
-
|
30
|
-
// console.log( height );
|
31
|
-
// console.log( $target.children[0].offsetHeight );
|
32
|
-
$wrapper.classList.remove(collapseClass);
|
33
|
-
|
34
|
-
$target.style.display = 'block';
|
35
|
-
$target.style.height = `${height}px`;
|
36
|
-
$target.style['transition-property'] = transition.property;
|
37
|
-
$target.style['transition-duration'] = transition.duration;
|
38
|
-
$target.style['transition-timing-function'] = transition.function;
|
39
|
-
$target.style['transition-delay'] = transition.delay;
|
40
|
-
$target.style.overflow = 'hidden';
|
41
|
-
};
|
42
|
-
|
43
|
-
class Collapse4 {
|
44
|
-
constructor(el, options = {}) {
|
45
|
-
// 可傳 string 或 element 或 nodeList
|
46
|
-
if (!isString(el) && !isElement(el) && !isNodeList(el) && !isElementExist(el)) return;
|
47
|
-
|
48
|
-
this.__storage__ = {
|
49
|
-
el,
|
50
|
-
options,
|
51
|
-
};
|
52
|
-
|
53
|
-
this.#create();
|
54
|
-
}
|
55
|
-
|
56
|
-
#create() {
|
57
|
-
const { el, options } = this.__storage__;
|
58
|
-
const { SETTINGS, EVENTS } = fesdDB.collapse4;
|
59
|
-
|
60
|
-
this.elements = getAllElements(el);
|
61
|
-
this.options = Object.assign({}, SETTINGS, options);
|
62
|
-
this.__events__ = Object.assign({}, EVENTS);
|
63
|
-
|
64
|
-
if (this.options.on) {
|
65
|
-
for (const [k, v] of Object.entries(this.options.on)) {
|
66
|
-
this.__events__[k] = [v];
|
67
|
-
}
|
68
|
-
}
|
69
|
-
|
70
|
-
this.#init();
|
71
|
-
}
|
72
|
-
|
73
|
-
#init() {
|
74
|
-
const { elements, options } = this;
|
75
|
-
|
76
|
-
elements.forEach(el => {
|
77
|
-
el.collapse = {};
|
78
|
-
el.collapse.instance = this;
|
79
|
-
el.collapse.defaultOptions = options;
|
80
|
-
|
81
|
-
this.#trigger(el);
|
82
|
-
});
|
83
|
-
|
84
|
-
this.emit('init');
|
85
|
-
}
|
86
|
-
|
87
|
-
#trigger(el) {
|
88
|
-
const { options } = this;
|
89
|
-
const { collapseClass, block, target, defaultOpen, targetStopPropagation, defaultActiveMark } = options;
|
90
|
-
|
91
|
-
// collapse-wrapper
|
92
|
-
// collapse-block
|
93
|
-
// collapse-target
|
94
|
-
|
95
|
-
const $wrapper = el;
|
96
|
-
const $target = $wrapper.querySelector(target);
|
97
|
-
$wrapper.collapse.height = $target.children[0].offsetHeight;
|
98
|
-
|
99
|
-
// const $block = $wrapper.querySelector(block);
|
100
|
-
|
101
|
-
// 是否預設全打開
|
102
|
-
if (defaultOpen) {
|
103
|
-
$target.style.height = `${$target.children[0].offsetHeight}px`;
|
104
|
-
$wrapper.classList.remove(collapseClass);
|
105
|
-
} else {
|
106
|
-
if (!$wrapper.classList.contains(defaultActiveMark) && !$wrapper.hasAttribute(defaultActiveMark)) {
|
107
|
-
$wrapper.classList.add(collapseClass);
|
108
|
-
$target.style.height = '0px';
|
109
|
-
$target.style.overflow = 'hidden';
|
110
|
-
} else {
|
111
|
-
$target.style.height = `${$target.children[0].offsetHeight}px`;
|
112
|
-
$wrapper.classList.remove(collapseClass);
|
113
|
-
}
|
114
|
-
}
|
115
|
-
|
116
|
-
// update() 避免重複綁定
|
117
|
-
$wrapper.removeEventListener('click', this.#event);
|
118
|
-
$wrapper.addEventListener('click', this.#event);
|
119
|
-
|
120
|
-
// target 點擊不收合
|
121
|
-
if (targetStopPropagation) {
|
122
|
-
const event = e => {
|
123
|
-
e.stopPropagation();
|
124
|
-
};
|
125
|
-
// update() 避免重複綁定
|
126
|
-
$target.removeEventListener('click', event);
|
127
|
-
$target.addEventListener('click', event);
|
128
|
-
}
|
129
|
-
}
|
130
|
-
|
131
|
-
#event() {
|
132
|
-
const { instance, defaultOptions } = this.collapse;
|
133
|
-
const { collapseClass, block, target, single } = defaultOptions;
|
134
|
-
|
135
|
-
const $wrapper = this;
|
136
|
-
|
137
|
-
if ($wrapper.classList.contains(collapseClass)) {
|
138
|
-
if (single) {
|
139
|
-
$wrapper.parentNode.querySelectorAll(`.${$wrapper.classList[0]}`).forEach(el => {
|
140
|
-
collapseHandle(el);
|
141
|
-
});
|
142
|
-
}
|
143
|
-
|
144
|
-
expandHandle($wrapper);
|
145
|
-
} else {
|
146
|
-
collapseHandle($wrapper);
|
147
|
-
}
|
148
|
-
|
149
|
-
instance.emit('afterCollapse');
|
150
|
-
}
|
151
|
-
|
152
|
-
update() {
|
153
|
-
this.#create();
|
154
|
-
}
|
155
|
-
}
|
156
|
-
|
157
|
-
Object.assign(Collapse4.prototype, SHARED);
|
158
|
-
|
159
|
-
export default Collapse4;
|
@@ -1,70 +0,0 @@
|
|
1
|
-
const Detect4 = {};
|
2
|
-
Detect4.init = function () {
|
3
|
-
const userAgent = navigator.userAgent;
|
4
|
-
|
5
|
-
// isBrowser4
|
6
|
-
fesdDB.library.browser = {
|
7
|
-
// Firefox 1.0+
|
8
|
-
isFirefox: typeof InstallTrigger !== 'undefined',
|
9
|
-
// Opera 8.0+
|
10
|
-
isOpera: (!!window.opr && !!opr.addons) || !!window.opera || userAgent.indexOf(' OPR/') >= 0,
|
11
|
-
// Internet Explorer 6-11
|
12
|
-
isIE: /*@cc_on!@*/ false || !!document.documentMode,
|
13
|
-
// Edge 20+
|
14
|
-
isEdge: !(false || !!document.documentMode) && !!window.StyleMedia,
|
15
|
-
// Edge (based on chromium) detection
|
16
|
-
isEdgeChromium: /\sedg\//i.test(userAgent) || /edg([ea]|ios)/i.test(userAgent),
|
17
|
-
// Safari 3.0+ "[object HTMLElementConstructor]"
|
18
|
-
isSafari: !/chrome|crios|crmo/i.test(userAgent) && /safari/i.test(userAgent),
|
19
|
-
// Chrome 1 - 79
|
20
|
-
isChrome: (!!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime)) || /chrome|crios|crmo/i.test(userAgent),
|
21
|
-
};
|
22
|
-
|
23
|
-
// isMobile4
|
24
|
-
fesdDB.library.mobile = {
|
25
|
-
// Android
|
26
|
-
isAndroid: userAgent.indexOf('Android') > -1 || userAgent.indexOf('Adr') > -1,
|
27
|
-
// iOS | ipad
|
28
|
-
isiOS: userAgent.indexOf('Mac') > -1 && 'ontouchend' in document,
|
29
|
-
};
|
30
|
-
|
31
|
-
// isOs4
|
32
|
-
fesdDB.library.os = {
|
33
|
-
// window
|
34
|
-
isWindows: userAgent.indexOf('Win') > -1,
|
35
|
-
// macos
|
36
|
-
isMacOS: userAgent.indexOf('Mac') > -1,
|
37
|
-
// UNIX
|
38
|
-
isUNIX: userAgent.indexOf('X11') > -1,
|
39
|
-
// Linux
|
40
|
-
isLinux: userAgent.indexOf('Linux') > -1,
|
41
|
-
};
|
42
|
-
|
43
|
-
// **eric - 以下待優化
|
44
|
-
const isBrowser4 = () => {
|
45
|
-
const { browser } = fesdDB.library;
|
46
|
-
return Object.keys(browser).find(key => {
|
47
|
-
if (browser[key]) return browser[key];
|
48
|
-
});
|
49
|
-
};
|
50
|
-
|
51
|
-
const isMobile4 = () => {
|
52
|
-
const { mobile } = fesdDB.library;
|
53
|
-
return Object.keys(mobile).some(key => {
|
54
|
-
if (mobile[key]) return mobile[key];
|
55
|
-
});
|
56
|
-
};
|
57
|
-
|
58
|
-
const isOs4 = () => {
|
59
|
-
const { os } = fesdDB.library;
|
60
|
-
return Object.keys(os).find(key => {
|
61
|
-
if (os[key]) return os[key];
|
62
|
-
});
|
63
|
-
};
|
64
|
-
|
65
|
-
fesdDB.is.isBrowser4 = isBrowser4();
|
66
|
-
fesdDB.is.isMobile4 = isMobile4();
|
67
|
-
fesdDB.is.isOs4 = isOs4();
|
68
|
-
};
|
69
|
-
|
70
|
-
export default Detect4;
|