2012-03-19 18 views
5

Im sử dụng plugin jQuery Touchwipe: http://www.netcu.de/jquery-touchwipe-iphone-ipad-libraryjQuery Touchwipe - vô hiệu hóa mặc định di chuyển cho 1 trục chỉ

Với preventDefaultEvents: đúng có thể của nó để dissable mặc định kéo behavour trên iPhone. Tuy nhiên những gì tôi cần là để dissable hành vi mặc định trong 1 trục chỉ. Tôi cần người dùng có thể kéo để cuộn lên và xuống, nhưng việc kéo từ trái sang phải cần được tắt và chức năng của tôi sẽ kích hoạt. Cảm ơn

Trả lời

12

Tôi đã có nhu cầu tương tự và mở rộng plugin touchwipe để chuyển sự kiện cho các cuộc gọi lại wipeLeft, wipeRight, wipeUp và wipeDown. Điều đó cho phép tôi đặt preventDefaultEvents: false trong cấu hình và sau đó trong các cuộc gọi lại cụ thể của tôi nếu cần, hãy làm điều đầu tiên: e.preventDefault();.

Tôi đã gửi sửa đổi cho tác giả plugin.

Plugin chỉnh sửa:

(function($) { 
$.fn.touchwipe = function(settings) { 
    var config = { 
      min_move_x: 20, 
      min_move_y: 20, 
      wipeLeft: function(e) { }, 
      wipeRight: function(e) { }, 
      wipeUp: function(e) { }, 
      wipeDown: function(e) { }, 
      preventDefaultEvents: true 
    }; 

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

    this.each(function() { 
     var startX; 
     var startY; 
     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 y = e.touches[0].pageY; 
       var dx = startX - x; 
       var dy = startY - y; 
       if(Math.abs(dx) >= config.min_move_x) { 
        cancelTouch(); 
        if(dx > 0) { 
         config.wipeLeft(e); 
        } 
        else { 
         config.wipeRight(e); 
        } 
       } 
       else if(Math.abs(dy) >= config.min_move_y) { 
         cancelTouch(); 
         if(dy > 0) { 
          config.wipeDown(e); 
         } 
         else { 
          config.wipeUp(e); 
         } 
        } 
      } 
     } 

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

    return this; 
}; 

})(jQuery); 
+0

Đó là hoàn hảo, cảm ơn rất nhiều! – felixthehat

+2

Tôi đã thử điều này nhưng khi kéo sang trái/phải, màn hình vẫn kéo, e.preventDefault() không hoạt động đầy đủ hoặc được gọi là quá muộn hoặc một cái gì đó. Tôi đã thử nghiệm trên trình mô phỏng ... nó có khác trên điện thoại thực tế không? – Huangism

+1

Huangism: các chức năng lau cần phải có sự kiện như attr, chẳng hạn như 'wipeLeft: function (e) {...}' sau đó gọi 'e.preventDafult();' là điều đầu tiên. –

Các vấn đề liên quan