2012-06-21 8 views
22

Zbudowałem webapp i dla odrobiny języka, chciałem dodać mousedown i mouseup handler do zamiany obrazów (w tym przypadku, aby przycisk wyglądał jakby był naciśnięty).Korzystanie z zdarzenia mousedown na urządzeniach mobilnych bez aplikacji jQuery mobile?

mój kod jest coś takiego:

window.onload = function() { 
    //preload mouse down image here via Image() 
    $("#button_img").mousedown(function(){$("#button_img").attr("src","button_on.png");}); 
    $("#button_img").mouseup(function(){$("#button_img").attr("src","button_off.png")}); 
} 

Działa maśle na pulpicie, ale na telefon (testowanie w iOS Safari), MouseDown i mouseUp wydarzenia toczyły się w tym samym czasie, tak skutecznie, nic się nie dzieje .

Próbowałem użyć vmousedown i vmouseup wydarzeń w jQueryMobile, jednak ten kod:

//include jquerymobile.js and jquerymobile.css 
window.onload = function() { 
    //preload mouse down image here via Image() 
    $("#button_img").vmousedown(function(){$("#button_img").attr("src","button_on.png");}); 
    $("#button_img").vmouseup(function(){$("#button_img").attr("src","button_off.png")}); 
} 

prostu dał mi błędy, które vmousedown i vmouseup nie istnieją. Ponadto jQueryMobile przesłania kod CSS, który już napisałem dla tej strony.

Czy istnieje sposób na uzyskanie vmousedown i vmouseup do pracy, a do tego bez CSS jQuery Mobile?

góry dzięki
-Esa

+0

Hej budy! Masz odpowiedź poniżej i to wszystko w porządku. Ale spójrz, po prostu na uwagę: używanie obrazu na przyciskach nie jest najlepszym doświadczeniem użytkownika, spróbuj użyć tylko css. Możesz znaleźć ładne style na http://getbootstrap.com/components i wiele innych frameworków, a nawet stworzyć własny styl. Spróbuj! spodoba ci się –

+1

@Guilherme: Tak, jak wiesz, istnieją uzasadnione powody używania obrazów na przyciskach. W moim przypadku symuluję fizyczny przełącznik Rocker za pomocą SVG, co byłoby niemożliwe do zrobienia przy użyciu tylko CSS. Ale nie manipuluję bezpośrednio stylem przycisku. Wszystko, co robię, to dodawanie i usuwanie nazwy klasy. – user128216

+0

Nice: Obraz D nie jest zły, ale nie zawsze jest najlepszą opcją. W tym przypadku, nawet jeśli jest to możliwe, użyłbym również obrazu. –

Odpowiedz

44

Szukacie touchstart i touchend. Są to zdarzenia, które próbują naśladować przez vmousedown i vmouseup.

Oto przykład:

window.onload = function() { 
    //preload mouse down image here via Image() 
    $("#button_img").bind('touchstart', function(){ 
     $("#button_img").attr("src","button_on.png"); 
    }).bind('touchend', function(){ 
     $("#button_img").attr("src","button_off.png"); 
    }); 
} 

to będzie działać bez ram na dowolnym urządzeniu obsługującym zdarzenia dotykowe. Aby wykonać ten test, możesz użyć czegoś takiego, jak Modernizr, a jeśli urządzenie nie obsługuje zdarzeń dotyku, połącz je ze zwykłymi zdarzeniami pulpitu.

Podczas korzystania touchstart/touchend/touchmove masz jakieś ciekawe informacje, na przykład, jak wiele detali występują jednocześnie, dzięki czemu można wykryć, czy użytkownik jest przewijanie lub usiłowania, aby powiększyć.

UPDATE

Ponieważ obiekt wewnątrz obsługi zdarzeń event różni zdarzeń dotykowych i zdarzenia myszy, jeśli chcesz poznać współrzędne przypadku obu kierunkach, można zrobić coś takiego (przykład poniżej zakłada modernizr został załadowany):

