¶Ô±ÈÐÂÎļþ |
| | |
| | | var MIN_DISTANCE = 10; |
| | | |
| | | /** |
| | | * 夿å½åæ¯å¦ä¸ºH5ãapp-vue |
| | | */ |
| | | var IS_HTML5 = false |
| | | if (typeof window === 'object') IS_HTML5 = true |
| | | |
| | | /** |
| | | * çå¬é¡µé¢å
å¼çåå,主è¦ç¨äºå¨æå¼å
³swipe-action |
| | | * @param {Object} newValue |
| | | * @param {Object} oldValue |
| | | * @param {Object} ownerInstance |
| | | * @param {Object} instance |
| | | */ |
| | | function showWatch(newVal, oldVal, ownerInstance, instance) { |
| | | var state = instance.getState() |
| | | getDom(instance, ownerInstance) |
| | | if (newVal && newVal !== 'none') { |
| | | openState(newVal, instance, ownerInstance) |
| | | return |
| | | } |
| | | |
| | | if (state.left) { |
| | | openState('none', instance, ownerInstance) |
| | | } |
| | | resetTouchStatus(instance) |
| | | } |
| | | |
| | | /** |
| | | * å¼å§è§¦æ¸æä½ |
| | | * @param {Object} e |
| | | * @param {Object} ins |
| | | */ |
| | | function touchstart(e, ownerInstance) { |
| | | var instance = e.instance; |
| | | var disabled = instance.getDataset().disabled |
| | | var state = instance.getState(); |
| | | getDom(instance, ownerInstance) |
| | | // fix by mehaotian, TODO å
¼å®¹ app-vue è·ådataset为å符串 , h5 è·å 为 undefined çé®é¢,å¾
æ¡æ¶ä¿®å¤ |
| | | disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false; |
| | | if (disabled) return |
| | | // å¼å§è§¦æ¸æ¶ç§»é¤å¨ç»ç±» |
| | | instance.requestAnimationFrame(function() { |
| | | instance.removeClass('ani'); |
| | | ownerInstance.callMethod('closeSwipe'); |
| | | }) |
| | | |
| | | // è®°å½ä¸æ¬¡çä½ç½® |
| | | state.x = state.left || 0 |
| | | // è®¡ç®æ»å¨å¼å§ä½ç½® |
| | | stopTouchStart(e, ownerInstance) |
| | | } |
| | | |
| | | /** |
| | | * å¼å§æ»å¨æä½ |
| | | * @param {Object} e |
| | | * @param {Object} ownerInstance |
| | | */ |
| | | function touchmove(e, ownerInstance) { |
| | | var instance = e.instance; |
| | | var disabled = instance.getDataset().disabled |
| | | var state = instance.getState() |
| | | // fix by mehaotian, TODO å
¼å®¹ app-vue è·ådataset为å符串 , h5 è·å 为 undefined çé®é¢,å¾
æ¡æ¶ä¿®å¤ |
| | | disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false; |
| | | if (disabled) return |
| | | // æ¯å¦å¯ä»¥æ»å¨é¡µé¢ |
| | | stopTouchMove(e); |
| | | if (state.direction !== 'horizontal') { |
| | | return; |
| | | } |
| | | |
| | | if (e.preventDefault) { |
| | | // 黿¢é¡µé¢æ»å¨ |
| | | e.preventDefault() |
| | | } |
| | | |
| | | move(state.x + state.deltaX, instance, ownerInstance) |
| | | } |
| | | |
| | | /** |
| | | * ç»æè§¦æ¸æä½ |
| | | * @param {Object} e |
| | | * @param {Object} ownerInstance |
| | | */ |
| | | function touchend(e, ownerInstance) { |
| | | var instance = e.instance; |
| | | var disabled = instance.getDataset().disabled |
| | | var state = instance.getState() |
| | | // fix by mehaotian, TODO å
¼å®¹ app-vue è·ådataset为å符串 , h5 è·å 为 undefined çé®é¢,å¾
æ¡æ¶ä¿®å¤ |
| | | disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false; |
| | | |
| | | if (disabled) return |
| | | // æ»å¨è¿ç¨ä¸è§¦æ¸ç»æ,éè¿éå¼å¤ææ¯å¼å¯è¿æ¯å
³é |
| | | // fixed by mehaotian 宿¶å¨è§£å³ç¹å»æé®ï¼touchend è§¦åæ¯ click äºä»¶æ¶æºæ©çé®é¢ ï¼ä¸»è¦æ¯ ios13 |
| | | moveDirection(state.left, instance, ownerInstance) |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 设置移å¨è·ç¦» |
| | | * @param {Object} value |
| | | * @param {Object} instance |
| | | * @param {Object} ownerInstance |
| | | */ |
| | | function move(value, instance, ownerInstance) { |
| | | value = value || 0 |
| | | var state = instance.getState() |
| | | var leftWidth = state.leftWidth |
| | | var rightWidth = state.rightWidth |
| | | // è·å坿»å¨èå´ |
| | | state.left = range(value, -rightWidth, leftWidth); |
| | | instance.requestAnimationFrame(function() { |
| | | instance.setStyle({ |
| | | transform: 'translateX(' + state.left + 'px)', |
| | | '-webkit-transform': 'translateX(' + state.left + 'px)' |
| | | }) |
| | | }) |
| | | |
| | | } |
| | | |
| | | /** |
| | | * è·åå
ç´ ä¿¡æ¯ |
| | | * @param {Object} instance |
| | | * @param {Object} ownerInstance |
| | | */ |
| | | function getDom(instance, ownerInstance) { |
| | | var state = instance.getState() |
| | | var leftDom = ownerInstance.selectComponent('.button-group--left') |
| | | var rightDom = ownerInstance.selectComponent('.button-group--right') |
| | | var leftStyles = { |
| | | width: 0 |
| | | } |
| | | var rightStyles = { |
| | | width: 0 |
| | | } |
| | | leftStyles = leftDom.getBoundingClientRect() |
| | | rightStyles = rightDom.getBoundingClientRect() |
| | | |
| | | state.leftWidth = leftStyles.width || 0 |
| | | state.rightWidth = rightStyles.width || 0 |
| | | state.threshold = instance.getDataset().threshold |
| | | } |
| | | |
| | | /** |
| | | * è·åèå´ |
| | | * @param {Object} num |
| | | * @param {Object} min |
| | | * @param {Object} max |
| | | */ |
| | | function range(num, min, max) { |
| | | return Math.min(Math.max(num, min), max); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * ç§»å¨æ¹å夿 |
| | | * @param {Object} left |
| | | * @param {Object} value |
| | | * @param {Object} ownerInstance |
| | | * @param {Object} ins |
| | | */ |
| | | function moveDirection(left, ins, ownerInstance) { |
| | | var state = ins.getState() |
| | | var threshold = state.threshold |
| | | var position = state.position |
| | | var isopen = state.isopen || 'none' |
| | | var leftWidth = state.leftWidth |
| | | var rightWidth = state.rightWidth |
| | | if (state.deltaX === 0) { |
| | | openState('none', ins, ownerInstance) |
| | | return |
| | | } |
| | | if ((isopen === 'none' && rightWidth > 0 && -left > threshold) || (isopen !== 'none' && rightWidth > 0 && |
| | | rightWidth + |
| | | left < threshold)) { |
| | | // right |
| | | openState('right', ins, ownerInstance) |
| | | } else if ((isopen === 'none' && leftWidth > 0 && left > threshold) || (isopen !== 'none' && leftWidth > 0 && |
| | | leftWidth - left < threshold)) { |
| | | // left |
| | | openState('left', ins, ownerInstance) |
| | | } else { |
| | | // default |
| | | openState('none', ins, ownerInstance) |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * å¼å¯ç¶æ |
| | | * @param {Boolean} type |
| | | * @param {Object} ins |
| | | * @param {Object} ownerInstance |
| | | */ |
| | | function openState(type, ins, ownerInstance) { |
| | | var state = ins.getState() |
| | | var leftWidth = state.leftWidth |
| | | var rightWidth = state.rightWidth |
| | | var left = '' |
| | | state.isopen = state.isopen ? state.isopen : 'none' |
| | | switch (type) { |
| | | case "left": |
| | | left = leftWidth |
| | | break |
| | | case "right": |
| | | left = -rightWidth |
| | | break |
| | | default: |
| | | left = 0 |
| | | } |
| | | |
| | | // && !state.throttle |
| | | |
| | | if (state.isopen !== type) { |
| | | state.throttle = true |
| | | ownerInstance.callMethod('change', { |
| | | open: type |
| | | }) |
| | | |
| | | } |
| | | |
| | | state.isopen = type |
| | | // æ·»å å¨ç»ç±» |
| | | ins.requestAnimationFrame(function() { |
| | | ins.addClass('ani'); |
| | | move(left, ins, ownerInstance) |
| | | }) |
| | | // 设置æç»ç§»å¨ä½ç½®,ç论ä¸åªè¦è¿å
¥å°è¿ä¸ªå½æ°ï¼è¯å®æ¯è¦æå¼ç |
| | | } |
| | | |
| | | |
| | | function getDirection(x, y) { |
| | | if (x > y && x > MIN_DISTANCE) { |
| | | return 'horizontal'; |
| | | } |
| | | if (y > x && y > MIN_DISTANCE) { |
| | | return 'vertical'; |
| | | } |
| | | return ''; |
| | | } |
| | | |
| | | /** |
| | | * éç½®æ»å¨ç¶æ |
| | | * @param {Object} event |
| | | */ |
| | | function resetTouchStatus(instance) { |
| | | var state = instance.getState(); |
| | | state.direction = ''; |
| | | state.deltaX = 0; |
| | | state.deltaY = 0; |
| | | state.offsetX = 0; |
| | | state.offsetY = 0; |
| | | } |
| | | |
| | | /** |
| | | * 设置æ»å¨å¼å§ä½ç½® |
| | | * @param {Object} event |
| | | */ |
| | | function stopTouchStart(event) { |
| | | var instance = event.instance; |
| | | var state = instance.getState(); |
| | | resetTouchStatus(instance); |
| | | var touch = event.touches[0]; |
| | | if (IS_HTML5 && isPC()) { |
| | | touch = event; |
| | | } |
| | | state.startX = touch.clientX; |
| | | state.startY = touch.clientY; |
| | | } |
| | | |
| | | /** |
| | | * æ»å¨ä¸ï¼æ¯å¦ç¦æ¢æå¼ |
| | | * @param {Object} event |
| | | */ |
| | | function stopTouchMove(event) { |
| | | var instance = event.instance; |
| | | var state = instance.getState(); |
| | | var touch = event.touches[0]; |
| | | if (IS_HTML5 && isPC()) { |
| | | touch = event; |
| | | } |
| | | state.deltaX = touch.clientX - state.startX; |
| | | state.deltaY = touch.clientY - state.startY; |
| | | state.offsetY = Math.abs(state.deltaY); |
| | | state.offsetX = Math.abs(state.deltaX); |
| | | state.direction = state.direction || getDirection(state.offsetX, state.offsetY); |
| | | } |
| | | |
| | | function isPC() { |
| | | var userAgentInfo = navigator.userAgent; |
| | | var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; |
| | | var flag = true; |
| | | for (var v = 0; v < Agents.length - 1; v++) { |
| | | if (userAgentInfo.indexOf(Agents[v]) > 0) { |
| | | flag = false; |
| | | break; |
| | | } |
| | | } |
| | | return flag; |
| | | } |
| | | |
| | | var movable = false |
| | | |
| | | function mousedown(e, ins) { |
| | | if (!IS_HTML5) return |
| | | if (!isPC()) return |
| | | touchstart(e, ins) |
| | | movable = true |
| | | } |
| | | |
| | | function mousemove(e, ins) { |
| | | if (!IS_HTML5) return |
| | | if (!isPC()) return |
| | | if (!movable) return |
| | | touchmove(e, ins) |
| | | } |
| | | |
| | | function mouseup(e, ins) { |
| | | if (!IS_HTML5) return |
| | | if (!isPC()) return |
| | | touchend(e, ins) |
| | | movable = false |
| | | } |
| | | |
| | | function mouseleave(e, ins) { |
| | | if (!IS_HTML5) return |
| | | if (!isPC()) return |
| | | movable = false |
| | | } |
| | | |
| | | module.exports = { |
| | | showWatch: showWatch, |
| | | touchstart: touchstart, |
| | | touchmove: touchmove, |
| | | touchend: touchend, |
| | | mousedown: mousedown, |
| | | mousemove: mousemove, |
| | | mouseup: mouseup, |
| | | mouseleave: mouseleave |
| | | } |