|   | 
| function setTimeout(instance, cb, time) { | 
|   if (time > 0) { | 
|     var s = getDate().getTime() | 
|     var fn = function () { | 
|         if (getDate().getTime() - s > time) { | 
|             cb && cb() | 
|         } else | 
|             instance.requestAnimationFrame(fn) | 
|     } | 
|     fn() | 
|   } | 
|   else | 
|     cb && cb() | 
| } | 
|   | 
| // 判断触摸的移动方向 | 
| function decideSwiperDirection(startTouches, currentTouches, vertical) { | 
|   // 震动偏移容差 | 
|   var toleranceShake = 150 | 
|   // 移动容差 | 
|   var toleranceTranslate = 10 | 
|    | 
|   if (!vertical) { | 
|     // 水平方向移动 | 
|     if (Math.abs(currentTouches.y - startTouches.y) <= toleranceShake) { | 
|       // console.log(currentTouches.x, startTouches.x); | 
|       if (Math.abs(currentTouches.x - startTouches.x) > toleranceTranslate) { | 
|         if (currentTouches.x - startTouches.x > 0) { | 
|           return 'right' | 
|         } else if (currentTouches.x - startTouches.x < 0) { | 
|           return 'left' | 
|         } | 
|       } | 
|     } | 
|   } else { | 
|     // 垂直方向移动 | 
|     if (Math.abs(currentTouches.x - startTouches.x) <= toleranceShake) { | 
|       // console.log(currentTouches.x, startTouches.x); | 
|       if (Math.abs(currentTouches.y - startTouches.y) > toleranceTranslate) { | 
|         if (currentTouches.y - startTouches.y > 0) { | 
|           return 'down' | 
|         } else if (currentTouches.y - startTouches.y < 0) { | 
|           return 'up' | 
|         } | 
|       } | 
|     } | 
|   } | 
|   return '' | 
| } | 
|   | 
| // swiperItem参数数据更新 | 
| var itemDataObserver = function(newVal, oldVal, ownerInstance, instance) { | 
|   if (!newVal || newVal === 'undefined') return | 
|   var state = ownerInstance.getState() | 
|   state.itemData = newVal | 
| } | 
|   | 
| // swiperIndex数据更新 | 
| var currentIndexObserver = function(newVal, oldVal, ownerInstance, instance) { | 
|   if ((!newVal && newVal != 0) || newVal === 'undefined') return | 
|   var state = ownerInstance.getState() | 
|   state.currentIndex = newVal | 
| } | 
|   | 
| // containerData数据更新 | 
| var containerDataObserver = function(newVal, oldVal, ownerInstance, instance) { | 
|   if (!newVal || newVal === 'undefined') return | 
|   var state = ownerInstance.getState() | 
|   state.containerData = newVal | 
| } | 
|   | 
| // 开始触摸 | 
| var touchStart = function(event, ownerInstance) { | 
|   console.log('touchStart'); | 
|   var instance = event.instance | 
|   var dataset = instance.getDataset() | 
|   var state = ownerInstance.getState() | 
|   var itemData = state.itemData | 
|   var containerData = state.containerData | 
|    | 
|   // 由于当前SwiperIndex初始为0,可能会导致swiperIndex数据没有更新 | 
|   if (!state.currentIndex || state.currentIndex === 'undefined') { | 
|     state.currentIndex = 0 | 
|   } | 
|    | 
|   if (!containerData || containerData.circular === 'undefined') { | 
|     containerData.circular = false | 
|   } | 
|   state.containerData = containerData | 
|    | 
|   // 如果当前切换动画还没执行结束,再次触摸会重新加载对应的swiperContainer的信息 | 
|   // console.log(containerData.animationFinish); | 
|   if (!containerData.animationFinish) { | 
|     ownerInstance.callMethod('changeParentSwiperContainerStyleStatus',{ | 
|       status: 'reload' | 
|     }) | 
|   } | 
|   | 
|   // 判断是否为为当前显示的SwiperItem | 
|   if (itemData.index != state.currentIndex) return | 
|    | 
|   var touches = event.changedTouches[0] | 
|   if (!touches) return | 
|    | 
|   // 标记滑动开始时间 | 
|   state.touchStartTime = getDate().getTime() | 
|    | 
|   // 记录当前滑动开始的x,y坐标 | 
|   state.touchRelactive = { | 
|     x: touches.pageX, | 
|     y: touches.pageY | 
|   } | 
|   // 记录触摸id,用于处理多指的情况 | 
|   state.touchId = touches.identifier | 
|    | 
|   // 标记开始触摸 | 
|   state.touching = true | 
|   ownerInstance.callMethod('updateTouchingStatus', { | 
|     status: true | 
|   }) | 
| } | 
|   | 
| // 正在移动 | 
| var touchMove = function(event, ownerInstance) { | 
|   console.log('touchMove'); | 
|   var instance = event.instance | 
|   var dataset = instance.getDataset() | 
|   var state = ownerInstance.getState() | 
|   var itemData = state.itemData | 
|   var containerData = state.containerData | 
|    | 
|   // 判断是否为为当前显示的SwiperItem | 
|   if (itemData.index != state.currentIndex) return | 
|    | 
|   // 判断是否开始触摸 | 
|   if (!state.touching) return | 
|    | 
|   var touches = event.changedTouches[0] | 
|   if (!touches) return | 
|   // 判断是否为同一个触摸点 | 
|   if (state.touchId != touches.identifier) return | 
|    | 
|   var currentTouchRelactive = { | 
|     x: touches.pageX, | 
|     y: touches.pageY | 
|   } | 
|    | 
|   // 计算相对位移比例 | 
|   if (containerData.vertical) { | 
|     var touchDistance = currentTouchRelactive.y - state.touchRelactive.y | 
|     var itemHeight = itemData.itemHeight | 
|     var distanceRate = touchDistance / itemHeight | 
|     // console.log(currentTouchRelactive.y, touchDistance, itemHeight, distanceRate); | 
|      | 
|     // 判断是否为衔接轮播,如果不是衔接轮播,如果当前为第一个swiperItem并且向下滑、当前为最后一个swiperItem并且向上滑时不进行操作 | 
|     if (!containerData.circular && | 
|       ((state.currentIndex === 0 && touchDistance > 0) || (state.currentIndex === containerData.swiperItemLength - 1 && touchDistance < 0)) | 
|     ) { | 
|       return | 
|     } | 
|      | 
|     // 如果超出了距离则不进行操作 | 
|     if((Math.abs(touchDistance) > (itemData.itemTop + itemData.itemHeight))) { | 
|       ownerInstance.callMethod('updateParentSwiperContainerStyle', { | 
|         value: distanceRate < 0 ? -1 : 1 | 
|       }) | 
|       return | 
|     } | 
|   } else { | 
|     var touchDistance = currentTouchRelactive.x - state.touchRelactive.x | 
|     var itemWidth = itemData.itemWidth | 
|     var distanceRate = touchDistance / itemWidth | 
|     // console.log(currentTouchRelactive.x, touchDistance, itemWidth, distanceRate); | 
|      | 
|     // 判断是否为衔接轮播,如果不是衔接轮播,如果当前为第一个swiperItem并且向右滑、当前为最后一个swiperItem并且向左滑时不进行操作 | 
|     if (!containerData.circular && | 
|       ((state.currentIndex === 0 && touchDistance > 0) || (state.currentIndex === containerData.swiperItemLength - 1 && touchDistance < 0)) | 
|     ) { | 
|       return | 
|     } | 
|      | 
|     // 如果超出了距离则不进行操作 | 
|     if((Math.abs(touchDistance) > (itemData.itemLeft + itemData.itemWidth))) { | 
|       ownerInstance.callMethod('updateParentSwiperContainerStyle', { | 
|         value: distanceRate < 0 ? -1 : 1 | 
|       }) | 
|       return | 
|     } | 
|   } | 
|    | 
|   ownerInstance.callMethod('updateParentSwiperContainerStyle', { | 
|     value: distanceRate | 
|   }) | 
| } | 
|   | 
| // 移动结束 | 
| var touchEnd = function(event, ownerInstance) { | 
|   console.log('touchEnd'); | 
|   var instance = event.instance | 
|   var dataset = instance.getDataset() | 
|   var state = ownerInstance.getState() | 
|   var itemData = state.itemData | 
|   var containerData = state.containerData | 
|    | 
|   // 判断是否为为当前显示的SwiperItem | 
|   if (itemData.index != state.currentIndex) return | 
|    | 
|   // 判断是否开始触摸 | 
|   if (!state.touching) return | 
|    | 
|   var touches = event.changedTouches[0] | 
|   if (!touches) return | 
|   // 判断是否为同一个触摸点 | 
|   if (state.touchId != touches.identifier) return | 
|    | 
|    | 
|   var currentTime = getDate().getTime() | 
|   var currentTouchRelactive = { | 
|     x: touches.pageX, | 
|     y: touches.pageY | 
|   } | 
|    | 
|   if (containerData.vertical) { | 
|     // 判断触摸移动方向 | 
|     var direction = decideSwiperDirection(state.touchRelactive, currentTouchRelactive, true) | 
|     // 判断是否为衔接轮播,如果不是衔接轮播,如果当前为第一个swiperItem并且向下滑、当前为最后一个swiperItem并且向上滑时不进行操作 | 
|     if (containerData.circular || | 
|       !((state.currentIndex === 0 && direction === 'down') || (state.currentIndex === containerData.swiperItemLength - 1 && direction === 'up')) | 
|     ) { | 
|       // 判断触摸的时间和移动的距离是否超过了当前itemHeight的一半,如果是则执行切换操作 | 
|       // console.log(currentTime - state.touchStartTime, Math.abs(currentTouchRelactive.y - state.touchRelactive.y)); | 
|       if ((currentTime - state.touchStartTime) > 200 && Math.abs(currentTouchRelactive.y - state.touchRelactive.y) < itemData.itemHeight / 2) { | 
|         ownerInstance.callMethod('changeParentSwiperContainerStyleStatus',{ | 
|           status: 'reset' | 
|         }) | 
|       } else { | 
|         // console.log(direction, state.touchRelactive.y, currentTouchRelactive.y); | 
|          | 
|         ownerInstance.callMethod('updateParentSwiperContainerStyleWithDirection', { | 
|           direction: direction | 
|         }) | 
|       } | 
|     } | 
|   } else { | 
|     // 判断触摸移动方向 | 
|     var direction = decideSwiperDirection(state.touchRelactive, currentTouchRelactive, false) | 
|     // 判断是否为衔接轮播,如果不是衔接轮播,如果当前为第一个swiperItem并且向右滑、当前为最后一个swiperItem并且向左滑时不进行操作 | 
|     if (containerData.circular || | 
|       !((state.currentIndex === 0 && direction === 'right') || (state.currentIndex === containerData.swiperItemLength - 1 && direction === 'left')) | 
|     ) { | 
|       // 判断触摸的时间和移动的距离是否超过了当前itemWidth的一半,如果是则执行切换操作 | 
|       // console.log(currentTime - state.touchStartTime, Math.abs(currentTouchRelactive.x - state.touchRelactive.x)); | 
|       if ((currentTime - state.touchStartTime) > 200 && Math.abs(currentTouchRelactive.x - state.touchRelactive.x) < itemData.itemWidth / 2) { | 
|         ownerInstance.callMethod('changeParentSwiperContainerStyleStatus',{ | 
|           status: 'reset' | 
|         }) | 
|       } else { | 
|         // console.log(direction, state.touchRelactive.x, currentTouchRelactive.x); | 
|          | 
|         ownerInstance.callMethod('updateParentSwiperContainerStyleWithDirection', { | 
|           direction: direction | 
|         }) | 
|       } | 
|     } | 
|   } | 
|    | 
|   // 清除标记 | 
|   state.touchId = null | 
|   state.touchRelactive = null | 
|   state.touchStartTime = 0 | 
|    | 
|    | 
|   // 标记停止触摸 | 
|   state.touching = true | 
|   ownerInstance.callMethod('updateTouchingStatus', { | 
|     status: false | 
|   }) | 
| } | 
|   | 
| module.exports = { | 
|   itemDataObserver: itemDataObserver, | 
|   currentIndexObserver: currentIndexObserver, | 
|   containerDataObserver: containerDataObserver, | 
|   touchStart: touchStart, | 
|   touchMove: touchMove, | 
|   touchEnd: touchEnd | 
| } |