//determine which events to use 
var startEventType = 'mousedown', 
    endEventType = 'mouseup'; 

if (Modernizr.touch === true) { 
    startEventType = 'touchstart'; 
    endEventType = 'touchend'; 
} 

//bind to determined event(s) 
$("#button_img").bind(startEventType, function(event) { 

    //determine where to look for pageX by the event type 
    var pageX = (startEventType === 'mousedown') 
       ? event.pageX 
       : event.originalEvent.touches[0].pageX; 

    ... 
})... 

UPDATE

szukałem tego nad i wydaje się, że nie ma potrzeby, aby wykryć typ zdarzenia przed wiążące obsługi zdarzeń:

//bind to determined event(s) 
$("#button_img").bind('mousedown touchstart', function(event) { 

    //determine where to look for pageX by the event type 
    var pageX = (event.type.toLowerCase() === 'mousedown') 
       ? event.pageX 
       : event.originalEvent.touches[0].pageX; 

    ... 
})... 

Jeśli martwisz się o otrzymaniu obu wydarzeń w krótkim odstępie czasu można użyć timeout udusić obsługi zdarzeń:

//create timer 
var timer = null; 

//bind to determined event(s) 
$("#button_img").bind('mousedown touchstart', function(event) { 

    //clear timer 
    clearTimeout(timer); 

    //set timer 
    timer = setTimeout(function() { 

     //determine where to look for pageX by the event type 
     var pageX = (event.type.toLowerCase() === 'mousedown') 
        ? event.pageX 
        : event.originalEvent.touches[0].pageX; 

     ... 

    }, 50); 
})... 

Uwaga: można wymusić mousedown i touchstart wydarzeń w krótkim odstępie czasu z narzędzi programistycznych, ale nie jestem pewien co do przypadków użycia świata rzeczywistego tutaj.

+0

Awesome, działa idealnie, dzięki. – Esaevian

+0

Chociaż wydaje się, że to odpowiada specyficznemu przypadkowi użycia OP, ta odpowiedź nie odpowiada na pytanie, ponieważ została postawiona i jest niedokładna. Vmousedown i vmouseup nie tylko "próbują naśladować" touchstart i touchend. Usuwają również wszystkie różnice między zdarzeniami dotykowymi a zdarzeniami myszy, dzięki czemu można używać vmousedown i vmouseup, tak jak przy użyciu mouseup i mousedown. Jeśli używasz touchstart i touchend, ogólnie rzecz biorąc, wiele rzeczy może wymagać zmiany i musisz również zduplikować kod dla dwóch rodzajów zdarzeń. – matteo

+0

Pytanie pozostaje więc bez odpowiedzi: jak skorzystać z vmouseup i vmousedown bez korzystania z całej struktury jquerymobile. – matteo

3

Jest na to sposób, aby uzyskać vmouseup, vmousedown, vmousemove, vclick itp funkcjonalności jQueryMobile bez uzyskiwania całą resztę (zwłaszcza skutki uboczne) o jquerymobile (tj akcesoriów, dodatkową css, itp)

  • idź do http://jquerymobile.com/download-builder/ (narzędzie do pobierania niestandardowego kompilacji jquerymobile tylko potrzebne komponenty)
  • wybrać tylko „wirtualne Mouse (vmouse) Wiązania”
  • go pobrać.

Pobranie będzie zawierać tylko pojedyncze pliki .js (zarówno zminimalizowane i wersja bez kompresji). Bez css.

link ten skrypt w głowie swojej html po zwykłego jquery i używać go tak:

<head> 
    <script src="http://code.jquery.com/ui/1.10.4/jquery-ui.min.js"></script> 
    <script src="whatever/path/jquery.mobile.custom.min.js"></script> 
    <script> 
    $(function(){ // or replace this with window.onload for that matter 
     // Your code here, e.g. 
     $("#button_img").on("vmousedown", function() { 
     /*whatever*/ 
     }); 
     // CAUTION: this won't work (see note below): 
     // $("#button_img").vmousedown(function(){/*whatever*/}); // WON'T WORK 
    }); 
    </script> 
