Responsiv design
Børre Stenseth

Begivenheter

Hva

Det er en del komplikasjoner med å handtere begivenheter i responsive design. Vi skal sette fokus på "klikk" og "drag".

Et vanlig klikk er uproblematisk og vi trenger ikke ta spesielle forholdsregler for at dette skal fungere. En touch-skjerm simulerer, eller emulerer, en "tap" som et museklikk. Det vi imidlertid må være klar over er at det er mange begivenheter involverte nå vi klikker på en touch-skjerm. I rekkefølge er det slik:

  1. touchstart
  2. touchmove
  3. touchend
  4. mouseover
  5. mousemove
  6. mousedown
  7. mouseup
  8. click

Det betyr f.eks. at dersom vi er interesserte i å starte en drag-operasjon på en touch-skjerm så må vi plukke opp touchstart, og ikke de andre begivenhetene. Nøkkelen til dette er event-funksjonen preventDefault(). Det er en god leveregel å kalle denne i behandlingen av touch-events.

Enkel drag

Med mus

Dersom vi skal dragge et element vil kanskje gjøre noe slikt:
mousedrag1.html https://borres.hiof.no/respons/events1/mousedrag1.html

_mousedrag1.js

Merk at vi kopler mousemove og mouseup til document, ikke til det elementet vi dragger.

Med fingeren

Dersom vi skal dragge et element vil kanskje gjøre noe slikt:
fingerdrag1.html https://borres.hiof.no/respons/events1/fingerdrag1.html

_fingerdrag1.js

Merk at vi kopler mousemove og mouseup til det elementet vi dragger, og vi kaller preventDefault() når vi har behandlet et touch-event. Merk dessuten at vi bruker changedTouches[o] når vi skal ha tak i en bestemt begivenhet. Det betyr at vi skal ha tak i den første finger-touch begivenheten. Vi kan ha flere, bruke begge fingrene. Dette gjelder både touchstart og andre touch-events.

Kodestrategi

Eksemplene over er svært enkle. Dragging innebærer oftest mer en å flytte på et enkelt absolutt-posisjonert element. Vi vil kanskje kunne flytte på mange elementer, vi vil kontrollere hvor de havner og vi vil kanskje justere posisjonen i forhold til andre elementer i nærheten. Tenk deg at du vil flytte spillkort fra en kortsokk og legge dem pent ved siden av hverandre hos ulike spillere.

Jeg har god erfaring med å lage et objekt (ikk en klasse) som tar seg av dragging. For musehandtering kan en slik klasse se omtrent slik ut;

_mousedrag.js

Jeg påstår ikke at det er iddellt, men "it works for me". Nå kan jeg lage et tilsvarende objekt for touch-handtering

_touchdrag.js

Det er et problem: Jeg har ingen enkel og sikker måte å avgjøre om jeg skal forholde meg til en touch-skjerm., altså vilken av de to objektene jeg skal kople til. Det er i hvert fall tre måter å angripe dette problemet på:

  • Størrelsen på skjermmen kan hjelpe meg til å velge vilken dragstrategi (objekt) jeg skal bruke. Det er rimelig greitt å identifisere mobiler og små pad'er, men det er en foranderlig verden og det er vanskelig å ta en sikker beslutning.
  • Jeg kan lage en test på den måten at når brukeren åpner siden er hen tvunget til å klikke på et eller annet for å komme videre. Dette, et eller annet, kan settes til å reagere på både touchstart og mousedown. Siden rekkefølgen events behandles i er gitt, kan jeg lett finne ut om det er touch-skjerm og jeg kan justere koden (velge dragobjekt) deretter.
  • Jeg kan lage et objekt som er mottagelig både for musebegivenheter og touch.

Den første strategien vil etterlate en viss usikkerhet om vi har fått med oss alle aktuelle dimensjonene, mens de to andre vil fungere. Den andre strategien, der vi så og si indirekte tvinger brukeren til å identifisere skjermen sin, kan av og til være litt kunstig og det greieste er trolig å vedlikeholde og tilpasse et drag-obekt som tar seg av alle aktuelle begivenheter. Du finner et eksemple på bruk i eksempel1 , og du kan jo se på Likhet.

[1]
Referanser
  1. Introduction to Touch events in JavaScript JavaScript Kit www.javascriptkit.com/javatutors/touchevents.shtml 03-09-2016