7. html5 api

50
1. Drag and Drop 2. application cache 3. web storage 4. web worker 5. geolocation

Upload: -

Post on 11-Jul-2015

463 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: 7. html5 api

1. Drag and Drop

2. application cache

3. web storage

4. web worker

5. geolocation

Page 2: 7. html5 api

•1999년에이미마이크로소프트사의인터넷익스플로러에서에서구현했던기능.

•HTML5에서 API를이용하여구현하고있기때문에다른애플리케이션과데이터를주고받기쉬워졌고그만큼애플리케이션개발이쉬워졌다.

•페이지안에서콘텐츠이동, 페이지사이, 페이지와다른프로그램사이에도드래그가능

•드래그대상, 드롭대상, 이동할콘텐츠정보등필요

•웹환경에서는지금까지전용 API는제공되지않고유사구현을위해복잡한자바스크립트이벤트(mouse 관련이벤트를직접구현함)를다루어야했다

http://html5demos.com/drag

Page 3: 7. html5 api
Page 4: 7. html5 api

데이터유형

데이터유형을나타내는데임의로데이터유형을정의해서사용할수도있지만

MIME 문자열을이용할수도있다.

다른애플리케이션과데이터를주고받을수있다.

예) 메일에파일을첨부할때시스템에있는파일을손쉽게메일로드래그해서

첨부할수있다.

•text/plain 또는 text : 단순문자열

•text/uri-list : 사이트주소(URL). 주소가하나일경우간단하게 URL이라고쓰기도

한다.

•file : 다른애플리케이션에파일을드래그앤드롭할때사용한다.

Page 5: 7. html5 api

5Do it! HTML5+CSS3

IE의임시인터넷파일

한번접속했었던사이트의이미지,미디어복사본저장

애플리케이션캐시와비슷한개념

오프라인사용이불가능

Page 6: 7. html5 api

6Do it! HTML5+CSS3

웹에접속할수없는상황에서도애플리케이션실행되어야.

오프라인브라우징 : 오프라인상태에서도사용자가사이트를둘러볼수있다.

속도 : 캐시된리소스들이로컬에있기때문에좀더빠르게로딩할수있다.

서버로딩줄임 : 리소스변경이있을경우에만서버에서리소스를다운로드하면

된다.

<장점>

Page 7: 7. html5 api

애플리케이션캐시

manifest 파일

자바스크립트 UI

캐시해야할리소스를나열한텍스트파일

캐시한파일을실행하고업데이트할수있도록 프로그래밍된인터페이스

Page 8: 7. html5 api

8Do it! HTML5+CSS3

CACHE MANIFEST

# VERSION 10

NETWORK:

http://robertnyman.com/html5/offline/offline.html

CACHE:

offline.html

base.css

FALLBACK:

online.css offline.css

<manifest 파일>

Page 9: 7. html5 api

9Do it! HTML5+CSS3

CACHE MANIFEST

# VERSION 10

NETWORK:

http://robertnyman.com/html5/offline/offline.html

CACHE:

offline.html

base.css

FALLBACK:

online.css offline.css

<manifest 파일>

온라인일때액세스할파일

Page 10: 7. html5 api

10Do it! HTML5+CSS3

CACHE MANIFEST

# VERSION 10

NETWORK:

http://robertnyman.com/html5/offline/offline.html

CACHE:

offline.html

base.css

FALLBACK:

online.css offline.css

오프라인일때액세스할파일

<manifest 파일>

Page 11: 7. html5 api

11Do it! HTML5+CSS3

CACHE MANIFEST

# VERSION 10

NETWORK:

http://robertnyman.com/html5/offline/offline.html

CACHE:

offline.html

base.css

FALLBACK:

online.css offline.css

<manifest 파일>

지정한파일이없을경우사용할파일

Page 12: 7. html5 api

12Do it! HTML5+CSS3

<html manifest=“offline.manifest”>

• 애플리케이션캐시가만들어지면페이지가한번로딩된후로는리소스가자동으로

캐시에저장됨.

• manifest 파일이수정되었을경우에만서버로부터파일을가져옴.

• (IE 임시인터넷파일은사이트에접속할때마다임시인터넷파일을갱신함)

서버에서 MIME 타입을추가해야함

Page 13: 7. html5 api

13Do it! HTML5+CSS3

캐시자동업데이트

•manifest 파일을수정하면애플리케이션캐시를자동으로업데이트한다

•manifest 파일에는여러리소스파일이나열되어있는데리소스파일이

수정된것은 manifest 파일과는상관이없으므로리소스파일이

수정됐다고해서애플리케이션캐시가자동업데이트되지는않는다.

•이전버전과비교해봐서 manifest 파일의내용이달라진게없다면이

