jQuery :: チェックボックスが並んだテーブルをjQueryでどーこーするサンプル
2009/9/13 (Sun) at 3:40 am
先日、TraversingのアレコレをNettuts+に教わりましたんで、その応用練習ってことで、よくあるテーブルのデザインのサンプルをつくってみました。こういうの↓
http://1-pixel.com/sample/jquery-table/sample.html
cssはhtml内に書かれています。よくあるヤツです。jsはコレです↓
$(function(){
table();
});
function table(){
$('tr', '#sample-table')
.hover(
function(){
$(this).addClass('tr-selected');
},
function(){
if(!$('input[type="checkbox"]', this).attr('checked')){
$(this).removeClass('tr-selected');
}
}
);
$('tr:odd', '#sample-table')
.addClass('tr-odd');
$('#chkAll')
.toggle(
function(){
$('input[type="checkbox"]', '#sample-table')
.attr('checked', true);
$(this)
.html('Uncheck All');
$('tr', '#sample-table')
.addClass('tr-selected');
},
function(){
$('input[type="checkbox"]', '#sample-table')
.attr('checked', false);
$(this)
.html('Check All');
$('tr', '#sample-table')
.removeClass('tr-selected');
}
);
$('tr', '#sample-table')
.children('td:nth-child(1)')
.nextAll()
.click(
function(){
var _e = $('input[type="checkbox"][name^="chk"]', $(this).parent().children('td:first'));
if(_e.attr('checked')){
_e.attr('checked', false);
$(this).parent().removeClass('tr-selected');
}else{
_e.attr('checked', true);
$(this).parent().addClass('tr-selected');
}
}
);
}
テーブルの行をクリックするとチェックボックスがONになり、選択されていることがわかりやすいように背景色が変わります。サンプルではiTuneぽいアイコンがチェックボックスの隣にありますが、これはなにかのイベントを呼ぶもんなので、このぶぶんだけ、つまり一番左のtdだけはチェックボックスON/OFFトグルのクリッカブル領域から外したい。<tr>〜</tr>をまとめてどーこーしたいのなら$('tr')でいいわけですが、これは少しむずかしい。
<tr>〜</tr>の中に複数個ある<td>〜</td>の中の、2番目から最後までのtdを複数選択する
としたい。このためにコレ↓
$('tr', '#sample-table').children('td:nth-child(1)').nextAll()
さらにこれらのtdに対してクリックイベントを割り当てます。こんどはtdからみて、チェックボックスを選択するためにコレ↓
$('input[type="checkbox"][name^="chk"]', $(this).parent().children('td:first'))
このthisは、1つのtrにつき5個づつあるtdの中の、2番目以降のどれかです。つまりこのセレクタの意味するところはこうなる↓
「このtdの親要素(つまりtr)の子供たちの中の、1番目のtdの中にある、name属性がchkで始まる、checkboxのinput要素」
てわけです。さいきんこういうのも少しづつ馴れてきました。冗長なかしょがありましたらツッコミよろしく。
コメント・プリーズ!
PROFILE![]()
藤居ヒロヤ。ウェブデザイナー/ウェブディレクター。ウェブデザインオフィス、3OT NET主宰。名古屋市中区。「優しいデザイン」「激しいデザイン」「正しいデザイン」「セクシーなデザイン」「泣けるデザイン」「もっともなデザイン」... 。あなただけのウェブデザインを丹精込めておつくり致します。見積り依頼等、お気軽にお問い合わせ下さい。
- www. http://www.3ot.net/
- email. admin [atmark] 3ot.net
- phone. 052 323 7376
RECENT ENTRIES![]()
- トウモロコシがおいしい
- ダイコクドラッグが近所にできた
- ライブドアのBLOGOSをよく読みます
- jQuery :: 画像のリロード
- タムの絵
- Javascript :: ecl.jsにながらくお世話になりました
- サーバ移転&ブログのデザインをすこし変えました
- php :: 正規表現 :: 名前つきキャプチャというのを習った
- jQuery :: ネストしたリスト + ui.sortable.js
- jQuery :: event delegationてナニ?
RECENT COMMENTS![]()
- トウモロコシがおいしい [4]
- ふ (07/09)
- いら (07/03)
- ふ (07/03)
- いら (07/03)
- php :: ファイルを強制的にダウンロードさせる [9]
- ふ (05/26)
- ふ (05/26)
- ふ (05/26)
- esperia (05/26)
- esperia (05/26)
- ふ (05/25)
- esperia (05/25)
- ふ (04/14)
- とほりすがり (04/13)
- タムの絵 [2]
- ふ (12/05)
- いら (12/04)
TOOLS![]()
- s-box.js
- Link2WikipediaEncoder
- QR_CodeGenerator
- PagerankChecker
- IntrocucePhpCodeOnBlog
- FaviconGenerator
- Whois
- SiteThumbnailGenerator (Beta)
- EmailAddressEncoder (Legacy!)
BOOKMARKS![]()
RESOURCES![]()
- 99designs
- COMPUTER ARTS
- CPAN
- PHP標準関数逆引き辞典
- SMASHING MAGAZINE
- UNIXコマンド
- ajaxload.info
- deviantART
- deviantART :: PS Brushes
- deviantART :: PS Shapes
- fotosearch.com
- hotscripts.com
- hotscripts.com :: php
- iconlet.com
- jQuery Reference
- php.net :: 関数レファレンス
- psbrushes.net
- turnkeyforms.com
ARCHIVE![]()
- 2010年7月 (1)
- 2010年1月 (1)
- 2009年12月 (2)
- 2009年11月 (3)
- 2009年10月 (1)
- 2009年9月 (9)
- 2009年8月 (7)
- 2009年6月 (7)
- 2009年5月 (1)
- 2009年4月 (8)
- 2009年3月 (1)
- 2009年1月 (1)
- 2008年12月 (3)
- 2008年11月 (1)
- 2008年4月 (1)
- 2008年1月 (3)
- 2007年12月 (1)
- 2007年10月 (3)
- 2007年9月 (5)
- 2007年8月 (4)
- 2007年7月 (13)
- 2007年6月 (22)
- 2007年5月 (30)
- 2007年4月 (15)
- 2007年3月 (12)
- 2007年2月 (7)
- 2007年1月 (16)
- 2006年12月 (23)
- 2006年11月 (9)
- 2006年10月 (3)
- 2006年9月 (2)
- 2006年8月 (6)
- 2006年7月 (4)
- 2006年6月 (6)
- 2006年5月 (10)
- 2006年3月 (17)
- 2006年2月 (8)
- すべての投稿 (266)

