2013-09-27 145 views
7

Tôi đang sử dụng plugin jquery-mousewheel để kích hoạt chức năng.Tách và gắn lại trình nghe sự kiện mousewheel không đặt lại quán tính cuộn

Khi tôi gọi di chuyển Tôi tách người nghe và chờ cho đến khi hoạt ảnh hoàn tất, sau đó tôi đính kèm lại người nghe.

Vấn đề là khi tôi đính kèm lại, plugin mousewheel vẫn đang nghe quán tính của một số chuột/bàn di chuột và gọi liên tục di chuyển.

Tôi đoán việc lên tiếng hoặc điều chỉnh cuộc gọi hàm không phải là giải pháp tốt trong trường hợp cụ thể của tôi, vì quán tính vẫn còn đó và tôi cũng muốn người nghe được đính kèm ngay cho các cuộc gọi di chuyển khác có thể.

Có cách nào để "tiêu diệt quán tính" bằng cách đặt lại hoàn toàn sự kiện con lăn chuột, thay vì chỉ tách nó?

$(document).ready(function() { 

    var tween; 
    var slide = $('#slide'); 

    function bodyListen() { 
     $('body').on('mousewheel.bodyscroll', 
     function (e, delta, deltaX, deltaY) { 
      e.preventDefault(); 
      $('body').off('mousewheel.bodyscroll'); 
      moveit(); 
     }); 
    } 

    function moveit() { 
     tween = TweenMax.to(slide, 0.8, { 
      marginLeft: 300, 
      onComplete: bodyListen 
     }); 
    } 

    bodyListen(); 
}); 
+0

Bạn có nhận được bất cứ đâu với điều này không? – iamdarrenhall

+0

@ dazhall tiếc là tôi đã phải thông qua một cách giải quyết, giống như tất cả mọi người làm. Tôi chỉ đơn giản là trì hoãn việc đính kèm lại của người nghe mousewheel :( – Luke

+0

Tại sao không chỉ thêm cờ toàn cầu thay vì tách trình xử lý sự kiện? Nếu cờ được bật, trình lắng nghe sẽ không làm gì cả. –

Trả lời

4

Sử dụng cờ khi đối phó với các sự kiện (hoặc bất kỳ thao tác liên quan đến DOM), beacuse sự kiện người nghe thường có thể hoạt động giống như chức năng asyncronous.

$(document).ready(function() { 

    var tween; 
    var slide = $('#slide'); 
    var flag = true; 

    function bodyListen() { 
     $('body').on('mousewheel.bodyscroll', 
     function (e, delta, deltaX, deltaY) { 
      if(flag){ 
       e.preventDefault(); 
       flag = false; 
       moveit(); 
      } 
     }); 
    } 

    function moveit() { 
     tween = TweenMax.to(slide, 0.8, { 
      marginLeft: 300, 
      onComplete: function(){ 
       flag = true; 
      } 
     }); 
    } 

    bodyListen(); 
}); 
0

Mặc dù tôi đã không cố gắng này bản thân mình, TweenMax có Kill Tweens ofKillAll cho phép bạn để giết một tween và tùy hoàn thành chúng trước khi bạn làm. có thể không phải những gì bạn muốn, bởi vì nó sẽ buộc các hình ảnh động để kết thúc nhưng nó giúp bạn trở lại trạng thái bạn muốn và chèn mã là đơn giản. Vào lúc bắt đầu của chức năng bodyListen

function bodyListen() { 
    if(tween) tween.killAll(true) 
    .....