경우에도애플리케이션캐시는자동업데이트되지않는다.

•manifest 파일의수정날짜를바꾸는것역시도업데이트로취급하지

않는다.

•애플리케이션캐시를자동업데이트하려면반드시 manifest 파일의

내용을수정해야한다.

Page 14: 7. html5 api

http://robertnyman.com/html5/offline/offline.html

CACHE MANIFEST

# VERSION 10

CACHE:

offline.html

base.css

FALLBACK:

online.css offline.css

offline.manifest

.connectivity {

color: #fff;

background: green; padding:

10px;

}

.connectivity {

color: #fff;

background: red; padding: 30px;

}

online.css

offline.css

Page 15: 7. html5 api

http://robertnyman.com/html5/offline/offline.html

오프라인에서접속하면캐시에있는내용, 즉 manifest 파일에서지정한offline.css 파일의내용을읽어오게되어, 그안에서지정한대로주황색의가로줄을표시한다.

Page 16: 7. html5 api

“클라이언트에데이터를저장한다”

'키/ 값' 쌍으로데이터를저장하고키를기반으로데이터를조회한다.

영원히저장할수있는공간과임시로저장할수있는공간을따로두고있어서필요에맞게선택할수있다.

Page 17: 7. html5 api

17Do it! HTML5+CSS3

•같은사이트에서둘이상의탭을열면둘이상의트랜잭션을추적하기어렵다.

•보안문제를일으키기쉽다.

•하나의사이트에서저장할수있는최대쿠키수는 20 개이다. 그리고하나의

사이트에서저장할수있는최대쿠키크기는 4KB 로제한되어있다.

브라우저쿠키(cookie)의단점

Page 18: 7. html5 api

18Do it! HTML5+CSS3

•쿠키와마찬가지로웹스토리지의데이터들도웹사이트를서핑하고난후,

브라우저탭을닫고난후, 또는브라우저를빠져나오고난후에저장된다.

•쿠키와다른점은웹스토리지의데이터들은사용자가일부러보내지않는한웹

서버로전송되지않는다는것이다. (경량모바일에적당)

•텍스트뿐만아니라객체정보를저장할수있다.

•쿠키는만료일자가있지만웹스토리지의경우에는만료일자가없다.

•두가지스토리지모두도메인당 5MB 정도의데이터를저장할수있다.

Page 19: 7. html5 api

웹스토리지

세션스토리지

로컬스토리지

세션스토리지

세션동안의데이터를기억하고있다.

탭(또는창)을닫으면데이터가삭제된다.

seesionStorage라는객체를이용해저장하고검색한다.

로컬스토리지

세션이끝나도계속기억하고있다.

탭(또는창)을닫았다열어도데이터남아있다.

localStorage라는객체를이용해저장하고검색한다.

Page 20: 7. html5 api

http://caniuse.com

Page 21: 7. html5 api

sessionStorage.setItem(key, value);

저장

var item = sessionStorage.getItem(key);

검색

ex) sessionStorage.setItem(1, ‘이것은예제문장입니다’);

ex) var item=sessionStorage.getItem(1);

alert(item);

localStorage.setItem(key, value);

var item = localStorage.getItem(key);

Page 22: 7. html5 api

sessionStorage.removeItem(key);

삭제

sessionStroage.clear();

모두삭제

localStorage.removeItem(key);

localStroage.clear();

Page 23: 7. html5 api

속성 설명

storageArea 스토리지유형(세션인지 로컬인지) 표시

key 변경된키

oldValue 키의이전값

newValue 키의새로운값

url 키가변경된페이지의 URL

Page 24: 7. html5 api

<body>

<h2>세션스토리지(Session Storage)</h2>

<input type="text" name="" value="" id="first”>

<button onclick="javascript:savetheSession();">저장!</button>

<div id="displaysession">비어있음</div>

<h2>로컬스토리지(Local Storage)</h2>

<input type="text" name="" value="" id="second”>

<button onClick="jascript:savetheLocal();">저장!</button>

<div id="displaylocal">비어있음</div>

</div>

</body>

Page 25: 7. html5 api

function savetheSession(){

var first = document.getElementById("first");

var thevalue = first.value;

sessionStorage.setItem(1, thevalue);

gettheSession();

}

function gettheSession(){

var data;

var thediv = document.getElementById("displaysession");

data = sessionStorage.getItem(1);

if (data){

thediv.innerHTML = "저장된값: "+data;

}

}

Page 26: 7. html5 api

function savetheSession(){

var first = document.getElementById("first");

var thevalue = first.value;

sessionStorage.setItem(1, thevalue);

gettheSession();

}

