jQueryのフィルタを使った際の実装サンプルと基本的な機能のまとめ

Ads

Warning: Undefined array key "HTTP_USER_AGENT" in /home/youhei0828/kachibito.net/public_html/wp-content/themes/kachibito7_with_cocoon_child/functions-module/other/tiny-fixed.php on line 75

jQueryのフィルターが便利なんですが、
なかなか全部把握出来ないので自分用
にまとめることにしました。マイチート
みたいな記事です。フィルターはかゆい
ところに手が届く便利なもので、場合
によってはコードも短く済ませること
も出来るかもしれません。

というわけでフィルター一覧です。あんまり把握出来てなかったのでこの機会に全部目を通して触ってみました。機能というか、どんな感じで要素を取得出来るか、みたいな内容になります。

しっかり使いこなしてきた人間の書いてる記事じゃないので、もしかしたら解説が間違ってるかもしれません。一応公式のリファレンス見ながらやってますけどそれでも勘違いしていたらご指摘頂けると嬉しいです。

カテゴリごとにjsfiddleで全サンプルを用意してありますのでフォークしてご自身向けに変更して頂ければと思います。

Basic Filter(基本フィルタ)

Sample

基本フィルタの全サンプルです。フィルタの説明はjavascriptのコード内のコメントアウトでしています。フォークは一番右の+ボタンから。

以下解説です。

animated


アニメーションしてる要素だけを取得できる

//:animatedでアニメーションしてる要素にだけclass="colored"を加える
$("div:animated").toggleClass("colored");

eq()


集合している要素から、~番目指定で単一エレメントを取得できる。

//ul liの3番目だけ色を赤くする
$("ul#ep  li:eq(2)").css("color", "red");

※1つ目は0と数えますので「eq(2)」と書いた場合は3つ目です。

even


集合している要素から、(0から数えて)偶数行のみ取得できる。

//ul liの偶数行だけ赤くする
$("ul#even li:even").css("color", "red");

※1つ目は0なので3つ目が「2」扱い(偶数)

odd


集合している要素から、(0から数えて)奇数行のみ取得できる。

//ul liの奇数行だけ赤くする
$("ul#odd li:odd").css("color", "red");

first


集合している要素の最初だけ取得できる

//ul liの最初だけ赤くする
$("ul#first li:first").css("color", "red");

last


集合している要素の最後だけ取得できる

//ul liの最後だけ赤くする
$("ul#last li:last").css("color", "red");

gt()


集合している要素から、~番目の後を全て取得できる

//ul liの3番目より後の色を全て赤くする
$("ul#gt  li:gt(2)").css("color", "red");

lt()


集合している要素から、~番目より前を全て取得できる

//ul liの3番目より前の色を全て赤くする
$("ul#lt  li:lt(2)").css("color", "red");

header


見出し要素(h1~h6)を全て取得する

//ul内の見出し(h1~h6)を全て赤くする
$("ul#header  :header").css("color", "red");

※cssで!important指定した場合はそちら優先

not()


セレクタに一致した要素内で、:not(.red)というセレクタに一致する要素以外を取得

//ul liのうちの、class="red"に一致する要素以外を赤くする
$("ul#not li:not(.red)").css("color", "red");

focus


現在フォーカス中の要素を取得する

//focus のinput要素で現在フォーカスされている要素を選択
    $('form#focus *:input').bind( 'focus blur', function(){
        var item = $(this);
        setTimeout(function(){
            item.toggleClass('focused', item .is(':focus'));
        },0);
    });

Basic Filter

Child Filter(子要素フィルタ)

Sample

子要素フィルタの全サンプルです。cssでもお馴染みのものがありますね。同じ感覚でクロスブラウザに対応できる、と考えて頂けると分かりやすいでしょうか・・

first-child


集合している要素内で、親要素ごとの最初の子要素を全て取得できる

//ul liのうちの、親要素毎の最初のliを赤くする
 $("ul.first li:first-child").css("color", "red");

※firstが「要素全体の最初だけ」に対してfirst-childは「親要素ごとの最初の子要素」を取得する

last-child


