@mpxjs/webpack-plugin 2.8.39 → 2.8.40-test
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/lib/dependencies/CommonJsExtractDependency.js +51 -0
- package/lib/dependencies/ResolveDependency.js +11 -9
- package/lib/extractor.js +1 -0
- package/lib/helpers.js +9 -1
- package/lib/index.js +173 -72
- package/lib/json-compiler/helper.js +25 -9
- package/lib/json-compiler/index.js +77 -28
- package/lib/loader.js +3 -10
- package/lib/native-loader.js +21 -14
- package/lib/platform/json/wx/index.js +65 -2
- package/lib/platform/run-rules.js +2 -1
- package/lib/platform/template/normalize-component-rules.js +2 -0
- package/lib/platform/template/wx/component-config/README.md +1 -1
- package/lib/platform/template/wx/component-config/fix-html-tag.js +17 -0
- package/lib/platform/template/wx/component-config/hypen-tag-name.js +2 -6
- package/lib/platform/template/wx/component-config/index.js +4 -2
- package/lib/platform/template/wx/component-config/view.js +0 -11
- package/lib/platform/template/wx/index.js +65 -18
- package/lib/runtime/base.styl +0 -5
- package/lib/runtime/components/web/filterTag.js +9 -30
- package/lib/runtime/components/web/getInnerListeners.js +2 -14
- package/lib/runtime/components/web/mpx-keep-alive.vue +10 -17
- package/lib/runtime/components/web/mpx-movable-view.vue +105 -23
- package/lib/runtime/components/web/mpx-picker-view.vue +1 -1
- package/lib/runtime/components/web/mpx-scroll-view.vue +69 -23
- package/lib/runtime/components/web/mpx-swiper.vue +152 -62
- package/lib/runtime/components/web/mpx-video.vue +123 -89
- package/lib/runtime/components/web/mpx-web-view.vue +120 -81
- package/lib/runtime/components/web/promisify.js +19 -0
- package/lib/runtime/components/wx/default-page.mpx +27 -0
- package/lib/runtime/optionProcessor.js +12 -18
- package/lib/style-compiler/index.js +5 -1
- package/lib/template-compiler/bind-this.js +280 -49
- package/lib/template-compiler/compiler.js +54 -58
- package/lib/template-compiler/index.js +35 -23
- package/lib/utils/dom-tag-config.js +115 -0
- package/lib/utils/make-map.js +12 -0
- package/lib/utils/string.js +7 -1
- package/lib/utils/ts-loader-watch-run-loader-filter.js +4 -5
- package/lib/web/processJSON.js +35 -0
- package/lib/web/processScript.js +7 -4
- package/lib/web/processTemplate.js +7 -34
- package/package.json +4 -4
- package/lib/partial-compile/index.js +0 -35
- package/lib/template-compiler/preprocessor.js +0 -29
- package/lib/wxss/compile-exports.js +0 -52
- package/lib/wxss/createResolver.js +0 -36
- package/lib/wxss/css-base.js +0 -79
- package/lib/wxss/getLocalIdent.js +0 -25
- package/lib/wxss/localsLoader.js +0 -44
- package/lib/wxss/processCss.js +0 -274
|
@@ -190,17 +190,10 @@ module.exports = function getSpec ({ warn, error }) {
|
|
|
190
190
|
}
|
|
191
191
|
const styleBinding = []
|
|
192
192
|
el.isStyleParsed = true
|
|
193
|
-
|
|
193
|
+
// 不过滤的话每一个属性都要 parse
|
|
194
|
+
el.attrsList.filter(item => this.test.test(item.name)).forEach((item) => {
|
|
194
195
|
const parsed = parseMustache(item.value)
|
|
195
|
-
|
|
196
|
-
if (parsed.hasBinding || parsed.result.indexOf('rpx') > -1) {
|
|
197
|
-
styleBinding.push(parseMustache(item.value).result)
|
|
198
|
-
} else {
|
|
199
|
-
styleBinding.push(JSON.stringify(item.value))
|
|
200
|
-
}
|
|
201
|
-
} else if (item.name === 'wx:style') {
|
|
202
|
-
styleBinding.push(parseMustache(item.value).result)
|
|
203
|
-
}
|
|
196
|
+
styleBinding.push(parsed.result)
|
|
204
197
|
})
|
|
205
198
|
return {
|
|
206
199
|
name: ':style',
|
|
@@ -295,18 +288,39 @@ module.exports = function getSpec ({ warn, error }) {
|
|
|
295
288
|
},
|
|
296
289
|
swan ({ name, value }, { eventRules }) {
|
|
297
290
|
const match = this.test.exec(name)
|
|
291
|
+
const prefix = match[1]
|
|
298
292
|
const eventName = match[2]
|
|
299
|
-
|
|
293
|
+
const modifierStr = match[3] || ''
|
|
294
|
+
const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'swan' })
|
|
295
|
+
const rEventName = runRules(eventRules, eventName, { mode: 'swan' })
|
|
296
|
+
return {
|
|
297
|
+
name: rPrefix + rEventName + modifierStr,
|
|
298
|
+
value
|
|
299
|
+
}
|
|
300
300
|
},
|
|
301
301
|
qq ({ name, value }, { eventRules }) {
|
|
302
302
|
const match = this.test.exec(name)
|
|
303
|
+
const prefix = match[1]
|
|
303
304
|
const eventName = match[2]
|
|
304
|
-
|
|
305
|
+
const modifierStr = match[3] || ''
|
|
306
|
+
const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'qq' })
|
|
307
|
+
const rEventName = runRules(eventRules, eventName, { mode: 'qq' })
|
|
308
|
+
return {
|
|
309
|
+
name: rPrefix + rEventName + modifierStr,
|
|
310
|
+
value
|
|
311
|
+
}
|
|
305
312
|
},
|
|
306
313
|
jd ({ name, value }, { eventRules }) {
|
|
307
314
|
const match = this.test.exec(name)
|
|
315
|
+
const prefix = match[1]
|
|
308
316
|
const eventName = match[2]
|
|
309
|
-
|
|
317
|
+
const modifierStr = match[3] || ''
|
|
318
|
+
const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'jd' })
|
|
319
|
+
const rEventName = runRules(eventRules, eventName, { mode: 'jd' })
|
|
320
|
+
return {
|
|
321
|
+
name: rPrefix + rEventName + modifierStr,
|
|
322
|
+
value
|
|
323
|
+
}
|
|
310
324
|
},
|
|
311
325
|
// tt ({ name, value }, { eventRules }) {
|
|
312
326
|
// const match = this.test.exec(name)
|
|
@@ -322,15 +336,33 @@ module.exports = function getSpec ({ warn, error }) {
|
|
|
322
336
|
// },
|
|
323
337
|
tt ({ name, value }, { eventRules }) {
|
|
324
338
|
const match = this.test.exec(name)
|
|
339
|
+
const prefix = match[1]
|
|
325
340
|
const eventName = match[2]
|
|
326
|
-
|
|
341
|
+
const modifierStr = match[3] || ''
|
|
342
|
+
const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'tt' })
|
|
343
|
+
const rEventName = runRules(eventRules, eventName, { mode: 'tt' })
|
|
344
|
+
return {
|
|
345
|
+
name: rPrefix + rEventName + modifierStr,
|
|
346
|
+
value
|
|
347
|
+
}
|
|
327
348
|
},
|
|
328
349
|
dd ({ name, value }, { eventRules }) {
|
|
329
350
|
const match = this.test.exec(name)
|
|
351
|
+
const prefix = match[1]
|
|
330
352
|
const eventName = match[2]
|
|
331
|
-
|
|
353
|
+
const modifierStr = match[3] || ''
|
|
354
|
+
const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'dd' })
|
|
355
|
+
const rEventName = runRules(eventRules, eventName, { mode: 'dd' })
|
|
356
|
+
return {
|
|
357
|
+
name: rPrefix + rEventName + modifierStr,
|
|
358
|
+
value
|
|
359
|
+
}
|
|
332
360
|
},
|
|
333
|
-
web ({ name, value }, { eventRules, el }) {
|
|
361
|
+
web ({ name, value }, { eventRules, el, usingComponents }) {
|
|
362
|
+
if (parseMustache(value).hasBinding) {
|
|
363
|
+
error('Web environment does not support mustache binding in event props!')
|
|
364
|
+
return
|
|
365
|
+
}
|
|
334
366
|
const match = this.test.exec(name)
|
|
335
367
|
const prefix = match[1]
|
|
336
368
|
const eventName = match[2]
|
|
@@ -338,10 +370,11 @@ module.exports = function getSpec ({ warn, error }) {
|
|
|
338
370
|
const meta = {
|
|
339
371
|
modifierStr
|
|
340
372
|
}
|
|
373
|
+
const isComponent = usingComponents.indexOf(el.tag) !== -1 || el.tag === 'component'
|
|
341
374
|
// 记录event监听信息用于后续判断是否需要使用内置基础组件
|
|
342
375
|
el.hasEvent = true
|
|
343
376
|
const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'web', meta })
|
|
344
|
-
const rEventName = runRules(eventRules, eventName, { mode: 'web' })
|
|
377
|
+
const rEventName = runRules(eventRules, eventName, { mode: 'web', data: { isComponent } })
|
|
345
378
|
return {
|
|
346
379
|
name: rPrefix + rEventName + meta.modifierStr,
|
|
347
380
|
value
|
|
@@ -411,7 +444,11 @@ module.exports = function getSpec ({ warn, error }) {
|
|
|
411
444
|
touchcancel: 'touchCancel',
|
|
412
445
|
tap: 'tap',
|
|
413
446
|
longtap: 'longTap',
|
|
414
|
-
longpress: 'longTap'
|
|
447
|
+
longpress: 'longTap',
|
|
448
|
+
transitionend: 'transitionEnd',
|
|
449
|
+
animationstart: 'animationStart',
|
|
450
|
+
animationiteration: 'animationIteration',
|
|
451
|
+
animationend: 'animationEnd'
|
|
415
452
|
}
|
|
416
453
|
if (eventMap[eventName]) {
|
|
417
454
|
return eventMap[eventName]
|
|
@@ -424,6 +461,16 @@ module.exports = function getSpec ({ warn, error }) {
|
|
|
424
461
|
error(`Web environment does not support [${eventName}] event!`)
|
|
425
462
|
}
|
|
426
463
|
}
|
|
464
|
+
},
|
|
465
|
+
// 特殊web事件
|
|
466
|
+
{
|
|
467
|
+
test: /^click$/,
|
|
468
|
+
web (eventName, data) {
|
|
469
|
+
// 自定义组件根节点
|
|
470
|
+
if (data.isComponent) {
|
|
471
|
+
return '_' + eventName
|
|
472
|
+
}
|
|
473
|
+
}
|
|
427
474
|
}
|
|
428
475
|
]
|
|
429
476
|
}
|
package/lib/runtime/base.styl
CHANGED
|
@@ -120,8 +120,3 @@ html, body, .app {
|
|
|
120
120
|
font-family "weui"
|
|
121
121
|
src url('data:application/octet-stream;base64,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') format('truetype')
|
|
122
122
|
}
|
|
123
|
-
|
|
124
|
-
.mpx-root-view {
|
|
125
|
-
display: inline
|
|
126
|
-
line-height: normal
|
|
127
|
-
}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
const {
|
|
2
|
+
isRichTextTag,
|
|
3
|
+
isUnaryTag,
|
|
4
|
+
isSpace,
|
|
5
|
+
isContWidth,
|
|
6
|
+
isContHeight,
|
|
7
|
+
isContConRow
|
|
8
|
+
} = require('../../../utils/dom-tag-config')
|
|
9
|
+
|
|
1
10
|
// eslint-disable-next-line
|
|
2
11
|
const attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/ // useless escape
|
|
3
12
|
const ncname = '[a-zA-Z_][\\w\\-\\.]*'
|
|
@@ -11,36 +20,6 @@ const comment = /^<!\--/
|
|
|
11
20
|
const invalidAttributeRE = /[\s"'<>\/=]/
|
|
12
21
|
let currentParent
|
|
13
22
|
|
|
14
|
-
function makeMap (str, expectsLowerCase) {
|
|
15
|
-
const map = Object.create(null)
|
|
16
|
-
const list = str.split(',')
|
|
17
|
-
for (let i = 0; i < list.length; i++) {
|
|
18
|
-
map[list[i]] = true
|
|
19
|
-
}
|
|
20
|
-
return expectsLowerCase
|
|
21
|
-
? val => map[val.toLowerCase()]
|
|
22
|
-
: val => map[val]
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const isRichTextTag = makeMap(
|
|
26
|
-
'a,abbr,address,article,aside,b,bdi,bdo,big,blockquote,br,caption,' +
|
|
27
|
-
'center,cite,code,col,colgroup,dd,del,div,dl,dt,em,fieldset,' +
|
|
28
|
-
'font,footer,h1,h2,h3,h4,h5,h6,header,hr,i,img,ins,label,legend,' +
|
|
29
|
-
'li,mark,nav,ol,p,pre,q,rt,ruby,s,section,small,span,strong,sub,sup,' +
|
|
30
|
-
'table,tbody,td,tfoot,th,thead,tr,tt,u,ul'
|
|
31
|
-
)
|
|
32
|
-
const isUnaryTag = makeMap(
|
|
33
|
-
'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +
|
|
34
|
-
'link,meta,param,source,track,wbr'
|
|
35
|
-
)
|
|
36
|
-
const isSpace = makeMap('ensp,emsp,nbsp')
|
|
37
|
-
|
|
38
|
-
const isContWidth = makeMap('col,colgroup,img,table,td,th,tr')
|
|
39
|
-
|
|
40
|
-
const isContHeight = makeMap('img,td,th,tr')
|
|
41
|
-
|
|
42
|
-
const isContConRow = makeMap('td,th,tr')
|
|
43
|
-
|
|
44
23
|
function makeAttrsMap (attrs) {
|
|
45
24
|
const map = {}
|
|
46
25
|
for (let i = 0, l = attrs.length; i < l; i++) {
|
|
@@ -144,20 +144,8 @@ export function inheritEvent (type, oe, detail = {}) {
|
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
export function getCustomEvent (type, detail = {}, target = null) {
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
const targetEl = target.$el || {}
|
|
150
|
-
const info = {
|
|
151
|
-
id: targetEl.id || '',
|
|
152
|
-
dataset: targetEl.dataset || {},
|
|
153
|
-
offsetTop: targetEl.offsetTop || 0,
|
|
154
|
-
offsetLeft: targetEl.offsetLeft || 0
|
|
155
|
-
}
|
|
156
|
-
Object.assign(targetInfo, {
|
|
157
|
-
target: info,
|
|
158
|
-
currentTarget: info
|
|
159
|
-
})
|
|
160
|
-
}
|
|
147
|
+
const targetEl = (target && target.$el) || null
|
|
148
|
+
const targetInfo = targetEl ? { target: targetEl, currentTarget: targetEl } : {}
|
|
161
149
|
return {
|
|
162
150
|
type,
|
|
163
151
|
detail,
|
|
@@ -30,9 +30,7 @@
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
function getVnodeKey (vnode) {
|
|
33
|
-
|
|
34
|
-
return vnode.componentOptions.Ctor.cid + (vnode.componentOptions.tag ? ('::' + (vnode.componentOptions.tag)) : '')
|
|
35
|
-
}
|
|
33
|
+
return vnode.tag + (vnode.key ? `::${vnode.key}` : '')
|
|
36
34
|
}
|
|
37
35
|
|
|
38
36
|
export default {
|
|
@@ -44,12 +42,13 @@
|
|
|
44
42
|
if (!isBrowser) {
|
|
45
43
|
return vnode || (slot && slot[0])
|
|
46
44
|
}
|
|
47
|
-
const vnodeKey = getVnodeKey(vnode)
|
|
48
45
|
const router = global.__mpxRouter
|
|
49
|
-
if (
|
|
46
|
+
if (router) {
|
|
47
|
+
// 存在routeCount的情况下修改vnode.key避免patch时复用旧节点实例
|
|
48
|
+
if (router.currentRoute.query.routeCount) vnode.key = router.currentRoute.query.routeCount
|
|
49
|
+
const vnodeKey = getVnodeKey(vnode)
|
|
50
50
|
if (router.needCache) {
|
|
51
51
|
router.needCache.vnode = vnode
|
|
52
|
-
router.needCache.vnodeKey = vnodeKey
|
|
53
52
|
router.needCache = null
|
|
54
53
|
}
|
|
55
54
|
|
|
@@ -65,29 +64,23 @@
|
|
|
65
64
|
removeItem.vnode.componentInstance.$destroy()
|
|
66
65
|
}
|
|
67
66
|
})
|
|
67
|
+
// 在执行完destroy后再同步lastStack信息,让用户在destroy钩子中还能够访问到销毁之前的页面栈,与小程序保持一致
|
|
68
|
+
router.lastStack = router.stack.slice()
|
|
68
69
|
router.needRemove.length = 0
|
|
69
70
|
|
|
70
71
|
const stack = router.stack
|
|
71
72
|
if (stack.length) {
|
|
72
|
-
//
|
|
73
|
+
// 只要历史栈缓存中存在对应的页面存活实例且vnodeKey相同,就进行复用
|
|
73
74
|
for (let i = stack.length; i > 0; i--) {
|
|
74
75
|
const current = stack[i - 1]
|
|
75
|
-
if (current.vnode && current.
|
|
76
|
+
if (current.vnode && getVnodeKey(current.vnode) === vnodeKey && current.vnode.componentInstance) {
|
|
76
77
|
vnode.componentInstance = current.vnode.componentInstance
|
|
77
|
-
// 避免组件实例复用但是vnode.key不一致带来的bad case
|
|
78
|
-
vnode.key = current.vnode.key
|
|
79
78
|
break
|
|
80
79
|
}
|
|
81
80
|
}
|
|
82
81
|
}
|
|
83
82
|
|
|
84
|
-
if (router.__mpxAction)
|
|
85
|
-
if (router.__mpxAction.type === 'reLaunch') {
|
|
86
|
-
// reLaunch时修改新vnode的key, 确保任何情况下都新创建组件实例
|
|
87
|
-
vnode.key = (vnode.key || '') + router.__mpxAction.reLaunchCount
|
|
88
|
-
}
|
|
89
|
-
router.__mpxAction = null
|
|
90
|
-
}
|
|
83
|
+
if (router.__mpxAction) router.__mpxAction = null
|
|
91
84
|
vnode.data.keepAlive = true
|
|
92
85
|
}
|
|
93
86
|
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
</div>
|
|
2
|
+
<div class="mpx-movable-scroll-content" ref="scrollContent">
|
|
3
|
+
<div class="mpx-movable-scroll-item">
|
|
4
|
+
<slot></slot>
|
|
6
5
|
</div>
|
|
6
|
+
</div>
|
|
7
7
|
</template>
|
|
8
8
|
|
|
9
9
|
<script type="text/ecmascript-6">
|
|
10
|
-
import {getCustomEvent} from './getInnerListeners'
|
|
10
|
+
import {getCustomEvent, extendEvent} from './getInnerListeners'
|
|
11
11
|
import BScroll from '@better-scroll/core'
|
|
12
12
|
import Movable from '@better-scroll/movable'
|
|
13
|
+
import ObserveDOM from '@better-scroll/observe-dom'
|
|
13
14
|
import Zoom from '@better-scroll/zoom'
|
|
14
15
|
|
|
15
16
|
BScroll.use(Movable)
|
|
16
17
|
BScroll.use(Zoom)
|
|
18
|
+
BScroll.use(ObserveDOM)
|
|
17
19
|
|
|
18
20
|
export default {
|
|
19
21
|
data () {
|
|
@@ -23,6 +25,8 @@
|
|
|
23
25
|
maxScrollX: 0,
|
|
24
26
|
minScrollY: 0,
|
|
25
27
|
maxScrollY: 0,
|
|
28
|
+
currentX: this.x,
|
|
29
|
+
currentY: this.y,
|
|
26
30
|
lastestX: 0,
|
|
27
31
|
lastestY: 0,
|
|
28
32
|
lastestScale: 1,
|
|
@@ -30,7 +34,10 @@
|
|
|
30
34
|
isZooming: false,
|
|
31
35
|
isFirstTouch: true,
|
|
32
36
|
source: '',
|
|
33
|
-
touchEvent: ''
|
|
37
|
+
touchEvent: '',
|
|
38
|
+
isInited: false,
|
|
39
|
+
deactivatedX: 0,
|
|
40
|
+
deactivatedY: 0
|
|
34
41
|
}
|
|
35
42
|
},
|
|
36
43
|
props: {
|
|
@@ -89,7 +96,13 @@
|
|
|
89
96
|
speed: {
|
|
90
97
|
type: Number,
|
|
91
98
|
default: 1000
|
|
92
|
-
}
|
|
99
|
+
},
|
|
100
|
+
scrollOptions: {
|
|
101
|
+
type: Object,
|
|
102
|
+
default: () => {
|
|
103
|
+
return {}
|
|
104
|
+
}
|
|
105
|
+
},
|
|
93
106
|
},
|
|
94
107
|
watch: {
|
|
95
108
|
x (newVal) {
|
|
@@ -100,6 +113,7 @@
|
|
|
100
113
|
if (newVal < this.bs.maxScrollX) {
|
|
101
114
|
newVal = this.bs.maxScrollX
|
|
102
115
|
}
|
|
116
|
+
this.currentX = newVal
|
|
103
117
|
this.bs.scrollTo(newVal, this.bs.y, this.speed)
|
|
104
118
|
},
|
|
105
119
|
y (newVal) {
|
|
@@ -110,6 +124,7 @@
|
|
|
110
124
|
if (newVal < this.bs.maxScrollY) {
|
|
111
125
|
newVal = this.bs.maxScrollY
|
|
112
126
|
}
|
|
127
|
+
this.currentY = newVal
|
|
113
128
|
this.bs.scrollTo(this.bs.x, newVal, this.speed)
|
|
114
129
|
},
|
|
115
130
|
scaleValue (newVal) {
|
|
@@ -121,16 +136,61 @@
|
|
|
121
136
|
newVal = 0.5
|
|
122
137
|
}
|
|
123
138
|
this.bs.zoomTo(newVal, 'center', 'center')
|
|
139
|
+
},
|
|
140
|
+
disabled () {
|
|
141
|
+
this.init()
|
|
124
142
|
}
|
|
125
143
|
},
|
|
126
144
|
mounted () {
|
|
145
|
+
if (!this.scrollOptions.closeResizeObserver) {
|
|
146
|
+
this.createResizeObserver()
|
|
147
|
+
}
|
|
127
148
|
this.init()
|
|
128
149
|
},
|
|
150
|
+
activated () {
|
|
151
|
+
if (this.deactivatedX || this.deactivatedY) {
|
|
152
|
+
this.refresh()
|
|
153
|
+
this.bs.putAt(this.deactivatedX, this.deactivatedY, 0)
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
deactivated () {
|
|
157
|
+
// when the hook is triggered
|
|
158
|
+
// bs will recalculate the boundary of movable to 0
|
|
159
|
+
// so record the position of the movable
|
|
160
|
+
this.deactivatedX = this.bs.x
|
|
161
|
+
this.deactivatedY = this.bs.y
|
|
162
|
+
},
|
|
129
163
|
beforeDestroy () {
|
|
130
|
-
this.
|
|
164
|
+
this.destroyBs()
|
|
165
|
+
if (this.resizeObserver) {
|
|
166
|
+
this.resizeObserver.disconnect()
|
|
167
|
+
this.resizeObserver = null
|
|
168
|
+
}
|
|
131
169
|
},
|
|
132
170
|
methods: {
|
|
171
|
+
createResizeObserver () {
|
|
172
|
+
if (typeof ResizeObserver !== 'undefined') {
|
|
173
|
+
this.resizeObserver = new ResizeObserver(entries => {
|
|
174
|
+
if (!this.isInited) {
|
|
175
|
+
this.isInited = true
|
|
176
|
+
return
|
|
177
|
+
}
|
|
178
|
+
this.refresh()
|
|
179
|
+
})
|
|
180
|
+
const elementToObserve = document.querySelector('.mpx-movable-scroll-content')
|
|
181
|
+
this.resizeObserver.observe(elementToObserve)
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
refresh () {
|
|
185
|
+
this.bs && this.bs.refresh()
|
|
186
|
+
},
|
|
187
|
+
destroyBs () {
|
|
188
|
+
if (!this.bs) return
|
|
189
|
+
this.bs.destroy()
|
|
190
|
+
delete this.bs
|
|
191
|
+
},
|
|
133
192
|
init () {
|
|
193
|
+
this.destroyBs()
|
|
134
194
|
if (!this.$refs.scrollContent.parentNode || (this.$refs.scrollContent.parentNode && this.$refs.scrollContent.parentNode.className !== 'mpx-movable-scroll-wrapper')) {
|
|
135
195
|
return
|
|
136
196
|
}
|
|
@@ -143,8 +203,8 @@
|
|
|
143
203
|
scrollX: false,
|
|
144
204
|
scrollY: false,
|
|
145
205
|
movable: true,
|
|
146
|
-
startX: this.
|
|
147
|
-
startY: this.
|
|
206
|
+
startX: this.currentX,
|
|
207
|
+
startY: this.currentY,
|
|
148
208
|
bounce: this.outOfBounds,
|
|
149
209
|
bounceTime: 800 / (this.damping / 20),
|
|
150
210
|
probeType: 3,
|
|
@@ -153,7 +213,7 @@
|
|
|
153
213
|
const BehaviorHooks = this.bs.scroller.scrollBehaviorY.hooks
|
|
154
214
|
const actionsHandlerHooks = this.bs.scroller.actionsHandler.hooks
|
|
155
215
|
const scrollerHooks = this.bs.scroller.hooks
|
|
156
|
-
this.bs.putAt(this.
|
|
216
|
+
this.bs.putAt(this.currentX, this.currentY, 0)
|
|
157
217
|
this.lastestX = this.roundFun(this.x)
|
|
158
218
|
this.lastestY = this.roundFun(this.y)
|
|
159
219
|
this.lastestScale = this.roundFun(this.scaleValue)
|
|
@@ -184,6 +244,10 @@
|
|
|
184
244
|
this.lastestX = this.roundFun(position.x)
|
|
185
245
|
this.lastestY = this.roundFun(position.y)
|
|
186
246
|
})
|
|
247
|
+
scrollerHooks.on('scrollEnd', (position) =>{
|
|
248
|
+
this.currentX = this.bs.x
|
|
249
|
+
this.currentY = this.bs.y
|
|
250
|
+
})
|
|
187
251
|
scrollerHooks.on('touchEnd', (position) => {
|
|
188
252
|
this.isFirstTouch = true
|
|
189
253
|
if (position.x > this.minScrollX || position.x < this.maxScrollX ||
|
|
@@ -204,6 +268,14 @@
|
|
|
204
268
|
this.bs.movingDirectionY = -1
|
|
205
269
|
}
|
|
206
270
|
})
|
|
271
|
+
actionsHandlerHooks.on('start', (e) => {
|
|
272
|
+
extendEvent(e, { detail: Object.assign({}, e.detail) })
|
|
273
|
+
this.$emit('touchstart', e)
|
|
274
|
+
})
|
|
275
|
+
actionsHandlerHooks.on('end', (e) => {
|
|
276
|
+
extendEvent(e, { detail: Object.assign({}, e.detail) })
|
|
277
|
+
this.$emit('touchend', e)
|
|
278
|
+
})
|
|
207
279
|
actionsHandlerHooks.on('move', ({ deltaX, deltaY, e }) => {
|
|
208
280
|
if (this.isZooming) {
|
|
209
281
|
return
|
|
@@ -215,7 +287,9 @@
|
|
|
215
287
|
this.touchEvent = 'vtouchmove'
|
|
216
288
|
}
|
|
217
289
|
}
|
|
218
|
-
|
|
290
|
+
extendEvent(e, { detail: Object.assign({}, e.detail), currentTarget: e.target })
|
|
291
|
+
this.$emit(this.touchEvent, e)
|
|
292
|
+
this.$emit('touchmove', e)
|
|
219
293
|
this.isFirstTouch = false
|
|
220
294
|
})
|
|
221
295
|
if (this.inertia) { // movable-view是否带有惯性
|
|
@@ -240,9 +314,6 @@
|
|
|
240
314
|
this.isZooming = false
|
|
241
315
|
})
|
|
242
316
|
}
|
|
243
|
-
if (this.disabled) { // 禁用
|
|
244
|
-
this.bs.disable()
|
|
245
|
-
}
|
|
246
317
|
},
|
|
247
318
|
initOptions () {
|
|
248
319
|
if (!this.friction || this.friction < 0) {
|
|
@@ -273,19 +344,24 @@
|
|
|
273
344
|
swipeTime: 50
|
|
274
345
|
}
|
|
275
346
|
}
|
|
276
|
-
if (this.
|
|
347
|
+
if (this.disabled) {
|
|
348
|
+
this.bsOptions = {
|
|
349
|
+
...this.bsOptions,
|
|
350
|
+
freeScroll: false,
|
|
351
|
+
scrollY: false,
|
|
352
|
+
scrollX: false
|
|
353
|
+
}
|
|
354
|
+
} else if (this.direction === 'vertical') {
|
|
277
355
|
this.bsOptions = {
|
|
278
356
|
...this.bsOptions,
|
|
279
357
|
scrollY: true
|
|
280
358
|
}
|
|
281
|
-
}
|
|
282
|
-
if (this.direction === 'horizontal') {
|
|
359
|
+
} else if (this.direction === 'horizontal') {
|
|
283
360
|
this.bsOptions = {
|
|
284
361
|
...this.bsOptions,
|
|
285
362
|
scrollX: true
|
|
286
363
|
}
|
|
287
|
-
}
|
|
288
|
-
if (this.direction === 'all') {
|
|
364
|
+
} else if (this.direction === 'all') {
|
|
289
365
|
this.bsOptions = {
|
|
290
366
|
...this.bsOptions,
|
|
291
367
|
freeScroll: true,
|
|
@@ -293,6 +369,10 @@
|
|
|
293
369
|
scrollY: true
|
|
294
370
|
}
|
|
295
371
|
}
|
|
372
|
+
this.bsOptions = {
|
|
373
|
+
...this.bsOptions,
|
|
374
|
+
...this.scrollOptions
|
|
375
|
+
}
|
|
296
376
|
},
|
|
297
377
|
// 处理小数点,四舍五入,默认保留一位小数
|
|
298
378
|
roundFun(value, n = 1) {
|
|
@@ -302,7 +382,9 @@
|
|
|
302
382
|
}
|
|
303
383
|
</script>
|
|
304
384
|
<style lang="stylus" rel="stylesheet/stylus" scoped>
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
385
|
+
.mpx-movable-scroll-content
|
|
386
|
+
position: absolute
|
|
387
|
+
.mpx-movable-scroll-item
|
|
388
|
+
width: 100%
|
|
389
|
+
height: 100%
|
|
308
390
|
</style>
|