Prototyperに贈るjQuerystからの手紙
今回の想定する対象者
今回の想定する対象者
「Prototype.jsは使うけど、jQueryは微妙なPG」
内容
内容
- Prototype.jsとjQueryの差異
- jQueryの考え方
- よりよいjQueryの使い方
先に
先に
別にどっちがいいという話ではないです。
向き不向きはありますが、どちらもフレームワークとしての完成度は高いです。(Prototype.jsも1.6.0でDOM Readyサポートしたし)
先に
具体的には以下のような使い分けがおすすめ
- Prototype.js
- 速度が要求される演算
- 複雑なアルゴリズムを使用した計算
- 他のクラスを拡張した処理(google mapsとか)
- jQuery
Prototype.jsとjQueryの差異
Prototype.jsとjQueryの差異(Prototype.js)
- ロジック中心
- 既存言語風インターフェイス
- 他のライブラリとの混在は考慮していない
- コードの共通化はclassを使用
- 既存オブジェクトを中心に拡張
Prototype.jsとjQueryの差異(jQuery)
- DOM中心
- 流れるようなインターフェース(fluent interface)
- 他のライブラリと混ぜるのも考慮
- コードの共通化はpluginを使用
- jQueryオブジェクトを中心に拡張
ロジック中心、DOM中心
ロジック中心、DOM中心
Prototype.jsは配列、ハッシュ、オブジェクト、
数値、文字列等を使ってロジック中心に考えるのに対し、
jQueryはelements、class、id、events等のDOMを中心に考える。
インターフェイス
インターフェイス
Prototype.js(既存言語風インターフェイス)
var div = document.getElementsByTagName('div');
$A(div).each(function (elem) {
elem.setStyle({opacity: 0.5});
});
// 最近は$$('div').each(function (elem) {
// elem.setStyle({opacity: 0.5});
// });みたいに書ける
インターフェイス
jQuery(流れるようなインターフェース(fluent interface))
$('div').css({opacity: 0.5});
// divの集合に対してcssの変更を行う
ライブラリの混在
ライブラリの混在
- Prototype.js
- .prototypeを書き換えるライブラリと混在させると問題が発生する可能性が高い
- jQuery
- .prototypeを書き換えるライブラリと混在させても問題が発生する可能性が低い(しないわけではない)
コードのまとめ方
コードのまとめ方
- Prototype.js
- Class.create();でclassを作ってまとめる
- jQuery
基本オブジェクト
基本オブジェクト
- Prototype.js
- Array、String、Number等の既存オブジェクト、Objectを元にした独自オブジェクト
- jQuery
jQueryの考え方
jQueryの考え方
DOM版SQL
JSの中にjQueryが入っているのではなく、jQueryのDSLとしてJSを使う
jQueryの考え方
とにかくDOMを基準に考える
条件分岐
条件分岐
#loginがあったら何かする(ログインしてるかの判断とか)
×
var hoge = $('#login');
if (hoge.length) alert('hoge');
○(イメージ)
$('#login').each(function () { alert('hoge') });
繰り返し
繰り返し
3個の要素になんかする処理をする
×
$('#hoge1, #hoge2, #hoge3').each(function () {
$(this).click(function () { alert('hoge'); });
});
○
$('#hoge1, #hoge2, #hoge3').click(function () { alert('hoge'); });
状態保持
状態保持
×
var clicked;
$('#hoge1').click(function () { clicked = true; });
if (clicked) alert('true');
○
$('#hoge1').click(function () { $(this).addClass('clicked'); });
$('#hoge1.clicked').each(function () { alert('true'); });
局所化
局所化
×
var hoge = function () {};
hoge.prototype = {
// hogehoge
};
○
$.fn.hoge = function () {
// hogehoge
};
よりよいjQueryの使い方
よりよいjQueryの使い方
- 変数、条件分岐、繰り返しの排除
- jQuery基準で考える
- とにかくPlugin化
変数、条件分岐、繰り返しの排除
変数、条件分岐、繰り返しの排除
- 変数 -> class、input[type="hidden"]、$.dataに保持
- 条件分岐
$('div')
.find('#hoge1').click().end()
.find('#hoge2').click().end()
- 繰り返し -> Selectors、Traversingを使って要素をまとめる
jQuery基準で考える
jQuery基準で考える
- 標準で用意されているものはそれを使う
- Pluginとかもできるだけ活用する
- ライブラリと言ってますが、ほとんどフレームワークなので、jQueryの世界から出るとほとんどサポートはないです
とにかくPlugin化
とにかくPlugin化
- 処理が形式化するので迷わなくなる
- 後で流用しやすい
- 局所化しやすい
- 詳しくはここ
以上 ご静聴ありがとうございました