集合している要素内で、親要素ごとの最後の子要素を全て取得できる

//ul liのうちの、親要素毎の最初のliを赤くする
 $("ul.last li:last-child").css("color", "red");

※lastが「要素全体の最初だけ」に対してlast-childは「親要素ごとの最初の子要素」を取得する

nth-child()


集合している要素内で、親要素ごとの(n)番目の子要素を全て取得できる

//ul liのうちの、親要素毎の最初のliを赤くする
 $("ul.nth li:nth-child(3)").css("color", "red");

※eqが「要素全体のn番目だけ」に対してnth-childは「親要素ごとの最初の子要素」を取得する
※nth-childは、()内の数字が0からではなく、1から始まる(ややこしいわ!)
※偶数、奇数や~個飛ばし、などの細かい指定も出来る
※「英語のまま考えればいい」と教わりました。なるほどwウホッってなりました。ありがとうございます:D

only-child


集合している要素内で、親要素ごとの唯一の子要素(例ではspanのある子要素のみ)を全て取得できる

//ul liのうちの、spanのあるliを赤くする
 $("ul.only li span:only-child").css("color", "red");

Child Filter

Content Filter(コンテンツフィルタ)

Sample

コンテンツフィルタの全サンプルです。特定の文字列を含んだ要素を取得できる、などなど細かい指令を可能にしてくれます。

:contains()


引数で渡された文字列を含む要素を取得できる

//ul liの「red」というテキストを含む要素赤くする
 $("ul.contains li:contains('red')").css("color", "red");

:empty


要素が空のものを取得できる

//ul liで要素が空のものに「無いです!」というテキストを加えて赤くする
 $("ul.empty li:empty").text("無いです!").css("color", "red");

:has()


指定したセレクタ(例ではspan)を子要素に持つものを取得できる

//ul liでspanを持ったものだけ赤くする
 $("ul.has li:has(span)").css("color", "red");

:parent


指定した親要素を持った子要素で空ではないものを取得できる

//ul liを親に持つspanを赤くする
 $("ul.parent li span:parent").css("color", "red");

※これは僕の例が分かりにくいですね・・・少しややしいですが、color:red;はspanにかかります。
※:emptyの逆と考える
※【追記】「他の要素を持つspan要素」あるいは「空ではないspan要素」を選択する、と書いたほうがいいとコメントで教えてもらいました!有難うございます

Content Filter

Attribute(属性フィルタ)

一応補足ですが、属性ってのはidとかclassとかrelとかtitleとかnameとかそんなんです。

書き方で少し注意点といいますか・・引用符に関して。

$(“ul li[class=’sub01′]”)

このように引用符はシングルとダブルを別途使います。これは逆でも結構です。

$(“ul li[class=\”sub01\”]”)

両方使いたい場合は上記のようにエスケープする必要がありますので注意してください。

Sample

属性フィルタの全サンプルです。良くあるツールチップなんかも属性フィルタでnameやtitleを取得して表示させたりしてます。cssが得意な方はピンとくるのでは無いでしょうか。

マークアップは最後の以外は全て共通です。

<ul class="attribute-n">
    <li>list0</li>
    <li class="eg-01 sub03">list1</li>
    <li>list2</li>
    <li class="eg-02 sub04">list3</li>
</ul>

全部このマークアップで属性フィルタのみで取得する要素を変えています。また、ここではclass属性を例にして見出し等を書いてます。

あと、画像はハイフン入れ忘れてたりしますが、サンプルは全部入ってます。

[class]


指定した属性を持つ要素を取得できる

//ul liでclassを持った要素だけ赤くする
 $("ul.attribute-01 li[class]").css("color", "red");

[class=”value”]


指定した、特定の属性を持つ要素を取得できる

//ul liでclass='eg-02 sub04'を持った要素だけ赤くする
 $("ul.attribute-02 li[class='eg-02 sub04']").css("color", "red");

※class=’eg-02’だけでは取得出来ない

[class!=”value”]


指定した、特定の属性を持つ要素以外を取得できる

