2012-02-22 40 views
15

Jako że touchstart/touchend nie jest jeszcze obsługiwany w większości przeglądarek komputerowych. Jak mogę utworzyć zdarzenie touchstart, które będzie takie samo jak zdarzenie mousedown (obsługiwane we wszystkich przeglądarkach).jquery touchstart w przeglądarce

chcę coś takiego

$('obj').bind('touchstart', function(e){ 
}); 

będą tłumaczone na język

$('obj').bind('mousedown', function(e){ 
}) 

Odpowiedz

24

Można powiązać oba naraz ...

$('obj').bind('touchstart mousedown', function(e){ 
}); 

Jeśli chcesz mousedown zdarzenia ogień touchstart zdarzeń automatycznie (musisz tylko związać touchstart) używać ...

$(document).bind('mousedown', function(event) { 
    $(event.target).trigger('touchstart'); 
}); 

Zauważ, że oznacza to mousedown zdarzenia musi propagować na document przed zwyczaju touchstart zdarzenie może zostać uruchomiony. Może to mieć nieoczekiwane skutki uboczne.

+3

Rozwiązania te mogą okazać się nieco problematyczne, jeśli w pewnym momencie oba zdarzenia będą wspierane przez ja urządzenie. – epeleg

+0

@epeleg Zdecydowanie. W takim przypadku będziesz miał kod "jak ontouchstart" w dokumencie "lub podobnym, a następnie wybierz odpowiednio nazwę swojego wydarzenia. – alex

+0

Być może coś takiego jak "if (Modernizr.touchstart) {}" byłoby odpowiednie? – philtune

7

Spróbuj czegoś takiego:

var clickEventType = ((document.ontouchstart!==null)?'click':'touchstart'); 

$('obj').bind(clickEventType, function(e){}); 

Jeszcze lepiej użyć .on() do wiązania:

$('body').on(clickEventType, 'obj', function(e){}); 

Dokument ten sprawdza, czy touchstart istnieje, jeżeli tak, to wydarzenie jest "touchstart", jeśli tak nie jest (większość przeglądarek na komputerze), a następnie "kliknięcie".

Można również wywołać za pomocą tego samego typu zdarzenia:

$('obj').trigger(clickEventType); 
+0

Ja również Gist-ified to, więc możesz po prostu skopiować i wkleić całość: https://gist.github.com/esteinborn/9398782 –

1

To nie jest najładniejszy rozwiązanie, ale najlepsze znalazłem do tej pory. Upadek? To działa tylko po raz pierwszy dotyk stało, więc nie można używać synchronicznie :(

var isTouch = false; 
$('body').on('touchstart', function() { 
    isTouch = true; 
}); 

Można również sprawdzić, czy pierwszy dotykowy wsparcie przeglądarka z modernizr np.

Pamiętaj, aby nie używać go w zakresie globalnym (chyba że musisz). Możesz również zmienić go tak, aby był "podobny", dodając klasę urządzenia is-touch do znacznika Html, dodając po isTouch = true kod: $('html').addClass('is-touch-device'). W tym przypadku możesz odwoływać się do niego z dowolnego miejsca (również z css)

Powiązane problemy