1

我正在为 iPad 上的杂志制作广告,该杂志的时间线很长,需要由水平滚动条控制。滚动条必须是自定义的,而我能找到的适用于 iPad 的最佳自定义滚动插件是 fleXcroll。

我的问题是我试图禁用用户滑动滚动时间轴的能力。它需要由滚动条专门控制(因为用户的滑动应该将他们带到杂志的下一页。)

过去两天我一直在研究这个问题,目前我能解决的最接近的方法是控制 div 的触摸事件。当我在 div 上将 event.preventDefault() 用于 touchstart 和 touchmove 时,它​​可以部分工作。如果屏幕没有移动,滑动不会移动时间线。但是,在使用滚动条之后,如果时间线仍在移动(iPad 在滑动物体时有一种缓动,因此移动的东西在停止之前会变慢),您可以抓住时间线并通过滑动来移动它。此外,如果您用手指慢慢让滚动条停止移动,直到它停止,您就可以再次滑动时间线。

因此,问题在于阻止用户在 iPad 的杂志广告中将某个 div 滑动到一侧。滚动只能由滚动条控制。

任何帮助是极大的赞赏!谢谢!

4

1 回答 1

3

您可以注册 JS 来观察滑动事件,然后只是“忽略”它们并防止它们进一步向上传播。这样的事情可能会有所帮助:

(function($) {
    $.fn.touchwipe = function(settings) {
       var config = {
           min_move_x: 20,
           wipeLeft: function() { alert("left"); },
           wipeRight: function() { alert("right"); },
           preventDefaultEvents: true
    };

    if (settings) {
       $.extend(config, settings);
    }

    this.each(function() {
       var startX;
       var isMoving = false;

       function cancelTouch() {
         this.removeEventListener('touchmove', onTouchMove);
         startX = null;
         isMoving = false;
       }

       function onTouchMove(e) {
         if(config.preventDefaultEvents) {
          e.preventDefault();
         }
         if(isMoving) {
            var x = e.touches[0].pageX;
            var dx = startX - x;
            if(Math.abs(dx) >= config.min_move_x) {
              cancelTouch();
            if(dx > 0) {
               config.wipeLeft();
            }
            else {
               config.wipeRight();
            }
       }
     }
   }

   function onTouchStart(e)
   {
     if (e.touches.length == 1) {
       startX = e.touches[0].pageX;
       isMoving = true;
       this.addEventListener('touchmove', onTouchMove, false);
     }
   }
 this.addEventListener('touchstart', onTouchStart, false);
 });

 return this;
  };

})(jQuery);
于 2012-04-25T15:21:20.183 回答