renderjs.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // 使用renderjs直接操作window对象,实现动态控制app和h5的bounce
  2. // bounce: iOS橡皮筋,Android半月弧,h5浏览器下拉背景等效果 (下拉刷新时禁止)
  3. // https://uniapp.dcloud.io/frame?id=renderjs
  4. // 与wxs的me实例一致
  5. var me = {}
  6. // 初始化window对象的touch事件 (仅初始化一次)
  7. if(window && !window.$mescrollRenderInit){
  8. window.$mescrollRenderInit = true
  9. window.addEventListener('touchstart', function(e){
  10. if (me.disabled()) return;
  11. me.startPoint = me.getPoint(e); // 记录起点
  12. }, {passive: true})
  13. window.addEventListener('touchmove', function(e){
  14. if (me.disabled()) return;
  15. if (me.getScrollTop() > 0) return; // 需在顶部下拉,才禁止bounce
  16. var curPoint = me.getPoint(e); // 当前点
  17. var moveY = curPoint.y - me.startPoint.y; // 和起点比,移动的距离,大于0向下拉,小于0向上拉
  18. // 向下拉
  19. if (moveY > 0) {
  20. // 可下拉的条件
  21. if (!me.isDownScrolling && !me.optDown.isLock && (!me.isUpScrolling || (me.isUpScrolling && me.isUpBoth))) {
  22. // 只有touch在mescroll的view上面,才禁止bounce
  23. var el = e.target;
  24. var isMescrollTouch = false;
  25. while (el && el.tagName && el.tagName !== 'UNI-PAGE-BODY' && el.tagName != "BODY") {
  26. var cls = el.classList;
  27. if (cls && cls.contains('mescroll-render-touch')) {
  28. isMescrollTouch = true
  29. break;
  30. }
  31. el = el.parentNode; // 继续检查其父元素
  32. }
  33. // 禁止bounce (不会对swiper和iOS侧滑返回造成影响)
  34. if (isMescrollTouch && e.cancelable && !e.defaultPrevented) e.preventDefault();
  35. }
  36. }
  37. }, {passive: false})
  38. }
  39. /* 获取滚动条的位置 */
  40. me.getScrollTop = function() {
  41. return me.scrollTop || 0
  42. }
  43. /* 是否禁用下拉刷新 */
  44. me.disabled = function(){
  45. return !me.optDown || !me.optDown.use || me.optDown.native
  46. }
  47. /* 根据点击滑动事件获取第一个手指的坐标 */
  48. me.getPoint = function(e) {
  49. if (!e) {
  50. return {x: 0,y: 0}
  51. }
  52. if (e.touches && e.touches[0]) {
  53. return {x: e.touches[0].pageX,y: e.touches[0].pageY}
  54. } else if (e.changedTouches && e.changedTouches[0]) {
  55. return {x: e.changedTouches[0].pageX,y: e.changedTouches[0].pageY}
  56. } else {
  57. return {x: e.clientX,y: e.clientY}
  58. }
  59. }
  60. /**
  61. * 监听逻辑层数据的变化 (实时更新数据)
  62. */
  63. function propObserver(wxsProp) {
  64. me.optDown = wxsProp.optDown
  65. me.scrollTop = wxsProp.scrollTop
  66. me.isDownScrolling = wxsProp.isDownScrolling
  67. me.isUpScrolling = wxsProp.isUpScrolling
  68. me.isUpBoth = wxsProp.isUpBoth
  69. }
  70. /* 导出模块 */
  71. const renderBiz = {
  72. data() {
  73. return {
  74. propObserver: propObserver,
  75. }
  76. }
  77. }
  78. export default renderBiz;