출처 : http://mylko72.maru.net/jquerylab/mobile/jquery.mobile.1.1.html?hn=6&sn=1
jQuery Mobile 개발을 위한 기본 사항
jQuery Mobile 라이브러리 참조
모든 jQuery Mobile 애플리케이션은 두개의 핵심 라이브러리와 jQuery 라이브러리를 참조해야 한다. 아래는 CDN 서비스를 이용해 자바스크립트 파일과 CSS 파일, jQuery 라이브러리를 참조하고 있다.
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" />
<script src="http://code.jquery.com/jquery-1.6.4.min.js">
<script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js">
HTML5의 data-* 속성
jQuery Mobile은 페이지의 각 요소가 어떤 역할을 하게 될지 결정하기 위해 data-* 속성을 활용한다. data-* 속성은 HTML5에 새로 추가된 것으로 로컬에 임의의 사용자정의 데이터를 저장하기 위한 표준 스펙이며 HTML 요소에 직접 데이터를 정의할 수 있어 태그와 데이터의 연관성을 주기 편리하다. 키/값 형태로 데이터를 정의할 수 있으며 다음과 같이 'data-' 접두어로 시작해서 키와 값을 이어서 지정한다.
data-keyname="value"
예를 들어 다음과 같이 사용자정의 데이터를 정의하고,
<li data-version="alpha3" data-url="http://jquerymobile.com">jQuery Mobile</li>
스크립트 영역에서 dataset 속성을 이용해 데이터에 접근할 수 있다.
<script type="text/javascript">
var framework = document.getElementsByTagName('li')[0];
framework.dataset["version"] //alpha3
framework.dataset["url"] //jquerymobile.com
</script>
jQuery Mobile은 UI의 영역과 역할을 data-role 속성으로 정의한다.
jQuery Mobile 페이지의 기본 레이아웃
page
모바일 브라우저에 표시되는 하나의 페이지(page)를 정의한다. jQuery Mobile 에서는 data-role="page"가 지정된 영역을 하나의 페이지로 간주한다. 즉, 이 page 영역 단위로 모바일 브라우저에 표시된다.
header
페이지의 Header 영역을 정의한다. 페이지 상단에 툴바 형태로 표현되며, 보통 헤더(<h1>)태그와 함께 사용한다. 역시 <div> 태그에 data-role="header" 속성을 지정한다.
content
실제 페이지의 콘텐츠를 기술하는 영역이다. <div> 태그에 data-role="content" 속성을 지정한다.
footer
페이지의 footer 영역을 지정한다. 페이지 하단에 툴바 형태로 표현되며 <div> 태그에 data-role="footer" 속성을 지정한다.
jQuery Mobile 사용자 인터페이스
툴바
Header bar : <div data-role="header">
Footer bar : <div data-role="footer">
Nav bar :
Nav bar는 두개 이상의 버튼을 수평으로 나열해서 하나의 탭 바를 형성하는 UI 컨트롤로 내비게이션바를 구현할 때 사용한다. 보통 Header나 Footer 영역에 위치하며 최대 5개의 버튼을 나열할 수 있다.
<div> 태그에 data-role="navbar" 속성을 지정해서 Nav bar를 표현할 수 있으며 class="ui-btn-active"로 특정 메뉴를 활성상태로 만들수 있다.
<div data-role="page" data-url="/jquerylab/mobile/jquery.mobile.1.1.html?hn=6&sn=1" tabindex="0" class="ui-page ui-body-c ui-page-footer-fixed ui-page-active" style="padding-bottom: 304px; min-height: 575px;">
<div data-role="header" class="ui-header ui-bar-a" role="banner">
<a href="#" data-icon="arrow-l" class="ui-btn-left ui-btn ui-btn-up-a ui-shadow ui-btn-corner-all ui-btn-icon-left" data-corners="true" data-shadow="true" data-iconshadow="true" data-wrapperels="span" data-theme="a"><span class="ui-btn-inner ui-btn-corner-all"><span class="ui-btn-text">Back</span><spanclass="ui-icon ui-icon-arrow-l ui-icon-shadow"> </span></span></a>
<h1 class="ui-title" role="heading" aria-level="1">Toolbar</h1>
<a href="#" data-icon="home" class="ui-btn-right ui-btn ui-btn-up-a ui-shadow ui-btn-corner-all ui-btn-icon-left" data-corners="true" data-shadow="true" data-iconshadow="true" data-wrapperels="span" data-theme="a"><span class="ui-btn-inner ui-btn-corner-all"><span class="ui-btn-text">Home</span><spanclass="ui-icon ui-icon-home ui-icon-shadow"> </span></span></a>
</div>
<div data-role="content" class="ui-content" role="main">
<p>Tool bar</p>
<p>Header, Footer and Nav bar</p>
</div>
<div data-role="footer" data-position="fixed" class="ui-footer ui-bar-a ui-footer-fixed slideup" role="contentinfo">
<div data-role="navbar" class="ui-navbar" role="navigation">
<ul class="ui-grid-b">
<li class="ui-block-a"><a href="#" data-icon="info" data-corners="false" data-shadow="false" data-iconshadow="true" data-wrapperels="span" data-iconpos="top" data-theme="a" data-inline="true"class="ui-btn ui-btn-up-a ui-btn-inline ui-btn-icon-top"><span class="ui-btn-inner"><span class="ui-btn-text">One</span><span class="ui-icon ui-icon-info ui-icon-shadow"> </span></span></a></li>
<li class="ui-block-b"><a href="#" data-icon="check" class="ui-btn-active ui-btn ui-btn-up-a ui-btn-inline ui-btn-icon-top" data-corners="false" data-shadow="false" data-iconshadow="true" data-wrapperels="span" data-iconpos="top" data-theme="a" data-inline="true"><span class="ui-btn-inner"><span class="ui-btn-text">Two</span><span class="ui-icon ui-icon-check ui-icon-shadow"> </span></span></a></li>
<li class="ui-block-c"><a href="#" data-icon="star" data-corners="false" data-shadow="false" data-iconshadow="true" data-wrapperels="span" data-iconpos="top" data-theme="a" data-inline="true"class="ui-btn ui-btn-up-a ui-btn-inline ui-btn-icon-top"><span class="ui-btn-inner"><span class="ui-btn-text">Three</span><span class="ui-icon ui-icon-star ui-icon-shadow"> </span></span></a></li>
</ul>
</div>
</div>
</div>
<div class="ui-loader ui-corner-all ui-body-a ui-loader-default" style="top: 440.5px;"><span class="ui-icon ui-icon-loading"></span><h1>loading</h1></div>
Fixed Mode
콘텐츠의 내용이 길어서 페이지를 위아래로 스크롤하면 Header와 Footer bar가 시야에서 사라진다. 그러나 이것들을 Fixed Mode로 지정하면 자동으로 스크롤을 따라 다니게 만들 수 있다.
<div data-role="header" data-position="fixed">...</div>
Fullscreen Mode
Header나 Footer bar가 Fixed Mode로 설정된 상태에서 Page 영역을 Fullscreen Mode로 설정하면 스크롤의 상태와 상관없이 사용자의 터치에 의해 숨기고 나타나기를 반복하게 할 수 있다. 다음과 같이 Page 영역에 data-fullscreen="true" 속성을 추가로 지정하고 Header 혹은 Footer bar에 data-position="fixed"를 지정한다.
Fullscreen Mode : <div data-role="page" data-fullscreen="true">
Fixed Mode : <div data-role="header" data-position="fixed">
아이콘
data-icon 속성을 이용해 특정 아이콘을 지정할 수 있다.
Icon : <a href="#" data-role="button" data-icon="arrow-l">button</a>
- 아이콘 위치 - jQuery Mobile 표준아이콘 종류
arrow-l, arrow-r, arrow-u, arrow-d, delete, plus, minus, check, gear, refresh, forward, back, grid, star, alert, info, home, search
위치를 변경하고 싶다면 data-iconpos 속성을 지정한다 : left, right, top, bottom
data-iconpos 적용 예 : <a href="#" data-role="button" data-icon="info" data-iconpos="top">button</a>
data-iconpos 속성을 'notext'로 지정하면 (텍스트 없는) 아이콘 버튼을 만들 수 있다.
icon button : <a href="#" data-role="button" data-icon="info" data-iconpos="notext">button</a>
- 사용자 정의 아이콘
먼저 새로운 아이콘을 위한 18x18 픽셀 이미지를 생성한다. 파일명 : myNewIcon.png
새 아이콘을 위한 Css코드 추가
.ui-icon-my-new-icon {
background-image:url('images/myNewIcon.png');
}
새 아이콘의 사용예
<a href="#" data-role="button" data-icon="my-new-icon">button</a>
버튼
- 기본버튼
버튼 : <a href="#" data-role="button">button</a>
이렇게 생성된 버튼은 모바일 브라우저의 가로크기를 꽉 채우게 된다. 그러나 data-inline="true" 속성을 추가하면 버튼의 크기를 텍스트에 맞춰 줄일수 있다.
인라인 버튼 : <a href="#" data-role="button" data-inline="true">button</a>
- 폼버튼
<button>태그, input type="button", input type="submit", input type="reset", input type="image" 등은 data-role="button" 속성을 지정하지 않아도 자동으로 버튼으로 표현된다.
<button>button element</button>
<input type="button" value="Input type=button">
<input type="submit" value="Input type=submit">
<input type="reset" value="Input type=reset">
<input type="image" value="Input type=image">
- 버튼그룹
여러개의 버튼을 묶어서 하나의 그룹을 형성하려면 버튼을 감싸고 있는 컨테니너 태그에 data-role="controlgroup"속성을 지정하면 된다. 그리고 버튼이 그룹화되는 방향을 지정할 수 있다. data-type="horizontal"은 수평으로 그룹화되고 data-type="vertical"은 수직으로 그룹화되며 지정하지 않으면 기본값은 수직정렬이다.
<div data-role="controlgroup">
<a href="#" data-role="button" data-icon="back">Button1</a>
<a href="#" data-role="button" data-icon="forward">Button2</a>
</div>
<div data-role="controlgroup" data-type="horizontal">
<a href="#" data-role="button" data-icon="back">Button1</a>
<a href="#" data-role="button" data-icon="forward">Button2</a>
</div>
리스트
jQuery Mobile은 기존 HTML 목록태그에 data-role="listview" 속성을 지정해 모바일 친화적인 리스트를 만든다.
- 기본리스트
<ul data-role="listview">
<li><a href="#">List Item 1</a></li>
<li><a href="#">List Item 2</a></li>
<li><a href="#">List Item 3</a></li>
</ul>
- Inset리스트
Inset 리스트는 상,하,좌,우 여백과 라운드 모서리 효과를 줘서 다른 컨트롤과 조화되게 한다. 다음과 같이 data-inset="true" 속성을 추가로 지정해 Inset 리스트를 만들 수 있다.
<ul data-role="listview" data-inset="true">
<li><a href="#">List Item 1</a></li>
<li><a href="#">List Item 2</a></li>
<li><a href="#">List Item 3</a></li>
</ul>
- 리스트 Divider
리스트 Divider는 리스트 항목들을 분할하여 구분하는 것으로 일종의 리스트 그룹 효과를 줄 수 있다.
<li> 태그에 data-role="list-divider" 속성을 지정한다.
<ul data-role="listview">
<li data-role="list-divider">Divider 1</li>
<li><a href="#">List Item 1-1</a></li>
<li><a href="#">List Item 1-2</a></li>
<li data-role="list-divider">Divider 2</li>
<li><a href="#">List Item 2-1</a></li>
<li><a href="#">List Item 2-2</a></li>
</ul>
- 리스트 검색
jQuery Mobile은 리스트 항목을 검색할 수 있도록 지원한다. data-filter="true" 속성을 추가하면 된다.
<ul data-role="listview" data-filter="true">
<li><a href="#">List Item 1-1</a></li>
<li><a href="#">List Item 1-2</a></li>
<li><a href="#">List Item 2-1</a></li>
<li><a href="#">List Item 2-2</a></li>
</ul>
- Split button 리스트
Split button 리스트는 리스트의 각 항목을 좌우 두 구간으로 나눠서 왼쪽에는 일반적인 항목을 표현하고 오른쪽에는 아이콘 버튼을 둬서 별도의 링크를 가능하게 한다.
<ul data-role="listview" data-split-icon="forward" data-split-theme="a">
<li>
<a href="#">List Item 1</a>
<a href="#">Split Icon Description</a>
</li>
<li>
<a href="#">List Item 2</a>
<a href="#">Split Icon Description</a>
</li>
<li>
<a href="#">List Item 3</a>
<a href="#">Split Icon Description</a>
</li>
</ul>
- 아이콘 리스트와 썸네일 리스트
리스트 항목에 아이콘을 표시하려면 <img>태그에 class="ui-li-icon" 속성을 지정한다. 이때 아이콘의 크기는 16x16픽셀을 권장한다.
<ul data-role="listview">
<li><img src="images/gf.png" class="ui-li-icon"><a href="#">France</a></li>
<li><img src="images/de.png" class="ui-li-icon"><a href="#">Germany</a></li>
<li><img src="images/gb.png" class="ui-li-icon"><a href="#">Great Britain</a></li>
<li><img src="images/fi.png" class="ui-li-icon"><a href="#">Japan</a></li>
</ul>
아이콘이 아닌 썸네일 이미지를 표현하고 싶다면 <img> 태그에 지정했던 class="ui-li-icon" 속성을 제거하면 된다. 이때 이미지 크기가 클경우 자동으로 80픽셀로 조정한다.
<ul data-role="listview">
<li><img src="images/album-bb.jpg"><a href="#">List Item 1</a></li>
<li><img src="images/album-hc.jpg"><a href="#">List Item 2</a></li>
<li><img src="images/album-p.jpg"><a href="#">List Item 3</a></li>
</ul>
- 중첩 리스트
중첩(Nested) 리스트는 리스트 내에 하위 리스트가 존재하는 중첩된 구조의 리스트를 말한다. 중첩 리스트는 모바일 애플리케이션에서 자주 활용되는 UI구조로서, 대분류, 소분류와 같은 계층 구조의 데이터 집합을 표현할 때 유용하게 사용할 수 있다.
<ul data-role="listview">
<li>Parent Item 1
<ul>
<li><a href="#">Sub Item</a></li>
<li><a href="#">Sub Item</a></li>
</ul>
</li>
<li>Parent Item 2
<ul>
<li><a href="#">Sub Item</a></li>
<li><a href="#">Sub Item</a></li>
</ul>
</li>
<li>Parent Item 3
<ul>
<li><a href="#">Sub Item</a></li>
<li><a href="#">Sub Item</a></li>
</ul>
</li>
</ul>
애플리케이션 실행중 이미 생성된 리스트에 새로운 항목을 동적으로 추가할 경우 다음과 같이 jQuery Mobile에 업데이트 되었음을 명시적으로 알려야 한다.
$('ul').append('<li><a href="#">New Item</a></li>');
$('ul').listview("refresh");
폼
- Field Container
폼 양식을 정의할 때 각 양식의 간격을 적절하게 유지해서 서로 구분하기 쉽게 하고 양식과 label의 조화를 위해 각 양식을 감싸는 태그, 즉 <div> or <fieldset>에 data-role="fieldcontain" 속성의 지정을 권장한다.
<div data-role="fieldcontain">....</div>
다음은 입력양식의 예이다.
<div data-role="fieldcontain">
<label for="name">Text Input:</label>
<input type="text" name="name" id="name" value="">
</div>
<div data-role="fieldcontain">
<label for="password">Password Input:</label>
<input type="password" name="password" id="password" value="">
</div>
<div data-role="fieldcontain">
<label for="textarea">Textarea:</label>
<textarea cols="40" rows="8" name="textarea" id="textarea"></textarea>
</div>
- HTML5의 향상된 입력양식
<div data-role="fieldcontain">
<label for="number">Number:</label>
<input type="number" name="number" id="number" value="">
</div>
<div data-role="fieldcontain">
<label for="email">Email:</label>
<input type="email" name="email" id="email" value="">
</div>
<div data-role="fieldcontain">
<label for="url">Url:</label>
<input type="url" name="url" id="url" value="">
</div>
<div data-role="fieldcontain">
<label for="tel">Tel:</label>
<input type="tel" name="tel" id="tel" value="">
</div>
- 슬라이더
슬라이더는 라디오 볼륨 조절 장치처럼 상하좌우로 조절할 수 있는 UI 컨트롤로서 range 타입으로 구현한다. 슬라이더바와 텍스트 입력창과 min,max로 범위의 최소, 최대값을 지정하고 value로 현재 값을 지정한다.
<div data-role="fieldcontain">
<label for="slider1">Input slider:</label>
<input type="range" name="slider1" id="slider1" min="0" max="100" value="50" data-theme="b" data-track-theme="a">
</div>
- 플립 토글
플립 토글은 on/off와 같이 두 가지중 하나를 선택하도록 하는 토글 버튼을 표현한다. <select>태그에 data-role="slider" 속성을 지정해 플립 토글 버튼을 만든다.
<div data-role="fieldcontain">
<label for="slider">Select slider:</label>
<select name="slider" id="slider" data-role="slider">
<option value="off">Off</option>
<option value="on">On</option>
</select>
</div>
- Select 메뉴
옵션의 수가 적은 Select 메뉴는 오버레이 형식으로 메뉴창이 나타나지만 옵션이 너무 많으면 자동으로 Dialog Page에 메뉴창이 나타난다.
<div data-role="fieldcontain">
<label for="selectMenu">Select Menu:</label>
<select name="selectMenu" id="selectMenu">
<option value="optoin1">Option1</option>
<option value="optoin2">Option2</option>
<option value="optoin3" selected="">Option3</option>
<option value="optoin4">Option4</option>
</select>
</div>
- 체크박스와 라디오버튼
체크박스와 라디오버튼을 정의할 때는 <fieldset> 태그로 이들을 감싸고 여기에 data-role="controlgroup" 속성을 지정해 이들을 그룹화한다.
<div data-role="fieldcontain">
<fieldset data-role="controlgroup">
<legend>CheckBox:</legend>
<input type="checkbox" name="checkbox1" id="checkbox1">
<label for="checkbox1">Check1</label>
<input type="checkbox" name="checkbox2" id="checkbox2">
<label for="checkbox2">Check2</label>
<input type="checkbox" name="checkbox3" id="checkbox3">
<label for="checkbox3">Check3</label>
</fieldset>
</div>
<div data-role="fieldcontain">
<fieldset data-role="controlgroup">
<legend>Radio Button:</legend>
<input type="radio" name="radio1" id="radio1" value="choice1" checked="checked">
<label for="radio1">Radio1</label>
<input type="radio" name="radio1" id="radio2" value="choice2">
<label for="radio2">Radio2</label>
<input type="radio" name="radio1" id="radio3" value="choice3">
<label for="radio3">Radio3</label>
</fieldset>
</div>
참고로 <fieldset>태그에 data-type="horizontal" 속성을 지정하면 수평 정렬된 형태로 표현할 수 있다.
<fieldset data-role="controlgroup" data-type="horizontal">...</fieldset>
Collapsible 블록
Collapsible 블록은 콘텐츠 영역을 접었다 펼 수 있는 컨트롤이며 콘텐츠를 감싸고 있는 <div>태그에 data-role="collapsible" 속성을 지정하면 된다. 이때 data-collapsed="true" 속성을 지정하면 접힌 형태로 나타난다.
<div data-role="collapsible-set">
<div data-role="collapsible">
<h3>Collapsible 1</h3>
<p>Collapsible Content Block 1</p>
</div>
<div data-role="collapsible" data-collapsed="true">
<h3>Collapsible 2</h3>
<p>Collapsible Content Block 2</p>
</div>
<div data-role="collapsible" data-collapsed="true">
<h3>Collapsible 3</h3>
<p>Collapsible Content Block 3</p>
</div>
</div>
또한 여러개의 Collapsible 블럭을 하나의 그룹으로 구성하고 싶다면 이것들을 감싸고 있는 <div>태그에 data-role="collapsible-set" 속성을 지정한다.
jQuery Mobile 페이지 이동과 효과
내부 링크 페이지 이동
jQuery Mobile은 한페이지에 정의된 여러 화면(Page 영역)을 대상으로 내부적으로 이동할 수 있게 내부 링크를 지원한다. 이때 이동할 Page 영역을 식별하기 위해 <div>태그에 ID값을 부여하고 이 값으로 링크를 연결한다.
<!-- Page 1 -->
<div data-role="page" id="home" data-url="home">
<div data-role="header">
<h1>Page 1</h1>
</div>
<div data-role="content">
<h1>First Page</h1>
<a href="#secondPage">Go To Second Page</a>
</div>
</div>
<!-- Page 2 -->
<div data-role="page" id="secondPage" data-url="secondPage">
<div data-role="header">
<h1>Page 2</h1>
</div>
<div data-role="content">
<h1>Second Page</h1>
</div>
</div>
내부 링크 페이지 이동 원리
이동원리를 보면 각 Page 영역에 지정된 ID 값이 data-url 속성값으로 자동 생성되며 ui-page-active라는 CSS 클래스가 추가로 지정되어 여러 Page 영역 가운데 실제 모바일 브라우저에 표시할 페이지를 결정한다. 또한 Page2으로 이동하면 코드에서 정의하지 않았던 '뒤로 가기' 버튼(Back 버튼)이 자동 생성된다.
외부 링크 페이지 이동
jQuery Mobile의 외부 링크 페이지 이동은 자동으로 Ajax통신으로 처리되며 내부 링크 페이지 이동과 유사하게 동작한다.
다음은 Page1.html에서 Page2.html로의 외부 링크 페이지 이동을 보여준다.
<!-- Page1.html -->
<div data-role="page" data-url="/jquerylab/mobile/jquery.mobile.1.1.html?hn=6&sn=1">
<div data-role="header">
<h1>Page 1</h1>
</div>
<div data-role="content">
<h1>First Page</h1>
<a href="Page2.html">Go To Page2.html (using Ajax)</a>
</div>
</div>
<!-- Page2.html -->
<div data-role="page" data-url="/jquerylab/mobile/jquery.mobile.1.1.html?hn=6&sn=1">
<div data-role="header">
<h1>Page 2</h1>
</div>
<div data-role="content">
<h1>Page2.html</h1>
</div>
</div>
외부 사이트 이동 및 링크 옵션
jQuery Mobile은 기존의 표준 HTML 링크 타입을 모두 지원한다. 또한 자동 Ajax 처리가 마음에 들지 않는다면 링크의 타깃 정보를 명시적으로 지정하거나 rel="external", data-ajax="false" 등의 속성을 지정해서 전통방식의 페이지 이동을 처리할 수 있다. (전통 방식의 페이지 이동은 새로고침 방식을 말한다.)
<p><a href="http://jquerymobile.com">Go To External Site </a></p>
<p><a href="Page2.html" rel="external">Go To Page2.html (rel="external")</a></p>
<p><a href="Page2.html" data-ajax="false">Go To Page2.html (data-ajax="false")</a></p>
<p><a href="Page2.html" target="_blank">Go To Page2.html (target="_blank")</a></p>
Back 버튼과 대화창
페이지 이동시 만일 Back버튼이 자동으로 만들어지지 않게 하려면 다음과 같이 Header bar에 data-backbtn="false" 속성을 지정한다.
<div data-role="header" data-backbtn="false">....</div>
Back버튼을 Header bar가 아닌 콘텐츠 영역에 명시적으로 생성하고 싶다면 앵커 태그에 data-rel="back" 속성을 지정하면 된다. 그리고 페이지를 대화(Dialog)창 형태의 새창으로 띄우고 싶을 경우 data-rel="dialog" 속성을 지정한다.
<!-- Page 1 -->
<div data-role="page" id="home" data-url="home">
<div data-role="header">
<h1>Page</h1>
</div>
<div data-role="content">
<h1>Page</h1>
<a href="#secondPage" data-rel="dialog" data-transition="pop">Pop up Dialog</a>
</div>
</div>
<!-- Page 2 -->
<div data-role="page" id="secondPage" data-url="secondPage">
<div data-role="header">
<h1>Dialog</h1>
</div>
<div data-role="content">
<h1>Dialog Page</h1>
<a href="#" data-role="button" data-rel="back">Close</a>
</div>
</div>
페이지 이동 API
스크립트 영역에서 페이지 이동을 처리하고 싶다면 jQuery Mobile에서 제공하는 mobile 객체의 changePage() 메서드를 이용하면 된다. changePage() 메서드의 매개변수에는 차례대로 이동할 페이지, Transition, Transition 방향을 지정한다.
내부 링크 페이지 이동 $.mobile.changePage('#secondPage','slide','reverse');
외부 링크 레이지 이동 $.mobile.changePage('Page2.html','slide','reverse');
페이지 이동 애니메이션 효과
페이지 링크를 정의하는 앵커 태그에 data-transition 속성을 지정해서 다음과 같은 6가지 효과를 구현할 수 있다.
- slide : 페이지가 왼쪽으로 미끄러지듯 이동한다.
- slideup : 페이지가 위쪽으로 미끄러지듯 이동한다.
- slidedown : 페이지가 아래쪽으로 미끄러지듯 이동한다.
- pop : 새 페이지가 팝업 형태로 올라온다.
- fade : 기존 페이지가 희미해지면서 새 페이지가 나타난다.
- flip : 새 페이지가 회전하면서 나타난다.
<div data-role="page" data-url="/jquerylab/mobile/jquery.mobile.1.1.html?hn=6&sn=1">
<div data-role="header">
<h1>Transition</h1>
</div>
<div data-role="content">
<h1>Page Animation</h1>
<p><a href="#secondPage" data-transition="slide">Slide</a></p>
<p><a href="#secondPage" data-transition="slideup">Slide Up</a></p>
<p><a href="#secondPage" data-transition="slidedown">Slide Down</a></p>
<p><a href="#secondPage" data-transition="pop">Pop</a></p>
<p><a href="#secondPage" data-transition="fade">Fade</a></p>
<p><a href="#secondPage" data-transition="flip">Flip</a></p>
<p><a href="#secondPage" data-transition="slide" data-direction="reverse">Slide Reverse</a></p>
</div>
</div>
<!-- Page 2 -->
<div data-role="page" id="secondPage" data-url="secondPage">
<div data-role="header">
<h1>Page 2</h1>
</div>
<div data-role="content">
<h1>Second Page</h1>
</div>
</div>
jQuery Mobile Ajax 상호작용
기본적으로 jQuery Mobile은 서버 통신이 필요한 모든 요청을 Ajax로 처리한다.
GET 요청
다음과 같은 일반적인 링크는 jQuery Mobile이 알아서 Ajax 통신을 수행한다.
<a href="Page2.html">Go</a>
jQuery Mobile의 GET 요청 메커니즘
jQuery Mobile은 기본 링크로 페이지를 이동할 때(예를 들어, Page1.html 에서 Page2.html로 이동) 내부적으로 Ajax 통신을 이용해 GET 요청을 처리하고 응답받은 결과 데이터를 기존페이지에 통합해서 애니메이션 효과와 함께 Page 영역을 전환한다.
하지만 Back버튼으로 원래 Page영역으로 돌아온 뒤(Page1.html) 다시 동일한 페이지 이동(Page2.html)을 시도하면 더는 GET 요청이 아니라 '내부 링크 페이지 이동'과 같은 시나리오가 된다. 다시 말해 이미 기존 페이지에 통합됐기 때문에 이후 동일 자원에 대한 재요처은 서버와 통신이 아닌 내부 Page 영역간의 교체로 처리된다는 것이다.
Get 요청 처리 순서
Ajax GET 요청 -> 응답 -> 기존 페이지에 결과 데이터 통합 -> 자동 페이지 전환
동일 자원에 대한 두번째 GET 요청
자동 페이지 전환(애니메이션 효과 및 화면 전환)
Page2.html로 GET 요청을 한 뒤 변경되는 URL은 다음과 같다.
http://yourdomain/Page1.html#Page2.html
동일 자원에 대한 서로 다른 URL 매개변수 요청
jQuery Mobile은 동일한 자원에 대한 재요청이라도 전달하는 URL 매개변수가 다르면 이를 서로 다른 URL로 인식해서 다시 서버로 요청을 하도록 설계돼 있다. 결국 매개변수 정보까지 모두 포함하는 전체 URL을 기준으로 동일한 자원인지 판단한다.
POST 요청
폼 데이터를 실어 나를 때 사용하는 POST 요청 역시 jQuery Mobile에 의해 자동으로 Ajax Form 전송으로 처리된다. 다만 GET 요청의 경우 동일 자원에 대한 두 번 이상의 요청은 서버 통신이 생략되지만 POST 요청은 매번 서버로 통신을 하게 된다는 점이 다르다. 이렇게 매번 새로운 결과 값을 기존 페이지에 통합하기 때문에 이전에 통합된 데이터는 자동으로 제거된다.
FORM 전송(POST) 처리순서
Ajax POST 요청 -> 응답 -> 기존 페이지에 결과 데이터 통합 -> 자동 페이지 전환
동일 자원에 대한 두번째 FORM 전송
Ajax POST 요청 -> 응답 -> 기존 페이지에 결과 데이터 통합 -> 기존에 통합된 결과 데이터 제거 -> 자동 페이지 전환
jQuery Mobile 이벤트
mobileinit 이벤트와 기본 설정 변경
mobileinit 이벤트
mobileinit은 jQuery Mobile이 시작되자마자 발생하는 이벤트로서 최상단 초기화 작업이나 jQuery Mobile의 기본 설정값을 변경하기에 적합한 곳이다. 이 이벤트는 실행즉시 발생하므로 jQuery Mobile의 스크립트 라이브러리(jquery.mobile-1.1.0.min.js)가 로드되기 전에 바인딩되어야 한다.
가령 mobileinit 이벤트를 구현한 스크립트 파일이 'customScript.js'라고 한다면 다음과 같은 순서로 스크립트를 참조해야 한다.
//customScript.js
$(document).bind('mobileinit', function(){
...
});
<script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script src="customScript.js"></script>
<script src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script>
초기화 설정 변경
mobileinit 이벤트를 이용해 jQuery Mobile의 기본 설정을 변경하려면 $.mobile 객체를 이용해 개별 설정을 변경하거나 $.extend 메서드를 사용하여 여러 속성을 한번에 변경할 수 있다.
- defaultTransition
페이지 이동 간 발생하는 기본 애니메이션 효과(Transition)를 설정한다.
설정값 유형 : 문자열, 기본값 : slide
- loadingMessage
시간이 소요되는 페이지를 불러올 때 나타나는 로딩 메시지를 설정한다.
설정값 유형 : 문자열, 기본값 : loading
- ajaxEnabled
Ajax가 아니라 전통적인 방식으로 페이지 이동을 처리하고 싶다면 이 값을 false로 지정한다.
설정값 유형 : true/false, 기본값 : true
- autoInitialize
jQuery Mobile은 페이지의 DOM이 준비되면 곧 바로 모바일 최적화를 위한 각종 초기화 작업을 수행한다. 이 값을 false로 지정하면 $.mobile.initializePage() 메서드가 호출되기 전까지는 초기화 작업을 미룰 수 있다. 이는 뭔가 다른 처리를 한 후 애플리케이션이 나타나는 시나리오에서 사용하면 좋다.
설정값 유형 : true/false, 기본값 : true
- metaViewportContent
뷰포트 설정을 위한 메타 태그를 지정한다. 이 값을 false로 지정하면 메타 태그가 생성되지 않는다. 혹은 다른 뷰포트 설정값으로 변경할 수 있다.
설정값 유형 : 문자열, 기본값 : width=device-width, minimum-scale=1, maximum-scale=1
아래는 실제 기본 설정을 변경하는 예제이다.
$(document).bind("mobileinit", function(){
$.extend($.mobile , {
defaultTransition : 'flip'
,loadingMessage : 'Now Loding...'
//,ajaxEnabled : false
//,autoInitialize : false,
//,metaViewportContent : 'width=device-width, minimum-scale=0.5, maximum-scale=0.5'
});
});
페이지 이벤트
jQuery Mobile은 애플리케이션이 시작되어 페이지가 로딩될 때와 페이지가 이동해서 새 페이지가 나타나거나 사라질 때 페이지 관련 이벤트를 발생시킨다.
- pagebeforecreate
페이지가 로딩될 때 제일 처음 발생하는 이벤트로서 페이지가 초기화되기 직전에 발생한다. 페이지가 생성되어 한 번 발생하고 나면 (페이지 이동 등에 의해) 더는 발생하지 않는다.
- pagecreate
페이지 초기화가 완료되면 발생한다. 역시 페이지가 생성된 후 한 번만 발생한다.
- pagebeforeshow
페이지가 보여지기 전에 발생한다. 페이지가 이동할 때는 Transition이 시작되기 전에 발생한다. 페이지가 보여지는 상황이 될 때마다 이벤트가 매번 발생한다.
- pageshow
페이지가 다 보여지면 발생한다. 페이지가 이동할 때는 Transition이 돤료되면 발생한다. 역시 페이지가 보여질 때마다 발생한다.
- pagebeforehide
페이지가 사라지기 전에 발생한다. 페이지 이동에 의해 사라질 경우 Transition이 시작되기 전에 발생한다. 역시 매번 발생한다.
- pagehide
페이지가 모두 사라지고 난 후 발생한다. 페이지 이동에 의해 사라질 경우 Transition이 완료되면 발생한다. 역시 매번 발생한다.
페이지 로딩 시 발생하는 이벤트
애플리케이션이 시작되어 특정 페이지가 처음 로딩되면 페이지 초기화 이벤트인 pagebeforecreate와 pagecreate 이벤트가 먼저 발생하고, 이어서 pageboforeshow, pageshow 이벤트가 순차적으로 발생한다. 한 번 생성된 페이지가 페이지 이동 등으로 다시 나타날 경우 pagebeforecreate와 pagecreate 이벤트는 더는 발생하지 않고 pagebeforeshow와 pageshow 이벤트만 다시 발생한다.
? 페이지가 처음 로딩될 때 발생하는 이벤트 순서
pagebeforecreate → pagecreate → pagebeforeshow → pageshow
페이지 이동 시 발생하는 이벤트
다음은 Page1에서 Page2로 처음 이동할 때 발생하는 이벤트 순서이다.
? Page1에서 Page2로 처음 이동할 때 발생하는 이벤트 순서
(Page2)pagebeforecreate → (Page2)pagecreate → (Page1)pagebeforehide → (Page2)pagebeforeshow → (Page1)pagehide → (Page2)pageshow
? Page2에서 Back버튼을 통해 다시 Page1으로 이동할 경우 이벤트 순서
(Page2)pagebeforehide → (Page1)pagebeforeshow → (Page2)pagehide → (Page1)pageshow
터치 이벤트
jQuery Mobile은 모바일 기기에서 유용하게 사용할 만한 몇 가지 터치 이벤트를 지원한다.
- tap
터기 기반 모바일 기기에서 가장 흔하게 발생하는 이벤트다. 클릭이벤트와 유사하며, 특정영역을 손가락으로 툭 치면 즉시 발생한다.
- taphold
일정 시간 이상 탭(tap)하고 있을 때 발생하는 이벤트다. 특정영역 복사와 같은 시나리오에 자주 사용된다.
- swipe
화면을 손가락으로 살짝 밀면 발생하는 이벤트다. 화면 전환이나 리스트와 같은 UI 컨트롤에서 특정 항목에 대한 삭제 버튼을 활성화할 때 자주 사용한다.
- swipeleft
왼쪽 방향으로 swipe할 때 발생하는 이벤트다.
- swiperight
오른쪽 방향으로 swipe할 때 발생하는 이벤트다.
스크롤 & 화면 방향 전환 이벤트
Scroll 이벤트와 모바일 기기의 가로/세로 방향이 바뀔때 발생하는 Orientation Change 이벤트이다.
- scrollstart
스크롤이 시작되면 발생하는 이벤트다.
- scrollstop
스크롤이 완료되면 발생하는 이벤트다.
- orientationchange
모바일 기기의 가로/세로 방향이 바뀔 때마다 발생하는 이벤트다.