function gettheSession(){

var data;

var thediv = document.getElementById("displaysession");

data = sessionStorage.getItem(1);

if (data){

thediv.innerHTML = "저장된값: "+data;

}

}

해당 id 요소가져오기

값가져오기

키 1에해당값저장하기

값가져와서화면에보여주는함수호출

key가 1인데이터의값가져오기

innerHTML을 이용해서문장에값보여주기

Page 27: 7. html5 api

function savetheLocal(){

var second = document.getElementById("second");

var thevalue = second.value;

localStorage.setItem(1, thevalue);

gettheLocal();

}

function gettheLocal(){

var data;

var thediv = document.getElementById("displaylocal");

data = localStorage.getItem(1);

if (data){

thediv.innerHTML = "저장된값:"+data;

}

}

Page 28: 7. html5 api

28Do it! HTML5+CSS3

window.onload = function(){

gettheSession(); //세션스토리지데이터가져오기

gettheLocal(); //로컬스토리지데이터가져오기

};

결과보기

Page 29: 7. html5 api

29Do it! HTML5+CSS3

기존웹페이지는단일쓰레드모드

오래걸리는스크립트를수행하면기다려야한다.

다른 UI 작업을할수없다.

But, 웹워커를사용하면

웹페이지에서도멀티쓰레드가능

오래걸리는쓰레드를실행하는동안, 백그라운드쓰레드에서스크립트실행

Page 30: 7. html5 api

http://caniuse.com

Page 31: 7. html5 api

31Do it! HTML5+CSS3

시간이오래걸리는작업이라면워커에게부탁해!

예) 복잡한수학적계산작업, 리소스에대한액세스작업

UI 쓰레드에방해를받지않고계속수행해야하는작업

Page 32: 7. html5 api

32Do it! HTML5+CSS3

①워커만들기

②워커에메시지보내기

③다른작업을함

③워커에서메시지받음

④워커실행

⑤실행이끝나면메시지보내기

…..

⑥워커로부터메시지받음

Page 33: 7. html5 api

웹워커를실행하지않은파일 웹워커를실행한파일

Page 34: 7. html5 api

<body>

<p>

<label for="worker-start-value">

<strong>Start value</strong>

</label><br>

<input type="text" id="worker-start-value" value="0">

</p>

<p>

<input id="start-worker" type="button" value="Start Worker">

<input id="stop-worker" type="button" value="Stop Worker">

</p>

<h3>Web Worker results:</h3>

<p id="worker-results"> (not started yet)</p>

</body>

Page 35: 7. html5 api

35Do it! HTML5+CSS3

웹워커는 Worker 객체를통해실행된다.

워커를만들려면워커쓰레드를실행할스크립트파일의경로지정

<script>

var worker;

function createWorker () {

worker = new Worker("worker.js");

}

Page 36: 7. html5 api

36Do it! HTML5+CSS3

워커에메시지를보낼때는 postMessage 메서드를호출

document.getElementById("start-worker").onclick = function ()