//ul liでclass='eg-01'を持った要素以外を赤くする
 $("ul.attribute-03 li[class!='eg-01 sub03']").css("color", "red");

※属性の後に!を付けるとデフォルトと逆の意味になる
※class=’eg-01’だけでは取得出来ない

[class^=”value”]


指定した、属性が特定の文字列で始まる要素を取得できる

//ul liでclass名がegで始まる要素を赤くする
 $("ul.attribute-04 li[class^='eg']").css("color", "red");

[class$=”value”]


指定した、属性が特定の文字列で終わる要素を取得できる

//ul liでclass名が04で終わる要素を赤くする
 $("ul.attribute-05 li[class$='04']").css("color", "red");

※class=’sub04 eg-02’の場合は取得出来ない

[class*=”value”]


指定した、属性が特定の文字列を含む要素を取得できる

//ul liでclass名にg-0が含まれる要素を赤くする
 $("ul.attribute-06 li[class*='g-0']").css("color", "red");

[class~=”value”]


指定した、属性名を含む要素を取得できる

//ul liでclass名にsub04が含まれる要素を赤くする
 $("ul.attribute-07 li[class~='sub04']").css("color", "red");

※class=’eg-02 sub04’でも取得出来る

[class|=”value”]


指定した、属性名とマッチするか、後にハイフンが続く要素を取得できる

//ul liでclass名がegまたはeg-**を含む要素を赤くする
 $("ul.attribute-08 li[class|='eg']").css("color", "red"); 

※class=’eg-02 sub04’は取得出来る
※class=’eg sub04’は取得出来る
※class=’eg02 sub04’は取得出来ない

[name=”value”][name2=”value2″]


指定した、複数の属性名を全て含んだもののみ取得する

//ul liでclass='eg-02 sub04で、idも含んでいる要素を赤くする
 $("ul.attribute-09 li[class='eg-02 sub04'][id]").css("color", "red"); 

※これだけclass=’eg-02 sub04’のli要素にidを含めています

Attribute

対応してる属性の一覧みたいなの欲しいです。全部対応してるのかな?

Form(フォーム)

Sample

フォームの全サンプルです。かなりウザい感じになってますのでフォークしてご自身向けに変えてくださいw

spanでラップしてます。単純なフィルタばかりですので画像はなしでいいでしょうか。

:input

input要素を全て取得できる

//input要素の背景を黄色にする
$("#input :input").wrap('<span></span>').parent().css("background", "yellow");

:button

button要素を全て取得できる

//button要素の背景を黄色にする
$("#button :button").wrap('<span></span>').parent().css("background", "yellow");

:checkbox

checkbox要素を全て取得できる

//checkbox要素の背景を黄色にする
$("#checkbox :checkbox").wrap('<span></span>').parent().css("background", "yellow");

:checked

checked=”checked”の含まれたtype=”checkboxを取得できる

//最初からチェックが入っているcheckbox要素の背景を黄色にする
$("#checked :checked").wrap('<span></span>').parent().css("background", "yellow");

:disabled

disabled=”disabled”の含まれた要素を取得する

//disabled="disabled"で選択不能になっている要素の背景を黄色にする
$("#disabled :disabled").wrap('<span></span>').parent().css("background", "yellow");

:enabled

disabled=”disabled”の含まれた要素以外を取得する

//disabled="disabled"で選択不能になっていない要素の背景を黄色にする
$("#enabled :enabled").wrap('<span></span>').parent().css("background", "yellow");

:file

type=”file”のinput要素を取得する

//type="file"のinput要素の背景を黄色にする
$("#file :file").wrap('<span></span>').parent().css("background", "yellow");

:image

type=”image”のinput要素を取得する

//type="image"のinput要素の背景を黄色にする
$("#image :image").wrap('<span></span>').parent().css("background", "yellow");

:password

type=”password”のinput要素を取得する

//type="password"のinput要素の背景を黄色にする
$("#password :password").wrap('<span></span>').parent().css("background", "yellow");

:radio

type=”radio”のinput要素を取得する

//type="radio"のinput要素の背景を黄色にする
$("#radio :radio").wrap('<span></span>').parent().css("background", "yellow"); 