</head> 

UWAGA: metody .vmousedown(), .vmouseup(), itd. Nie będą działać. Musisz powiązać detektor zdarzeń z .on("vmousedown", ...). Nie wiem dlaczego: Myślę, że dzieje się tak dlatego, że część jquerymobile, która tworzy metody skrótów o tej samej nazwie co zdarzenia, znajduje się w innym module. Być może jest możliwe, aby dowiedzieć się, który moduł jest i dołącz go do pobrania, ale myślę, że to zmusiłoby Cię do włączenia innych niepożądanych zależności.

+1

'vmouse' zdarzenia są niestandardowymi zdarzeniami, a nie metodami, dlatego musisz powiązać' .on() 'unbind' .off() 'je. – Omar

+1

Awesome, działa świetnie i nie zmusza mnie do używania interfejsu jQuery ani pełnej biblioteki jQuery Mobile. – PaulBGD

+1

Doskonałe, dokładnie to, po czym byłem, nie potrzebuję mobilnego CSS Jquery ani innych rzeczy, a wyświetlany komunikat ładowania był obciążający. Wielkie dzięki =) – Partack

4

Czy rozważałeś stylizację swoich przycisków za pomocą CSS? Stan :active zostanie wyzwolony, gdy użytkownik kliknie/dotknie elementu. Oto przykład:

/* Default state */ 
#button_img { 
    background-image: url('button_off.png'); 
} 

/* Clicked/touched state */ 
#button_img:active { 
    background-image: url('button_on.png'); 
} 

CSS będzie znacznie bardziej wydajnych i będzie również w stanie lepiej odrębnych obawy (wyświetlacz vs logiki, etc).

JSBin: http://jsbin.com/beyin/1/

+1

Nie wiem, dlaczego ta odpowiedź została odrzucona, jest rzeczywiście i zgadzam się, że nie o to prosił starter, ale biorąc pod uwagę fakt, że sama prośba dotyczy wymiany obrazów (a także, aby być sprawiedliwym, z rodzaju prośby nie zdaje sobie sprawy z kilku pojęć) Całkowicie popieram tę odpowiedź. Chcę również dodać, że JS jest wyjątkowo wykorzystywany do zadań, które są w pełni uprawnione do CSS. To zachowanie powinno zostać całkowicie wyeliminowane i zachęcam ludzi do używania CSS do renderowania (który jest również szybszy) i pozostawienie JS do zrobienia tego, na co się składa: być kontrolerem. – MacK

+3

I przegłosowałem odpowiedź, ponieważ nie ma nic wspólnego z odpowiedzią na pytanie, które dotyczy bardzo specyficznego problemu ze zdarzeniem vmouse, a ta odpowiedź sugeruje, że nawet nie używa zdarzeń. Może to być rozwiązanie dla konkretnego przykładu podanego w pytaniu, ale nie odnosi się do pytania i nie ma zastosowania do przypadku użycia, w którym zdarzenie jest potrzebne. Właściwym miejscem na taką sugestię byłaby KOMENTARZ do pytania. Gdyby to był komentarz, nawet bym go przegłosował. Ile wiedzy pokazuje OP nie ma znaczenia; odpowiedzi są dla wszystkich, nie tylko dla PO. – matteo

+1

@matteo OP mówi w pierwszym zdaniu "dla odrobiny połysku, chciałem ... zamienić obrazy (w tym przypadku, aby przycisk wyglądał tak, jakby był naciskany)." Pytają, jak to zrobić, ale już rozpoczęły pewną ścieżkę za pomocą jQuery. Ta ścieżka nie jest idealnym sposobem na "sprawienie, by przycisk wyglądał tak, jakby został naciśnięty". OP może nadal iść z ich rozwiązaniem jQuery, ale CSS jest "właściwą" drogą do tego. Ta odpowiedź nie jest komentarzem, nawet jeśli nie kończy się zaakceptowaną odpowiedzią. – pseudosavant

Powiązane problemy