プロになるためのJavaScript入門読書会 レジュメ

Preview:

Citation preview

第5章 jQuery UI

5.1 jQuery UI を構成するコンポーネント

UI Core

Core Widget(ファクトリ) Mouse Position

(位置調整)

Interactions(動きを表現)

Widgets Effects(アニメーション)

• Draggable• Droppable• Resizable• Selectable• Sortable

• Accordion• Autocomplete• Button• Dialog• Slider

• Fade• Shake• Drop

5.1 Interactionsの例

Resizable

$(function() { $( "#resizable" ).resizable();});

divを引っ張って、のばしたり、縮めたり

5.1 Interactionsの例

Draggable / Droppable

$(function() { $( "#draggable" ).draggable(); $( "#droppable" ).droppable({ drop: function( event, ui ) { $( this ).addClass( "ui-state-highlight" ) .find( "p" ) .html( "Dropped!" ); } });});

5.1 Widgetsの例

Accordion

$(function() { $("#accordion").accordion();});

<div id="accordion"> <h3>Section 1</h3> <div> <p>...</p> </div> <h3>Section 2</h3></div>

5.1 Widgetsの例

Datepicker

<script>$(function() { $("#datepicker").datepicker();});</script>

<p>Date:<input type="text"id="datepicker"/></p>

5.1 Effects

http://jqueryui.com/demos/

(スライドよりも実物がわかりやすい)

PowerPointのアニメーションとだいたい同じ。

これまでの通り簡単に使えるのが何よりも特徴

(セレクタで要素を選択してメソッド呼び出し)

5.2 利用の準備

ダウンロード時に選んでサイズを小さくできる

5.2 インストール

<link type="text/css" rel="stylesheet" href="css/jquery-ui-1.10.2.custom.css" /><script src="js/jquery-1.9.1.js"></script><script src="js/jquery-ui.js"></script>

jQueryと同じように読み込むだけ

5.3 jQuery UI の基本動作

$(function() { $("#button").button();});

セレクタで指定してから、メソッド呼び出し。$関数の引数に渡すと、DOMロード終了時に

jQueryによりコールバックされます。

5.3.1 オプションの設定

$("#button").button({ disabled: true});

Buttonメソッドの引数にオブジェクト形式{name:value} で指定する。

5.3.1 オプションの取得

$("#button").button( “option”, ”disabled”);

第1引数に文字列optionを指定して、第2引数にオプションを指定する。

5.3.1 Widget生成後のオプション指定

$("#button").button( “option”, ”disabled”, false);

第3引数に値を設定することで、Widgetを生成した後にオプション値を設定可能

5.3.2 イベント

$("#draggable").draggable({ start: function(event, ui) {..}});

メソッドの引数に指定する方法

event : jQueryのイベントオブジェクト。 イベントが発生した座標、時刻などが取得可能。ui : 各部品により中身は異なる。 例えば、ドラッグ可能オブジェクトであれば、 ui.draggable.text()で、テキストを取得可能。

5.3.2 イベント

$("#draggable").on('dragstart', function(event, ui) {…});

onメソッドを利用する方法

イベント名はstart、イベントタイプはdragstart。onメソッド使用時にはイベントタイプを指定する。

5.3.3 部品の有効化・無効化

$("#draggable").draggable('enable');

$("#draggable").draggable('disable');

前述したdisabledオプションに加えて、メソッドの引数でも指定可能。

5.4 インタラクション

ドラッグ & ドロップjQueryUIコードの解説

5.4 インタラクション

まずはデモ

5.4 インタラクション

初期状態

ドラッグ & ドロップ する。

背景色の変更とメッセージ表示Drop here → Hello Jiro!

<body> <div id="taro" class="draggable">Taro</div> <div id="jiro" class="draggable">Jiro</div> <div id="target" class="droppable">Drop here</div></body>