サンプルのコードが読みにくくてすません。近々ブログのデザインをどうにかしようと思ってます。
その後の話。
サンプルにあるようなテーブルをつくったらば、DOMを入れ換えたり削除したりしてテーブルの中身を動的にアレコレしたいじゃないですか。ここでじゃじゃーんと登場するのがjQuery1.3xの新機能であるlive()ですが、なんと、このliveが上のサンプルのヤツだと効かないんですね。
「〜の中に複数個ある〜の中の、2番目から最後までのtdを複数選択する」
のために書いた長ったらしいヤツに対して、click(ナントカ)と書いてたところを、live('click', function(){});てな具合にやればいいかと単純に考えていたんだけど、ためしにやったらだめでした。documentにはこう書かれてある↓
Live events currently only work when used against a selector. For example, this would work: $("li a").live(...) but this would not: $("a", someElement).live(...) and neither would this: $("a").parent().live(...).
<a href="http://docs.jquery.com/Events/live" rel="nofollow">http://docs.jquery.com/Events/live</a>
どういうときにダメなのか、制約がよくわからないんだけれども、とにかく上のケースではだめでした。"currently" と書いてあるくらいだから、将来的に制約が緩くなるのかもしれませんが。。
上のサンプルでlive()をやりたかったらば、単純ちからワザというかですね、
$('tr', '#sample-table').children('td:nth-child(1)').nextAll()
という調子で選択していたtd群に対しクラス名をつけて、
$('.foo')
とやればよいと思われます。未検証ですが。
クラスやidを量産して対処するという普段の私に戻ってしまったわけで、複雑なきぶん。。。いたしかゆしといいますか。。。。
ところでlive()ってのはなにかというと、ある条件(クラス名とか)に合致した要素に対してイベントを割り当てたら、その条件に合う要素がイベント割り当てのあとに出現したとき、自動的にイベントがbindされていく、というものです。これによって、新DOMを突っ込んだときに、いちいちイベントをbindしなくてすむようになり、コードが短く書けるようになります。という説明であってるかな。live()とclone()をうまく使えるようになると、なかなかいいかんじ。私はまだそのような域には達してはいませんが。。まだ使ってない方はどうぞ試してみてください。べんりですよ。上のような制約があるわけですが。。
その後の話2。
やっぱり気になるので、上のコメントに書いたコレ↓
> $('.foo')
でやってみたらオッケーでした。わーい。そうか、こういう場合にlive()を使いたい時はclass名をつけていくしかないんだな。。。と納得しかけたつかのま、
「それならaddClass('foo')してからliveを使ったらいいのではないか??」
と別の考えがわいてきました。でもまだ検証してません。そこまでやるのはバカらしいというか、単純にclass名をハードコーディングしていくほうがわかりやすいですよね。
あ、てか、addClassは意味ないですね。それだと新DOMを突っ込んだあとにいちいちaddClassしなくてはならなくなるんで、イベントをbindしていく手間と大して変わらない。だから意味ない。あー、疲れてしまった。もう今日はおしまい。