jQueryでセレクタを再指定する方法
jQueryでセレクタ指定で取得したjQueryオブジェクトを使って、さらにセレクタ指定を行う方法です。
追記:to-Rの西畑さんに添削して頂きました。ありがとうございます。
1.問題
次のように、チェックボックスを階層状に並べたマークアップを例に説明します。
注:マークアップが階層状になっていませんが、操作対象のページのマークアップ(CMSから出力されたもの)がそのようになっているのでそのまま掲載しています。
サンプル
マークアップ
<div class="list-item">
<div style="margin-left:0px">
<input type="checkbox" class="foo" id="id_1"> a
</div>
</div>
<div class="list-item">
<div style="margin-left:10px">
<input type="checkbox" class="foo" id="id_2"> b
</div>
</div>
<div class="list-item">
<div style="margin-left:20px">
<input type="checkbox" class="foo" id="id_3"> c
</div>
</div>
やりたいことは、一番下にあるチェックボックスをチェックしたとき、そのひとつ上にある(=上から2つめの)チェックボックスをチェックする、というものです。同様に、真ん中のチェックボックスをチェックすれば一番上のチェックボックスをチェックします。
ちなみに、チェックボックスをチェックしたときのイベント受け取りは次のように記述します。
jQuery(function(){
jQuery(".foo").change(function(){
// ...
});
});
changeイベントのコールバック関数内で「jQuery(this)」を使えば、チェック対象のinput要素のjQueryオブジェクトが取得できます。そこを基点にしてひとつ上にあるinput要素を特定します。
2.解決方法1
一般的な方法として、find()を利用します。
jQuery(function(){
jQuery(".foo").change(function(){
jQuery(this)
.parent().parent().prev().find(".foo")
.attr('checked', 'checked');
});
});
parent()やprev()で要素を移動したあとに赤色で示すfind()を利用すればセレクタで指定できます。
3.解決方法2
こちらはネットで調べてもあまりみつからなかったのですが、セレクタ指定の第2パラメータ(赤色部分)に「コンテキスト」を与える方法があります。
jQuery(function(){
jQuery(".foo").change(function(){
jQuery(".foo",
jQuery(this).parent().parent().prev())
.attr('checked', 'checked');
});
});
コンテキストを指定することで、セレクタで検索する範囲を絞り込むことができます。
以上です。jQueryな方々の添削をお待ちしています。
- jQuery+ajaxでモーダルのコンテンツを取得する方法
- jQueryでパスワードの表示・非表示を切り替えるサンプル
- jQueryでファイル選択時にプレビュー表示する方法
- ラジオボタンをjQueryで解除する方法
- テーブルのセルをポイントすると行と列を反転表示するjQueryプラグイン「Table Hover」
- jQueryで親ページからiframeのスクロールバーを非表示にする方法
- jQueryのカスタムビルドが簡単にできるサービス「jQuery Builder」
- jQueryでCSSをまとめて書き換える方法のまとめ
- 親ページからiframe内の要素にCSSを適用させる方法
- jQueryで要素を削除する方法のまとめ
- jQueryでテキストを追加するたびにスクロールさせる方法
- jQuery.ajax()でファイルをアップロードする方法
- preventDefault()で無効にしたイベントを有効にする方法
- jQueryで要素数を取得する方法のまとめ
- jQueryやJavaScriptでパスワードフィールドの文字を表示する方法
マークアップが階層構造になっていないのは変だと思います。
>シマダさん
こんばんは。
ご指摘ありがとうございます。
CMSから出力されたマークアップをそのまま使っています。変なのは仰るとおりですがそこは大目に見てやってください。とりあえず本文にはその旨を追記しました。
それではよろしくお願い致します。