$(function(){ $(".draggable").draggable(); $("#target").droppable({ drop: function(event, ui) { $(this).addClass( "ui-state-highlight" ) .html($('#msg').render( {msg: "Hello", text: ui.draggable.text()} )); },

<body> <div id="taro" class="draggable">Taro</div> <div id="jiro" class="draggable">Jiro</div> <div id="target" class="droppable">Drop here</div></body>

TaroとJiroに.draggable();

id=targetを.droppable

<body> <div id="taro" class="draggable">Taro</div> <div id="jiro" class="draggable">Jiro</div> <div id="target" class="droppable">Drop here</div></body>

$(function(){ $(".draggable").draggable(); $("#target").droppable({ drop: function(event, ui) { $(this).addClass( "ui-state-highlight" ) .html($('#msg').render( {msg: "Hello", text: ui.draggable.text()} )); },

dropイベントにスタイル変更とテキストの変更を追加。

<body> <div id="taro" class="draggable">Taro</div> <div id="jiro" class="draggable">Jiro</div> <div id="target" class="droppable">Drop here</div></body>

$(function(){ $(".draggable").draggable(); $("#target").droppable({ drop: function(event, ui) { $(this).addClass( "ui-state-highlight" ) .html($('#msg').render( {msg: "Hello", text: ui.draggable.text()} )); },

仕様2 : 追い出すとGood byeメッセージに変わる

Outイベントに、スタイルのremoveClassとメッセージ変更を追加

<div id="target" class="droppable">Drop here</div>

$(function(){ $(".draggable").draggable(); $("#target").droppable({ out: function( event, ui ) { $(this).removeClass( "ui-state-highlight" ) .html($('#msg').render( {msg: "Good bye", text: ui.draggable.text()})); }

<div id="target" class="droppable">Drop here</div>

$(function(){ $(".draggable").draggable(); $("#target").droppable({ out: function( event, ui ) { $(this).removeClass( "ui-state-highlight" ) .html($('#msg').render( {msg: "Good bye", text: ui.draggable.text()})); }

引数uiを通して、ドラッグされたオブジェクトのテキストを取得

『リサイズ』と『並べ替え』は本著者のGithub参照

5.4 インタラクション

5.5 ウィジェット(widgets)

アコーディオンjQueryUIコードの解説

5.5 ウィジェット

まずはデモ

5.5 ウィジェット

初期状態

クリックするとこうなる。

<body> <div id="accordion"> <h3><a href="#">First</a></h3> <div>This is first.</div> <h3><a href="#">Second</a></h3> <div>This is second.</div> <h3><a href="#">Third</a></h3> <div>This is third.</div> <h3><a href="#">Fourth</a></h3> <div>This is fourth.</div> </div></body>

$(function(){ $('#accordion').accordion();});

Divに対して.accordion()するだけ.

自動補完jQueryUIコードの解説

5.5 ウィジェット

まずはデモ

5.5 ウィジェット

一定の文字数入力すると候補が出る。

<body> <label for="fruit">Your favorite fruit: </label> <input id="fruit"/></body>

$(function(){ var fruits = [ 'Apple','Orange','Peach','Pear','Blueberry','Pineapple']; $('#fruit').autocomplete({ minLength: 2, source: function(req, res) { var result = []; for (var i = 0; i < fruits.length; i++) { if (fruits[i].indexOf(req.term) == 0) { result.push(fruits[i]); } } res(result); }});});

<body> <label for="fruit">Your favorite fruit: </label> <input id="fruit"/></body>

$(function(){ var fruits = [ 'Apple','Orange','Peach','Pear','Blueberry','Pineapple']; $('#fruit').autocomplete({ minLength: 2, source: function(req, res) { var result = []; for (var i = 0; i < fruits.length; i++) { if (fruits[i].indexOf(req.term) == 0) { result.push(fruits[i]); } } res(result); }});});

まずは、inputに.autocompleteする。

<body> <label for="fruit">Your favorite fruit: </label> <input id="fruit"/></body>

候補文字列を配列で用意する。http://../fruitsのように、jsonを返すAPIも指定可能$(function(){

var fruits = [ 'Apple','Orange','Peach','Pear','Blueberry','Pineapple']; $('#fruit').autocomplete({ minLength: 2, source: function(req, res) { var result = []; for (var i = 0; i < fruits.length; i++) { if (fruits[i].indexOf(req.term) == 0) { result.push(fruits[i]); } } res(result); }});});

<body> <label for="fruit">Your favorite fruit: </label> <input id="fruit"/></body>

$(function(){ var fruits = [ 'Apple','Orange','Peach','Pear','Blueberry','Pineapple']; $('#fruit').autocomplete({ minLength: 2, source: function(req, res) { var result = []; for (var i = 0; i < fruits.length; i++) { if (fruits[i].indexOf(req.term) == 0) { result.push(fruits[i]); } } res(result); }});});

何文字入力したら補完候補を表示するか指定。デフォルトは1文字。

<body> <label for="fruit">Your favorite fruit: </label> <input id="fruit"/></body>

文字補完のコールバック関数。一致する候補を探すロジックは自分で実装する。$(function(){

var fruits = [ 'Apple','Orange','Peach','Pear','Blueberry','Pineapple']; $('#fruit').autocomplete({ minLength: 2, source: function(req, res) { var result = []; for (var i = 0; i < fruits.length; i++) { if (fruits[i].indexOf(req.term) == 0) { result.push(fruits[i]); } } res(result); }});});

<body> <label for="fruit">Your favorite fruit: </label> <input id="fruit"/></body>

第1引数のtermプロパティからフォームの入力値が取得できる。

$(function(){ var fruits = [ 'Apple','Orange','Peach','Pear','Blueberry','Pineapple']; $('#fruit').autocomplete({ minLength: 2, source: function(req, res) { var result = []; for (var i = 0; i < fruits.length; i++) { if (fruits[i].indexOf(req.term) == 0) { result.push(fruits[i]); } } res(result); }});});

<body> <label for="fruit">Your favorite fruit: </label> <input id="fruit"/></body>

候補リストfruitsから入力値req.termと一致する文字列を抽出し、resultに格納。$(function(){

var fruits = [ 'Apple','Orange','Peach','Pear','Blueberry','Pineapple']; $('#fruit').autocomplete({ minLength: 2, source: function(req, res) { var result = []; for (var i = 0; i < fruits.length; i++) { if (fruits[i].indexOf(req.term) == 0) { result.push(fruits[i]); } } res(result); }});});

<body> <label for="fruit">Your favorite fruit: </label> <input id="fruit"/></body>

第2引数resに、抽出した候補配列を渡すと、補完候補として表示される。$(function(){

var fruits = [ 'Apple','Orange','Peach','Pear','Blueberry','Pineapple']; $('#fruit').autocomplete({ minLength: 2, source: function(req, res) { var result = []; for (var i = 0; i < fruits.length; i++) { if (fruits[i].indexOf(req.term) == 0) { result.push(fruits[i]); } } res(result); }});});

一番良く使われる日付入力の実装

5.5 ウィジェット

フォームをクリックするとカレンダー。

<p>Date: <input type="text" id="datepicker" /></p>

$(function() { $( "#datepicker" ).datepicker();});

Inputに対して、.datepicker()を呼び出すだけ。

datepickerは便利なので、オプションも紹介します。

デフォルトはmm/dd/yyフォーマット

yy/mm/dd形式に変更したい。

<p>Date: <input type="text" id="datepicker" /></p>

$(function() { $( "#datepicker" ).datepicker({ dateFormat: 'yy/mm/dd', firstDay:1 });}); datepickerの引数オブジェクトに

firstDayプロパティを設定する。0が日曜日で1が月曜日。デフォルトは0(日曜日)。

デフォルトは日曜始まり 月曜始まりに変更したい

<p>Date: <input type="text" id="datepicker" /></p>

$(function() { $( "#datepicker" ).datepicker({ dateFormat: 'yy/mm/dd', firstDay:1 });}); dateFormatプロパティを設定する。

例ではyy/mm/ddを指定。

デフォルトは英語表記 日本語に変更したい

<script src="jquery-1.9.1.js"></script><script src="ui/1.10.3/jquery-ui.js"></script><script src="ui/1.10.3/i18n/jquery-ui-i18n.min.js"></script>

$(function() { $.datepicker.setDefaults($.datepicker.regional[ "ja" ] ); $( "#datepicker" ).datepicker();});

ローカライズされたjquery-uiを追加でロードする。

SetDefaultsメソッドにより、対象の言語を事前に指定する。

$(function() { // $.datepicker.setDefaults($.datepicker.regional[ "ja" ] ); $( "#datepicker" ).datepicker();});

setDefaultsの指定を忘れると、うまく日本語がでないので注意

漢数字で出てくる

5.6 効果(Effects)

animeteメソッド時間をかけてCSS属性を変化させる。

5.6 効果

5.6 効果

まずはデモ

5.6 効果

divが徐々に大きくなり、変色する。

<div id="target" style="background-color: red; height: 100px; width: 100px"></div><button id="button" type="button">start</button>

$(function() { $("#button").click(function() { $("#target").animate({ backgroundColor: "#00ff00", width: 200, height : 200 }, 2000 ); });});

<div id="target" style="background-color: red; height: 100px; width: 100px"></div><button id="button" type="button">start</button>

$(function() { $("#button").click(function() { $("#target").animate({ backgroundColor: "#00ff00", width: 200, height : 200 }, 2000 ); });});

デフォルトのスタイルは・背景色は赤・縦横100pxずつ

<div id="target" style="background-color: red; height: 100px; width: 100px"></div><button id="button" type="button">start</button>

$(function() { $("#button").click(function() { $("#target").animate({ backgroundColor: "#00ff00", width: 200, height : 200 }, 2000 ); });});

ボタンのイベントハンドラに、divのアニメーションメソッドをコールバック指定。

<div id="target" style="background-color: red; height: 100px; width: 100px"></div><button id="button" type="button">start</button>

$(function() { $("#button").click(function() { $("#target").animate({ backgroundColor: "#00ff00", width: 200, height : 200 }, 2000 ); });});

・背景色は緑・縦横は200px・2000ミリ秒かけて変化させる

シンタックスエラーとどう戦えば良いのか。

余談 : お世話になったツール

余談 : お世話になったツール

$(function() { $("#button").click(function() { $("#target").animate({ backgroundColor: "#00ff00", width: 200, height : 200 }, 2000 ); })});

問. シンタックスエラーはどこか

余談 : お世話になったツール

$(function() { $("#button").click(function() { $("#target").animate({ backgroundColor: "#00ff00", width: 200, height : 200 }, 2000 ); });});

答. clickメソッドの終了セミコロンがない

私、30分以上はまりました...

余談 : お世話になったツール

http://jshint.com

はやくJSHintを使えばよかったと後悔しています

具体的なご指摘を頂けました。

Line9: セミコロンがありません。

Web直接入力以外にも、Vim/Emacs/Subline Text2Gitコミット前チェックツールなど、色々対応しています。

ユーティリティ独自ウィジェットは次回紹介予定。

Recommended