:reset

type=”reset”のinput要素を取得する

//type="reset"のinput要素の背景を黄色にする
$("#reset :reset").wrap('<span></span>').parent().css("background", "yellow");

:selected

selected=”selected”の付いたselect要素を取得する

// selected="selected"の付いたselect要素の背景を黄色にする
$("#selected option:selected").css("background", "yellow");  

:submit

type=”submit”のinput要素を取得する

//type="submit"のinput要素の背景を黄色にする
$("#submit input:submit").wrap('<span></span>').parent().css("background", "yellow"); 

※input:submitではなく、:submitのみだとbutton要素も含まれる・・?

:text

text要素を取得する

//text要素の背景を黄色にする
$("#text :text").css("background", "yellow"); 

Form

Visibility Filter(可視フィルタ)

Sample

可視フィルタの全サンプルです。2つしかないけど。

:hidden

非表示の要素を取得出来る

//非表示になっているものを全て表示する
$(".hiddenbutton").click(function(){
    $("ul li:hidden").show();
    });

:visible

表示されている要素を取得出来る

//表示されているものを非表示にする
$(".visiblebutton").click(function(){
    $("ul.visible li").hide();
    });

Visibility Filter

以上、とっても便利なjQueryのフィルター一覧でした。これらを覚えればCSS3を簡単にクロスブラウザに対応させられたりしますのでいろいろ試してみてください。

これは一応ただの基本で、さらにセレクタなども組み合わせていくといろいろ出来るようになってjQueryが楽しくなります。ハムメディアさんも以前いろいろ試されてました。こういうので発見があったりして結構楽しいです。

まだまだ勉強中なのでお詳しい方、間違い等ありましたらお手数ですがご指摘頂ければ幸いです。

version 3.0.83 (Wed, 16 Apr 2014 03:56:09 GMT)
http://alexgorbatchev.com/SyntaxHighlighter
JavaScript code syntax highlighter.
Copyright 2004-2013 Alex Gorbatchev.
If you like this script, please donate to
keep development active!

