| 目次 |
|---|
|
・DOM要素の抽出 ・フィルタリング ・検索 ・連鎖 |
W3Cから勧告されているDOMに関する規格を用いてDOM要素を抽出すると、どうしてもコード自体が長く、複雑になります。
jQueryでは、CSSセレクタによる要素の指定(「CSSセレクタ」参照)の他に、フィルタリング用などのメソッドが用意され、DOM要素の抽出がより簡単に行えるようになっています。
以下は比較の実装例です。
ここのサンプルのSPAN要素が変化します。
リスト1. W3C DOMでの抽出例
function Sample11(){
var objPs = document.getElementsByTagName('p');
var cnt = 0;
for( var x in objPs ){
var objP = objPs[x];
try{
if( objP.className == 'Sample1' ){
var objSPANs = objP.getElementsByTagName('span');
for( var y in objSPANs ){
objSPANs[y].style.color = 'red';
cnt++;
}
continue;
}
else
{
continue;
}
}
catch(e){}
}
alert('SPAN : ' + cnt);
}
HTML5には「getElementsByClassName」メソッドがありますが、確定していないためすべてのブラウザで実装されていません。
そのため、クラス名で抽出するためには一旦 P要素で抽出してそこから探す必要があります。
リスト2. jQueryでの抽出例
function Sample12(){
var objSample = jQuery('.Sample1');
var objSPANs = objSample.find('span');
objSPANs.css('color','blue');
alert('SPAN : ' + objSPANs.length);
}
jQueryではCSSセレクタを「.Sample1 span」として抽出することも可能です。
また「.Sample1」と「.Sample1 span」のそれぞれを別途扱いたいとき、「.Sample1」とその子要素「span」で抽出すれば効率的にプログラミングできます。
フィルタリングを用いると、一度抽出した要素のうち、特定の要素だけに処理を施すことが可能です。
リスト3. eq(index)
function Sample23(){
var x = Math.floor( Math.random() * 10 );
var li = jQuery('li.Sample23').css('color','');
li.eq(x).css('color','red');
jQuery('span.Sample23').text(x);
}
実装例
リスト4. filter(CSSセレクタ|コールバック関数)
function Sample24(mode){
var li = jQuery('.Sample24 li').css('background','').css('border','1px solid silver');
switch(mode){
// CSSセレクタでフィルタリング
case 'css':
li.filter('.SampleType-B','.SampleType-D').css('background','silver').css('border','2px solid red');
break;
// コールバック関数でフィルタリング
case 'func':
li.filter(function(index){
return ((index == 0) || ( jQuery(this).text() == '6' ) || jQuery(this).hasClass('SampleType-C') );
}).css('background','silver').css('border','2px solid blue');
break;
}
}
実装例
リスト5. not(CSSセレクタ|コールバック関数)
function Sample25(mode){
var li = jQuery('.Sample25 li').css('background','').css('border','1px solid silver');
switch(mode){
// CSSセレクタでフィルタリング
case 'css':
li.not('.SampleType-B','.SampleType-D').css('background','silver').css('border','2px solid red');
break;
// コールバック関数でフィルタリング
case 'func':
li.not(function(index){
return ((index == 0) || ( jQuery(this).text() == '6' ) || jQuery(this).hasClass('SampleType-C') );
}).css('background','silver').css('border','2px solid blue');
break;
}
}
実装例
リスト6. slice(start [,end])
function Sample26(sw){
var li = jQuery('.Sample26 li').css('background','').css('border','1px solid silver');
if( sw ){
// 範囲選択
li.slice( 4, -1).css('background','silver').css('border','2px solid red');
}
}
実装例
リスト7. map(コールバック関数)
function Sample27(){
var arr = jQuery('.Sample27 li').map(function(index){
// 結果を「番号:クラス名」に変換します。
return ( index + ':' + jQuery(this).attr('class'));
}).get();
alert( arr.join('\n'));
}
実装例
リスト8. is(CSSセレクタ|コールバック関数)
function Sample28(){
var slc = jQuery('#Sample28').val();
var li = jQuery('.Sample28 li');
var res = li.is('.' + slc) ? slc + 'はある。' : slc + 'は無い!!';
alert( res );
}
実装例
存在確認:
リスト9. hasClass(クラス名)
function Sample29(){
var slc = jQuery('#Sample29').val();
var li = jQuery('.Sample29 li');
var res = slc + 'は無い!!';
if( li.hasClass(slc) ){
res = slc + 'はある。\n' + li.filter('.' + slc).attr('class');
}
alert( res);
}
実装例
存在確認:
jQueryでは特定要素の子要素を検索したり、追加検索することができます。
リスト10. add(CSSセレクタ)
function Sample310(){
var slcA = jQuery('#Sample310a').val();
var slcB = jQuery('#Sample310b').val();
var li = jQuery('.Sample310 li').css('color','').css('font-weight','');
if( slcB == '' ){
// 初めのクラスだけ適用
li.filter('.' + slcA).css('color','red').css('font-weight','bold');
}
else
{
// 初めのクラスと追加のクラスに適用
li.filter('.' + slcA).add('.' + slcB).css('color','blue').css('font-weight','bold');
}
}
実装例
クラス選択: 追加クラス:
リスト11. children([CSSセレクタ])
function Sample311(){
var li = jQuery('.Sample311').children('li').css('color','red').css('font-weight','bold');
li.children().children(':last').css('color','blue');
}
実装例
リスト12. closest([CSSセレクタ])
function Sample312(){
var li = jQuery('.Sample312 li');
var ch = li.children('b').closest('li');
ch.click(function(e){
li.css('background','');
jQuery(e.target).css('background','silver');
});
}
実装例
上記のうち、太文字を持つ要素だけクリックに反応します。
リスト13. contents()
function Sample313(){
jQuery('p.Sample313').contents().css('color','red');
}
実装例
テキストノードだけを赤くします。
但し太文字(B要素)のところや
SPAN要素内だけが適用されます。
リスト14. find(CSSセレクタ)
function Sample314(){
var now = new Date();
var time = now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds();
jQuery('p.Sample314').find('time').text(time);
}
実装例
今の時刻はです。
This time is .
time要素のところが現在時刻になります。
リスト15. next([CSSセレクタ])
function Sample315(){
var x = Math.floor( Math.random() * 10 );
var li = jQuery('li.Sample315').css('color','');
li.eq(x).next().css('color','red');
jQuery('span.Sample315').text(x);
}
実装例
-番目を選択の次は?リスト16. nextAll([CSSセレクタ])
function Sample316(){
var x = Math.floor( Math.random() * 10 );
var li = jQuery('li.Sample316').css('color','');
li.eq(x).nextAll().css('color','red');
jQuery('span.Sample316').text(x);
}
実装例
-番目を選択の後は?リスト17. prev([CSSセレクタ])
function Sample317(){
var x = Math.floor( Math.random() * 10 );
var li = jQuery('li.Sample317').css('color','');
li.eq(x).prev().css('color','red');
jQuery('span.Sample317').text(x);
}
実装例
-番目を選択の直前は?リスト18. prevAll([CSSセレクタ])
function Sample318(){
var x = Math.floor( Math.random() * 10 );
var li = jQuery('li.Sample318').css('color','');
li.eq(x).prevAll().css('color','red');
jQuery('span.Sample318').text(x);
}
実装例
-番目を選択より前は?リスト19. siblings([CSSセレクタ])
function Sample319(){
var x = Math.floor( Math.random() * 10 );
var li = jQuery('li.Sample319').css('color','');
li.eq(x).siblings().css('color','red');
jQuery('span.Sample319').text(x);
}
実装例
-番目の他は?リスト20. parent([CSSセレクタ])
function Sample320(me){
var arr = jQuery(me).parent().map(function(){
return this.tagName;
}).get();
alert('親要素は' + arr.join('<'));
}
実装例
リスト21. parents([CSSセレクタ])
function Sample321(me){
var arr = jQuery(me).parents().map(function(){
return this.tagName;
}).get();
alert('先祖要素は' + arr.join('<'));
}
実装例
jQueryでは入れ子の状態を連鎖して抽出することができます。
リスト22. andSelf([CSSセレクタ])
function Sample422(){
var x = Math.floor( Math.random() * 10 );
var li = jQuery('.Sample422 li').css('color','').css('border','');
li.eq(x).css('color','red');
li.andSelf().css('border','2px solid red');
jQuery('span.Sample422').text(x);
}
実装例
-番目は?リスト23. end([CSSセレクタ])
function Sample423(){
var x = Math.floor( Math.random() * 10 );
var li = jQuery('.Sample423 li').css('color','').css('border','');
li.eq(x).css('color','red');
li.end().css('border','2px solid red');
jQuery('span.Sample423').text(x);
}
実装例
-番目は?