{

createWorker();

worker.postMessage(document.getElementById("worker-

start-value").value);

}

Page 37: 7. html5 api

37Do it! HTML5+CSS3

•워커에서 onmessage 이벤트핸들러로받는다.

•워커에서실행할파일(worker.js) 파일의맨처음에서

onmessage를이용해크리에이터에서보낸이벤트를받는다.

(worker.js 파일)

onmessage = function (event) {

var i=event.data;

for (n=1000001; i<n; i++) {

postMessage(i);

};

};

Page 38: 7. html5 api

38Do it! HTML5+CSS3

워커에서필요한작업을모두마치면워커에서크리에이터로

결과값을보내야한다.

postMessage 메서드를사용합니다.

(worker.js 파일)

onmessage = function (event) {

var i=event.data;

for (n=1000001; i<n; i++) {

postMessage(i);

};

};

Page 39: 7. html5 api

39Do it! HTML5+CSS3

크리에이터에서 onmessage 이벤트핸들러를사용한다.

worker.onmessage = function (event) {

document.getElementById("worker-results").innerHTML =

event.data;

};

Page 40: 7. html5 api

40Do it! HTML5+CSS3

워커에서런타임오류가발생하면 onerror 이벤트핸들러가호출된다.

worker.onerror = function (event) {

document.getElementById("worker-results").innerHTML = "An

error occurred";

};

Page 41: 7. html5 api

41Do it! HTML5+CSS3

워커를중간에종료하려면(“stop worker” 버튼을누르면) 워커의terminate 메서드를호출한다.

워커쓰레드는작업을종료하지않은상태에서멈춘다.

document.getElementById("stop-worker").onclick = function () {

if (worker) {

worker.terminate();

}};

Page 42: 7. html5 api

42Do it! HTML5+CSS3

현재위치에대한위도, 경도같은위치정보를얻을수있다.

HTML 5 는위치정보와관련한 Geolocation 스펙을포함하고있다(엄밀히 말하자면이스펙은 HTML Working Group 과분리되어있는 Geolocation Working Group에의해표준화가진행되고있다고한다)

Page 43: 7. html5 api

http://caniuse.com

그리고아래는 http://diveintohtml5.org/geolocation.html 에서발췌한브라우저지원현황이다아래표를보면아이폰이나안드로이드와같은모바일환경에서도Geolocation을지원한다고나와있다Geolocation 자체가장치의위치정보를이용하는것이기에모바일장치의지원은더자연스럽다(참고: 오페라 10.6 이후지원됨)

Page 44: 7. html5 api

위치정보는사용자동의가있어야한다웹응용프로그램이나의정보를이렇게쉽게얻어갈수있는것인가?

만일그렇다면굉장한사회적(?) 문제가될것이다따라서사용자의위치정보는반드시사용자의허가를받아서수집할수있도록되어있다

브라우저에서 Geolotion API를이용해서위치정보를액세스하려고하면,

아래보는바와같이사전동의를구하게된다.(파이어폭스 예)

만일동의를하지않게되면나의위치정보를웹응용프로그램이알수없게되는것이다

Page 45: 7. html5 api

45Do it! HTML5+CSS3

①지오로케이션서비스를사용할수있는브라우저인지체크

if (navigator.gelocation) {

/* 지오로케이션 API 소스작성 */

}

else {

alert("이브라우저에서는지오로케이션서비스를사용할수없습니다.");

}

②현재위치확인 – getCurrentPosition 메서드

③현재위치계속확인 – watchPosition 메서드

지오로케이션 API는 window.navigator 객체의자식객체인 geolocation 객체를통해실행된다.

Page 46: 7. html5 api

사용자의현재위치를알아내려면 getCurrentPoition 메서드호출.

if (navigator.geolocation) {

navigator.geolocation.getCurrentPosition(showPosition, onError);

navigator.geolocation.watchPosition(showPosition);

} else {

onError();

}

function showPosition(position) { .... }

function onError() { ... }

Page 47: 7. html5 api

사용자위치의변화를계속해서추적하려면 watchPosition 메서드이용

업데이트되는위치정보를일정하게호출하도록설정한다.

정확한값이반환되지않을경우오류호출.

var watchID =

navigator.geoloacation.watchPosition(function(position) {

do_something(position.coords.latitude,position.coords.longitude);

});

Page 48: 7. html5 api

48Do it! HTML5+CSS3

사용자위치설명 – position 객체이용

timestamp : 위치를가져온시간

coords : nsIDOMGeoPositionCoords 객체를이용해좌표표시

latitude 사용자위치의위도

longitude 사용자위치의경도

altitude 사용자위치의표고. 표고를지원하지않는장비에서는 0

accuracy 위치정보의오차

altitudeAccuracy 표고정보의오차. 표고를지원하지않는장비에서는 0

heading 사용자의진행방향

speed 사용자가움직이는속도. m/s로표시

nsIDOMGeoPositionCoords 객체의속성

address : 나라나시, 거리등주소를표시하는nsIDOMGeoPositionAddress

객체

Page 49: 7. html5 api

getCurrentPositio 메서드나 watchPosition 메서드를호출하는동안다음과같이오류콜백을실행할수있습니다.

function errorCallback(PositionError error);

필드 설명

code 다음의에러코드중하나

UNKNOWN_ERROR인터페이스에 있는 다른 오류 코드로는 정의할 수 없는 오류로

인해위치인식프로세스가실패했을때. (상수값 0)

PERMISSION_DENIED애플리케이션이 지오로케이션 API를 사용할 권한이 없어서 위

치인식프로세스가실패했을때. (상수값 1)

POSITION_UNAVAILABLE위치 인식 프로세스에 사용된 하나 이상의 위치 제공자가 내부

오류를유발하여프로세스가실패했을때. (상수값 2)

TIMEOUT새로운 Position 객체를 성공적으로 가져오기 전에 지정한 최대

시간이모드흘렀을때. (상수값 3)

message로그와 디버깅을 위해 사람이 읽을 수 있는 오류 메시지를 표시

함.

Page 50: 7. html5 api

<script type="text/javascript">

if (navigator.geolocation) {

navigator.geolocation.getCurrentPosition(function (position) {

alert("당신이 계신곳의위도는 " +position.coords.latitude + "이고,

경도는 " + position.coords.longitude + "입니다.");

});

}

</script>

http://slides.html5rocks.com/#geolocation