'}},vars:{discoveredBrushes:null,highlighters:{}},brushes:{},regexLib:{multiLineCComments:XRegExp("/\\*.*?\\*/","gs"),singleLineCComments:/\/\/.*$/gm,singleLinePerlComments:/#.*$/gm,doubleQuotedString:/"([^\\"\n]|\\.)*"/g,singleQuotedString:/'([^\\'\n]|\\.)*'/g,multiLineDoubleQuotedString:XRegExp('"([^\\\\"]|\\\\.)*"',"gs"),multiLineSingleQuotedString:XRegExp("'([^\\\\']|\\\\.)*'","gs"),xmlComments:XRegExp("(<|<)!--.*?--(>|>)","gs"),url:/https?:\/\/[\w-.\/?%&=:@;#]*/g,phpScriptTags:{left:/(<|<)\?(?:=|php)?/g,right:/\?(>|>)/g,eof:!0},aspScriptTags:{left:/(<|<)%=?/g,right:/%(>|>)/g},scriptScriptTags:{left:/(<|<)\s*script.*?(>|>)/gi,right:/(<|<)\/\s*script\s*(>|>)/gi}},toolbar:{getHtml:function(e){function t(e,t){return B.toolbar.getButtonHtml(e,t,B.config.strings[t])}for(var n='

',r=B.toolbar.items,i=r.list,a=0,l=i.length;l>a;a++)n+=(r[i[a]].getHtml||t)(e,i[a]);return n+="

"},getButtonHtml:function(t,n,r){return n=e(n),''+e(r)+""},handler:function(e){function t(e){var t=RegExp(e+"_(\\w+)"),n=t.exec(r);return n?n[1]:null}var n=e.target,r=n.className||"",i=s(g(n,".syntaxhighlighter").id),a=t("command");i&&a&&B.toolbar.items[a].execute(i),e.preventDefault()},items:{list:["expandSource","help"],expandSource:{getHtml:function(e){if(1!=e.getParam("collapse"))return"";var t=e.getParam("title");return B.toolbar.getButtonHtml(e,"expandSource",t?t:B.config.strings.expandSource)},execute:function(e){var t=o(e.id);r(t,"collapsed")}},help:{execute:function(){var e=x("","_blank",500,250,"scrollbars=0"),t=e.document;t.write(B.config.strings.aboutDialog),t.close(),e.focus()}}}},findElements:function(e,t){var n=t?[t]:i(document.getElementsByTagName(B.config.tagName)),r=B.config,a=[];if(r.useScriptTags&&(n=n.concat(A())),0===n.length)return a;for(var l=0,s=n.length;s>l;l++){var o={target:n[l],params:p(e,E(n[l].className))};null!=o.params.brush&&a.push(o)}return a},highlight:function(e,t){var n=this.findElements(e,t),r="innerHTML",i=null,a=B.config;if(0!==n.length)for(var l=0,s=n.length;s>l;l++){var o,t=n[l],u=t.target,c=t.params,g=c.brush;if(null!=g){if("true"==c["html-script"]||1==B.defaults["html-script"])i=new B.HtmlScript(g),g="htmlscript";else{var h=b(g);if(!h)continue;i=new h}o=u[r],a.useScriptTags&&(o=M(o)),""!=(u.title||"")&&(c.title=u.title),c.brush=g,i.init(c),t=i.getDiv(o),""!=(u.id||"")&&(t.id=u.id),u.parentNode.replaceChild(t,u)}}},all:function(e){m(window,"load",function(){B.highlight(e)})}};return B.Match=function(e,t,n){this.value=e,this.index=t,this.length=e.length,this.css=n,this.brushName=null},B.Match.prototype.toString=function(){return this.value},B.HtmlScript=function(e){function t(e,t){for(var n=0,r=e.length;r>n;n++)e[n].index+=t}function n(e){for(var n,a=e.code,l=[],s=r.regexList,o=e.index+e.left.length,u=r.htmlScript,c=0,g=s.length;g>c;c++)n=L(a,s[c]),t(n,o),l=l.concat(n);null!=u.left&&null!=e.left&&(n=L(e.left,u.left),t(n,e.index),l=l.concat(n)),null!=u.right&&null!=e.right&&(n=L(e.right,u.right),t(n,e.index+e[0].lastIndexOf(e.right)),l=l.concat(n));for(var h=0,g=l.length;g>h;h++)l[h].brushName=i.brushName;return l}var r,i=b(e),a=new B.brushes.Xml,l=this,s="getDiv getHtml init".split(" ");if(null!=i){r=new i;for(var o=0,u=s.length;u>o;o++)(function(){var e=s[o];l[e]=function(){return a[e].apply(a,arguments)}})();return null==r.htmlScript?(v(B.config.strings.brushNotHtmlScript+e),void 0):(a.regexList.push({regex:r.htmlScript.code,func:n}),void 0)}},B.Highlighter=function(){},B.Highlighter.prototype={getParam:function(e,t){var n=this.params[e];return d(null==n?t:n)},create:function(e){return document.createElement(e)},findMatches:function(e,t){var n=[];if(null!=e)for(var r=0,i=e.length;i>r;r++)"object"==typeof e[r]&&(n=n.concat(L(t,e[r])));return this.removeNestedMatches(n.sort(k))},removeNestedMatches:function(e){for(var t=0,n=e.length;n>t;t++)if(null!==e[t])for(var r=e[t],i=r.index+r.length,a=t+1,n=e.length;n>a&&null!==e[t];a++){var l=e[a];if(null!==l){if(l.index>i)break;l.index==r.index&&l.length>r.length?e[t]=null:l.index>=r.index&&i>l.index&&(e[a]=null)}}return e},figureOutLineNumbers:function(e){var t=[],n=parseInt(this.getParam("first-line"));return y(e,function(e,r){t.push(r+n)}),t},isLineHighlighted:function(e){var t=this.getParam("highlight",[]);return"object"!=typeof t&&null==t.push&&(t=[t]),-1!=h(t,""+e)},getLineHtml:function(e,t,n){var r=["line","number"+t,"index"+e,"alt"+(""+(0==t%2?1:2))];return this.isLineHighlighted(t)&&r.push("highlighted"),0==t&&r.push("break"),'

'+n+"

"},getLineNumbersHtml:function(e,t){var n="",r=a(e).length,i=parseInt(this.getParam("first-line")),l=this.getParam("pad-line-numbers");1==l?l=(""+(i+r-1)).length:1==isNaN(l)&&(l=0);for(var s=0;r>s;s++){var o=t?t[s]:i+s,e=0==o?B.config.space:S(o,l);n+=this.getLineHtml(s,o,e)}return n},getCodeLinesHtml:function(e,t){e=C(e);for(var n=a(e),r=(this.getParam("pad-line-numbers"),parseInt(this.getParam("first-line"))),e="",i=this.getParam("brush"),l=0,s=n.length;s>l;l++){var o=n[l],u=/^( |\s)+/.exec(o),c=null,g=t?t[l]:r+l;null!=u&&(c=""+u[0],o=o.substr(c.length),c=c.replace(" ",B.config.space)),o=C(o),0==o.length&&(o=B.config.space),e+=this.getLineHtml(l,g,(null!=c?''+c+"":"")+o)}return e},getTitleHtml:function(t){return t?"

"+e(t)+"

":""},getMatchesHtml:function(e,t){function n(e){var t=e?e.brushName||a:a;return t?t+" ":""}for(var r=0,i="",a=this.getParam("brush",""),l=0,s=t.length;s>l;l++){var o,u=t[l];null!==u&&0!==u.length&&(o=n(u),i+=N(e.substr(r,u.index-r),o+"plain")+N(u.value,o+u.css),r=u.index+u.length+(u.offset||0))}return i+=N(e.substr(r),n()+"plain")},getHtml:function(t){var n,r,i,a="",s=["syntaxhighlighter"];return 1==this.getParam("light")&&(this.params.toolbar=this.params.gutter=!1),className="syntaxhighlighter",1==this.getParam("collapse")&&s.push("collapsed"),0==(gutter=this.getParam("gutter"))&&s.push("nogutter"),s.push(this.getParam("class-name")),s.push(this.getParam("brush")),t=w(t).replace(/\r/g," "),n=this.getParam("tab-size"),t=1==this.getParam("smart-tabs")?R(t,n):H(t,n),this.getParam("unindent")&&(t=P(t)),gutter&&(i=this.figureOutLineNumbers(t)),r=this.findMatches(this.regexList,t),a=this.getMatchesHtml(t,r),a=this.getCodeLinesHtml(a,i),this.getParam("auto-links")&&(a=I(a)),"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.match(/MSIE/)&&s.push("ie"),a='

'+(this.getParam("toolbar")?B.toolbar.getHtml(this):"")+''+this.getTitleHtml(this.getParam("title"))+""+""+(gutter?'":"")+'"+""+""+"
'+this.getLineNumbersHtml(t)+"'+'
'+a+"
"+"
"+"

"},getDiv:function(e){null===e&&(e=""),this.code=e;var t=this.create("div");return t.innerHTML=this.getHtml(e),this.getParam("toolbar")&&m(c(t,".toolbar"),"click",B.toolbar.handler),this.getParam("quick-code")&&m(c(t,".code"),"dblclick",X),t},init:function(e){this.id=f(),u(this),this.params=p(B.defaults,e||{}),1==this.getParam("light")&&(this.params.toolbar=this.params.gutter=!1)},getKeywords:function(e){return e=e.replace(/^\s+|\s+$/g,"").replace(/\s+/g,"|"),"\\b(?:"+e+")\\b"},forHtmlScript:function(e){var t={end:e.right.source};e.eof&&(t.end="(?:(?:"+t.end+")|$)"),this.htmlScript={left:{regex:e.left,css:"script"},right:{regex:e.right,css:"script"},code:XRegExp("(?"+e.left.source+")"+"(?.*?)"+"(?"+t.end+")","sgi")}}},B}();"undefined"!=typeof exports?exports.SyntaxHighlighter=SyntaxHighlighter:null