2013-03-21 13 views
6

Próbuję wyłączyć przewijanie w pionie w iOS przy użyciu pliku Hammer.js (wersja jQuery) na przewijanej poziomo liście. Próbowałem tego:Jak wyłączyć przewijanie w pionie w iOS przy użyciu pliku Hammer.js?

$(document).hammer().on('swipe,drag', 'body', 
    function(event) 
    { 
     if (event.direction == Hammer.DIRECTION_UP || event.direction == Hammer.DIRECTION_DOWN) 
     { 
      event.preventDefault(); 
     } 
    } 
); 

Ale to nie działa. Jak więc wyłączyć przewijanie w pionie, nadal będąc w stanie przewijać w poziomie?

+0

Czy kiedykolwiek próbowałeś zaktualizowanej odpowiedzi? –

Odpowiedz

11

Zrobiłem to za pomocą event.gesture.preventDefault:

$('#horizontalCarousel').hammer({ drag_lock_to_axis: true }).on("swipe drag", function(event) { 
     event.gesture.preventDefault(); 
     if(event.type == "swipe"){ 
      swipeAction(event); 
     } else { 
      dragAction(event); 
     } 
}); 

Oto podane documentation

[EDIT]

Moja odpowiedź była tylko po to, aby poinformować cię, że używasz niewłaściwego zdarzenia.preventDefault(). W rzeczywistości użyłeś także niewłaściwej składni do sprawdzenia kierunku zdarzenia. Powinieneś być w stanie zarządzać go w ten sposób, choć nie testowałem go:

$(document).hammer({ drag_lock_to_axis: true }).on("swipe drag", function(event) { 
      if (event.gesture.direction == Hammer.DIRECTION_UP || event.gesture.direction == Hammer.DIRECTION_DOWN){ 
       event.gesture.preventDefault(); 
      } 
    }); 

2 rzeczy są zmieniane: event.gesture.direction i event.gesture.preventDefault(); Event.direction był sposobem, aby zrobić to na starszych wersjach młota js.

Uwaga: jeśli chcesz zrobić coś za pomocą zdarzenia machnięcia, na przykład: przeskocz większą ilość w poziomie podczas przesuwania, możesz połączyć moje odpowiedzi.

+0

Witaj Bart. Dzięki za odpowiedź. W końcu udało mi się to wypróbować, ale to całkowicie wyłącza przewijanie, co już udało mi się zrobić (potrzebowałem tego, gdy nie ma żadnych przedmiotów poza ekranem). Muszę po prostu wyłączyć przewijanie tylko w pionie. – OMA

+0

Dlaczego nie po prostu upewnij się, że div nie jest przewijany z css? (overflow-y: hidden;).Nadal można przewijać div, korzystając z event.gesture.deltaY, aby poznać ruchy gestu. –

+0

@OMA Zaktualizowałem odpowiedź, powinna teraz działać. –

-2

Młot (document.body, {prevent_defaults: true});

+1

Czy to nie wystarczy wyłączyć wszystkie zdarzenia? (nawet stuknij zdarzenia). A co z wyłączaniem przewijania tylko w pionie? – OMA

1

sprawdź na tej stronie:

https://github.com/EightMedia/hammer.js/wiki/Event-delegation-and-how-to-stopPropagation---preventDefaults#evgesturestoppropagation

Spróbuj to zakładając, że $ jest jQuery i używasz wersji jQuery z hammer.js

$('body').hammer().on('touch', function(ev){ 
     var $t = $(ev.target); //let's you know the exact element you touched. 
     if(ev.gesture.direction === 'left' || ev.gesture.direction ==='right'){ 

     } else { 
      ev.gesture.preventDefault(); 
     } 
}); 
+0

Problem polega na tym, że przewijanie w pionie czasami zaczyna się na boki ... a przeglądarka czasami przejmuje kontrolę na zawsze, gdy myśli, że przewijasz. –

+0

Muszę powiedzieć, że często, gdy pionowo przewijasz kierunek przewijania, przewijanie zostaje zablokowane tylko do przewijania w pionie. Utrudnia to moim zdaniem użyteczność. –

+0

Dziękuję za odpowiedź. Niestety, to nie działa, aby wyłączyć przewijanie pionowe w moich testach. – OMA

1

Można użyć drag_block_vertical opcję wyłącz przewijanie pionowe:

$(document).hammer({drag_block_vertical: true}).on('swipe,drag', 'body', function(event){ 
    // etc 
}); 

Nazywasz go również elementem body, który zawsze powinien istnieć. Z tego powodu, prawdopodobnie można uprościć do:

$('body').hammer({drag_block_vertical: true}).on('swipe,drag', function(event){ 
    // etc 
}); 
+1

Cześć, dziękuję za odpowiedź, ale to nie działa, aby wyłączyć przewijanie pionowe w moich testach. Próbowałem dodać event.preventDefault() wewnątrz, ale nadal to nie pomaga. – OMA

Powiązane problemy