HTML5を使用したカスタムデータ属性のjQueryセレクター


636

HTML5に付属するこれらのデータ属性に使用できるセレクターを知りたいのですが。

例としてこのHTMLを取り上げます。

<ul data-group="Companies">
  <li data-company="Microsoft"></li>
  <li data-company="Google"></li>
  <li data-company ="Facebook"></li>
</ul>

取得するセレクターはありますか?

  • data-company="Microsoft"以下のすべての要素"Companies"
  • data-company!="Microsoft"以下のすべての要素"Companies"
  • 他の場合では、「含む、より小さい、より大きいなど」などの他のセレクターを使用できます。

4
ここを見ると、api.jquery.com / category / selectorsが必要なものがすべて見つかります:-)
Allan

回答:


1005
$("ul[data-group='Companies'] li[data-company='Microsoft']") //Get all elements with data-company="Microsoft" below "Companies"

$("ul[data-group='Companies'] li:not([data-company='Microsoft'])") //get all elements with data-company!="Microsoft" below "Companies"

jQueryセレクターを見てください:containsはセレクターです

これは:containsセレクターに関する情報です


これは機能しますか?$('div[data-col="1"][data-row="2"]') これは、data-colが1でdata-rowが2のdivを選択しますか、それともどちらかを選択しますか?
LuudJacobs

10
データが.data( 'something'、value)を介して設定されている場合、これは機能しますか?多くの場合、これは値をアタッチするときに実際の属性を作成しません。OPは属性に関してかなり具体的であることがわかっていますが、他の人がこのセレクターに問題を抱えている場合に備えて、意識を高めたいと思いました。
AaronLS 2013

15
@AaronLSいいえ(少なくとも古いバージョンのjQuery、たとえば1.4.4ではそうではありません)-HTMLで.attr('data-something', 'value')更新を確認するには、を使用してデータを設定する必要があります。stackoverflow.com/questions/6827810/…
Matty J

data呼び出しを入力せずにデータ属性値を取得する方法はありませんか?
ahnbizcad 2014

@gwho$('#element').data('something')
ガウイ14

69

jQuery UI使用可能な:data()セレクターも付いています。それはバージョン1.7.0から存在しているようです。

次のように使用できます。

data-company属性を持つすべての要素を取得する

var companyElements = $("ul:data(group) li:data(company)");

data-company等しいすべての要素を取得するMicrosoft

var microsoft = $("ul:data(group) li:data(company)")
                    .filter(function () {
                        return $(this).data("company") == "Microsoft";
                    });

data-company等しくないすべての要素を取得するMicrosoft

var notMicrosoft = $("ul:data(group) li:data(company)")
                       .filter(function () {
                           return $(this).data("company") != "Microsoft";
                       });

等...

新しい:data()セレクターの1つの注意点は、コードを選択するためにコードdata値を設定する必要があることです。つまり、上記が機能するためには、HTML でを定義するだけでは不十分です。最初にこれを行う必要があります。data

$("li").first().data("company", "Microsoft");

これは$(...).data("datakey", "value")、この方法または類似の方法で使用する可能性が高い単一ページアプリケーションに適しています。


私はあなたの警告を取得しません。これは私にとってはうまくいき、私はjs内のデータへの他の参照を行いません。$( '#id')。text($( '#mydatasource')。data( 'empty')); これにより、#mydatasource要素のdata-emptyタグのコンテンツが#id要素に入力されます。
キプロスでリラックス2014年

4
@FacebookAnswers :data()セレクタ、または.data()メソッドを使用しましたか?
rhughes 2014年

どういう意味かわかります。私はこの方法を使用していましたが、あなたの警告はこの方法に言及していました。
キプロスでリラックス2014年

7
^あなたは彼の警告がセレクタに言及したことを意味します。
ahnbizcad 2014

1
奇妙なことに、今ではJquery 3.3.1のフィドルで機能しているようです。jsfiddle.net/ kai_noack
Kai

39

jsFiddle Demo

jQueryは、探しているクエリを機能させるために、いくつかのセレクター(完全なリスト)を提供します。「他のケースでは、「含む、より小さい、より大きいなど...」のような他のセレクターを使用することは可能ですか?という質問に対処しますこれらのhtml5データ属性を調べるために、contains、starts with、endsを使用することもできます。すべてのオプションを確認するには、上記の完全なリストを参照してください。

基本的なクエリについては上記で説明しました。JohnHartsock回答を使用すると、すべてのdata-company要素を取得するか、Microsoft(または他のバージョンの:not)以外のすべてを取得するのが最善の策になります。

これをあなたが探している他のポイントに拡張するために、いくつかのメタセレクターを使用できます。まず、複数のクエリを実行する場合は、親の選択をキャッシュしておくと便利です。

var group = $('ul[data-group="Companies"]');

次に、このセットでGで始まる会社を探すことができます

var google = $('[data-company^="G"]',group);//google

または、「ソフト」という単語を含む会社

var microsoft = $('[data-company*="soft"]',group);//microsoft

データ属性の終了が一致する要素を取得することも可能です

var facebook = $('[data-company$="book"]',group);//facebook

//stored selector
var group = $('ul[data-group="Companies"]');

//data-company starts with G
var google = $('[data-company^="G"]',group).css('color','green');

//data-company contains soft
var microsoft = $('[data-company*="soft"]',group).css('color','blue');

//data-company ends with book
var facebook = $('[data-company$="book"]',group).css('color','pink');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul data-group="Companies">
  <li data-company="Microsoft">Microsoft</li>
  <li data-company="Google">Google</li>
  <li data-company ="Facebook">Facebook</li>
</ul>


6

Pure / vanilla JSソリューションここでの作業例)

// All elements with data-company="Microsoft" below "Companies"
let a = document.querySelectorAll("[data-group='Companies'] [data-company='Microsoft']"); 

// All elements with data-company!="Microsoft" below "Companies"
let b = document.querySelectorAll("[data-group='Companies'] :not([data-company='Microsoft'])"); 

querySelectorAll有効な使用する必要がありますCSSセレクタ(現在はレベル3を

jQueryおよびPure JSの速度テスト(2018.06.29):テストは、Chrome 67.0.3396.99(64ビット)、Safari 11.0.3(13604.5.6)、Firefox 59.0.2(64上のMacOs High Sierra 10.13.3で実行されました。 -ビット)。以下のスクリーンショットは、最速のブラウザ(Safari)の結果を示しています。

ここに画像の説明を入力してください

PureJSはjQueryよりも高速で、Chromeでは約12%、Firefoxでは21%、Safariでは25%でした。興味深いことに、Chromeの速度は1秒あたり18.9M、Firefox 26M、Safari 160.9M(!)でした。

つまり、勝者はPureJSであり、最速のブラウザはSafariです(Chromeの8倍以上高速です!)。

ここで、マシンでテストを実行できます:https : //jsperf.com/js-selectors-x

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.