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');
});