jQuery で要素を操作する際に使用するメソッドに関するメモ。
ラップ集合の全要素(既存のコンテンツ)に対して渡されたコンテンツ(引数で指定した要素等)を追加するメソッドは以下のようなものがある。
要素同士の位置関係
渡された HTML 断片あるいは要素を、マッチした全要素のコンテンツの末尾に追加する。
以下のような HTML がある場合
<div id="self"> <p>既存の子要素</p> </div>
以下を実行すると
$('#self').append('<div>追加されるコンテンツ</div>');
引数で指定されたコンテンツは div#self の「既存の子要素」の末尾に追加される。
<div id="self"> <p>既存の子要素</p> <div>追加されるコンテンツ</div> </div>
もしパラメータが関数ならばラップされた各要素について呼び出される。
以下は全く実用的ではないサンプル。
「コールバック」という文字列をクリックすると、各 li 要素のコンテンツの値(コールバックのパラメータ content)を CSS の color の値に指定して、インデックスを付けて表示
HTML
<div class="control"> <p class="button" id="func">コールバック</p> </div> <div id="callback"> <ul> <li>red</li> <li>green</li> <li>blue</li> </ul> </div>
jQuery
var is_called = false; $('#func').click(function(){ if(!is_called) { $('#callback li').append(function(index, content) { var html = '<span style="color: ' + content + '"> ' + index + $(this).text() + ' </span>'; is_called = true; return html; }); } });
渡された HTML 断片あるいは要素を、マッチした全要素のコンテンツの先頭に追加する。
以下のような HTML がある場合
<div id="self"> <p>既存の子要素</p> </div>
以下を実行すると
$('#self').prepend('<div>追加されるコンテンツ</div>');
引数で指定されたコンテンツは div#self の「既存の子要素」の先頭に追加される。
<div id="self"> <div>追加されるコンテンツ</div> <p>既存の子要素</p> </div>
渡されたHTML断片または要素をマッチした全要素の弟として、その直後に挿入する。
以下のような HTML がある場合
<div id="self"> <p>既存の子要素</p> </div>
以下を実行すると
$('#self').after('<div>追加されるコンテンツ</div>');
引数で指定されたコンテンツは div#self の後に(弟として)追加される。
<div id="self"> <p>既存の子要素</p> </div> <div>追加されるコンテンツ</div>
渡されたHTML断片または要素をマッチした全要素の兄として、その直前に挿入する。
以下のような HTML がある場合
<div id="self"> <p>既存の子要素</p> </div>
以下を実行すると
$('#self').before('<div>追加されるコンテンツ</div>');
引数で指定されたコンテンツは div#self の先頭に(兄として)追加される。
<div>追加されるコンテンツ</div> <div id="self"> <p>既存の子要素</p> </div>
ラップ集合の全要素を指定されたターゲット郡のコンテンツに追加する。
要素同士の位置関係
ラップ集合の全要素を指定されたターゲット郡のコンテンツの末尾に追加する。
以下のような HTML がある場合
<div id="target"> <p>既存の子要素</p> </div>
以下を実行すると
$('<div>追加されるコンテンツ</div>').appendTo('#target');
コンテンツは div#target の「既存の子要素」の末尾に追加される。
<div id="target"> <p>既存の子要素</p> <div>追加されるコンテンツ</div> </div>
ラップ集合の全要素を指定されたターゲット郡のコンテンツの先頭に追加する。
以下のような HTML がある場合
<div id="target"> <p>既存の子要素</p> </div>
以下を実行すると
$('<div>追加されるコンテンツ</div>').prependTo('#target');
コンテンツは div#target の「既存の子要素」の先頭に追加される。
<div id="target"> <div>追加されるコンテンツ</div> <p>既存の子要素</p> </div>
ラップ集合の全要素をDOMの指定されたターゲットの直後に追加する。
以下のような HTML がある場合
<div id="target"> <p>既存の子要素</p> </div>
以下を実行すると
$('<div>追加されるコンテンツ</div>').insertAfter('#target');
コンテンツは div#target の後に(弟として)追加される。
<div id="target"> <p>既存の子要素</p> </div> <div>追加されるコンテンツ</div>
ラップ集合の全要素を DOM の指定されたターゲットの直前に追加する。
以下のような HTML がある場合
<div id="target"> <p>既存の子要素</p> </div>
以下を実行すると
$('<div>追加されるコンテンツ</div>').insertBefore('#target');
コンテンツは div#target の先頭に(兄として)追加される。
<div>追加されるコンテンツ</div> <div id="target"> <p>既存の子要素</p> </div>
要素を何らかのマークアップの中にラッピングするにはwrap()メソッドを使う。
マッチした集合の要素を渡されたHTMLタグ(または渡された要素のクローン:クローンは自動的に作成される)でラップする。
以下のような HTML がある場合
<div id="target"> <p>jQuery</p> <p>PHP</p> <p>WordPress</p> </div>
以下を実行すると
$('#target > p').wrap($('<div></div>').css({border:'solid 1px blue'}));
それぞれの「’#target < p’」が div 要素でラップされる。
<div id="target"> <div style="border: 1px solid blue;"> <p>jQuery</p> </div> <div style="border: 1px solid blue;"> <p>PHP</p> </div> <div style="border: 1px solid blue;"> <p>WordPress</p> </div> </div>
複数の要素がマッチしたとき、もし集合の中にある全要素を一括してラップしたいのなら、wrapAll()メソッドを使う。
マッチした集合の要素全体を1個のユニットとして、渡された HTML タグ(または渡された要素のクローン)でラップする。
以下のような HTML がある場合
<div id="target"> <p>jQuery</p> <p>PHP</p> <p>WordPress</p> </div>
以下を実行すると
$('#target > p').wrapAll($('<div></div>').css({border:'solid 1px green'}));
「’#target < p’」の全体が div 要素でラップされる。
<div id="target"> <div style="border: 1px solid green;"> <p>jQuery</p> <p>PHP</p> <p>WordPress</p> </div> </div>
マッチした集合の中にある要素ではなく、そのコンテンツ(その要素配下の子要素)をラップしたい場合はwrapInner()を使う。
以下のような HTML がある場合
<div id="target"> <p>jQuery</p> <p>PHP</p> <p>WordPress</p> </div>
以下を実行すると
$('#target > p').wrapInner($('<div></div>').css({border:'solid 1px orange'}));
それぞれの「’#target < p’」の配下の要素(この例の場合はテキスト要素)が div 要素でラップされる。
<div id="target"> <p> <div style="border: 1px solid orange;">jQuery</div> </p> <p> <div style="border: 1px solid orange;">PHP</div> </p> <p> <div style="border: 1px solid orange;">WordPress</div> </p> </div>
wrap メソッドと wrapInner メソッドとの違いは、カレント要素そのものを囲むのか、それともカレント要素配下の子要素(またはテキスト)を囲むかの違い。
子要素の親を削除する(つまり、ラップを外す)処理は、unwrap()メソッドで行う。
ラップされている要素郡の親要素(コンテナ)を削除する。 子要素が(その兄弟とともに)DOM内で親要素を置き換える。
以下のような HTML がある場合
<div id="target"> <div style="border: 1px solid green;"> <p>jQuery</p> <p>PHP</p> <p>WordPress</p> </div> </div>
以下を実行すると(セレクタが他のメソッドと異なり > を付けていない)
$('#target p').unwrap();
「div style=”border: 1px solid green;”」が取り除かれる。
<div id="target"> <p>jQuery</p> <p>PHP</p> <p>WordPress</p> </div>
マッチした要素のそれぞれを指定のコンテンツで置き換える。
画像で alt 属性を持つものを、それらの画像の alt 値を含む span 要素で置き換える(画像をそのalt値の文字列で置き換える)例。
HTML
<div id="target"> <ul> <li><img src="images/1.jpg" width="400" alt="夕日"></li> <li><img src="images/2.jpg" width="400" alt="子供の海がめ"></li> <li><img src="images/3.jpg" width="400" alt="海岸の子供"></li> </ul> </div>
jQuery
$('#target ul li img').each(function(index, element) { $(this).replaceWith('<span>' + $(this).attr('alt') + '</span>' ); });
コールバックを使えば、each() を使わず以下のように記述しても同じ結果になる。
$('#target ul li img').replaceWith(function() { return '<span>' + $(this).attr('alt') + '</span>'; });
画像のサイズを変更する例。
$('#replaceWith2').click(function(){ $('#target ul li img').each(function(index, element) { $(this).replaceWith(function() { return $(this).parent('li').html().replace(/width="400"/, 'width="200"'); }); }); });
コールバックを使えば、each() を使わず以下のように記述しても同じ結果になる。
$('#replaceWith2').click(function(){ $('#target ul li img').replaceWith(function() { return $(this).parent('li').html().replace(/width="400"/, 'width="200"'); }); });
replaceAll()では、replaceWith()と同じ処理を実行する際、指定の順序が逆転する(入れ替わる)。
「selector」で選択された要素を全て(コンテンツ)置き換える。 この関数は replaceWith と引数の関係が逆になっているだけで、同じ動作をする。
但し、置き換える内容は同じもの(コンテンツ)になるので、特定の要素を全て「同じ内容」に置き換えるのに使う場合に便利。
replaceWith() と同様、replaceAll() も jQuery のラップ集合を返すが、この集合には置換前の要素は含まれず、置換後の挿入された 要素が含まれる。置換前の要素は失われ、この後は操作が不可能になる。どちらの置換メソッドを使うかは、この点にも配慮する必要がある。
画像要素を全て p 要素('<p>Photo</p>’)に置き換える例。
$('#replaceAll').click(function(){ $('<p>Photo</p>').replaceAll('#target ul li img'); });
ラップ集合に入っている要素のコピーを作り、それらを含む新しいラップ集合を返す。要素に子孫があれば、それらもコピーされる。 オプションを指定すれば、イベントハンドラもコピーされる。
クラスが「beach」の画像要素をコピーし、幅を「600」に変更し更に「clone」というクラスを付与してそれを photo という id を持つ div 要素に追加
<div id="photo"></div> <div id="target"> <ul> <li><img src="images/1.jpg" width="400"></li> <li><img src="images/2.jpg" width="400"></li> <li><img src="images/3.jpg" width="400" class="beach"></li> </ul> </div>
jQuery
$('#target ul li img.beach').clone().attr('width', 600).addClass('clone').appendTo('div#photo');
クローンを挿入後、end()メソッドを使って元のラップ集合(クローンもとのターゲット)を選択し、それを隠す例。
$('#target ul li img.beach').clone().appendTo('div#photo').end().end().hide();
ラップ集合に含まれる全ての要素をページDOMから削除する。
div#photo の画像要素のうち、クラスが「clone」のものを削除する例。
$('div#photo img').remove('.clone');
detach() というメソッドも、DOM から要素を削除するが、削除した要素にバインドされていたイベントやデータは削除されない。
ラップ集合の全要素を DOM から切り離すが、要素にバインドされていたイベントや jQuery データは失わない。
このdetach()メソッドは、一時的に要素を削除するが、あとで(そのイベントやデータを損なうことなく)DOM に戻したい場合に適している。
DOM 要素のコンテンツ(内容)を空にしたいときは、empty() を使う。
マッチした集合の、全部のDOM要素の「内容」を削除する。要素自体は削除されず、そのまま残る。
<div id="photo"> <img src="images/1.jpg"> </div>
上記の div#photo の内容(画像)を空にする例
$('#photo').empty(); //$('#photo img').empty(); では NG
$() 関数に対して、HTML 文字列とプロパティ情報を表すオブジェクト・リテラルを渡すことで、新規の要素(jQuery オブジェクト)を生成することができる。
#create_image という要素をクリックすると、$() 関数で新規に生成した タグを div#photo に追加する例
$('#create_image').click(function(){ $('<img />', { // 属性を設定 src: 'images/1.jpg', alt: 'オアハカの街の夕方', // スタイルを定義 css: { 'border': 'solid 2px #CCC', 'cursor': 'pointer' }, // イベントに対応するリスナを追加 mouseover: function() { $(this).animate({opacity: 0.5}); }, mouseout: function() { $(this).animate({opacity: 1}); }, click: function() { window.alert($(this).attr('alt')); } }).appendTo('#photo'); });