jQueryどのようにデータ属性値に基づいて要素を見つけるのですか?


994

次のシナリオがあります。

var el = 'li';

また<li>、ページには5つのdata-slide=number属性があり、それぞれ1、2、3、4、5です

次に、var current = $('ul').data(current);スライドが変更されるたびにマップされ、更新される現在アクティブなスライド番号を見つける必要があります。

これまでのところ、現在のスライドに一致するセレクターを作成しようとして、失敗しました。

$('ul').find(el+[data-slide=+current+]);

一致/返却しない…

liパーツをハードコードできないのは、これがユーザーがアクセスできる変数であり、必要に応じて別の要素に変更できるため、常にであるとは限らないためliです。

私が欠けているものについてのアイデアはありますか?


6
あなた.find(el+[data-slide=+current+]);が書いたコードはあなたの中に確実にありますか?あなたはいくつかの引用を逃したようです"[data-slide]"
xandy

これが、(値に関係なく)すべてのデータ属性を選択するのに役立ちました。$('*[data-slide]')たとえば、次のように使用できます$('*[data-slide]').each( function() { ... });
Kai Noack

回答:


1481

あなたはの価値を注入する必要があるcurrent属性が等しいセレクタ:

$("ul").find(`[data-slide='${current}']`)

古いJavaScript環境(ES5以前)の場合:

$("ul").find("[data-slide='" + current + "']"); 

8
@ジャニス、あなたはそうすることができました$("ul").find(el + "[data-slide='" + current +"']");
フレデリックハミディ2010年

7
@ c00lryguy、jQuery UIが 1つを定義し、スタンドアロンの実装があります。それをjQuery Coreに追加する試みは拒否されたようです。二度
フレデリックハミディ2012

6
同様の投稿に対するこの回答には、フィルター関数の例があります
drzaus

77
データがjQuery .data(...)関数を介して追加された場合、これは常に属性をレンダリングするわけではなく、ブラウザー固有のストレージメカニズムを使用するため、これが機能しないのではないかと心配しています。jQueryコアにデータ固有のセレクターが必要なもう1つの理由は。
AaronLS 2012年

77
$( '#element')。data( 'some-att-name'、value);でデータを設定する要素では機能しないことに注意してください。ただし、ハードコードされた属性を持つもののみ。私はこの問題を抱えており、属性を直接書き込むことでデータを機能させるには$( '#element')。attr( 'data-some-att-name'、value);
Pawel 2013年

463

これらすべてを入力したくない場合は、データ属性でクエリする簡単な方法を次に示します。

$("ul[data-slide='" + current +"']");

参考までに:http : //james.padolsey.com/javascript/a-better-data-selector-for-jquery/


31
あなたが気にするあなたのために、<ul><li data-slide="item"></li></ul>この回答のセレクターが与えられた構造が与えられた場合、未定義を返すので、それはユーザーのシナリオが与えられた場合には機能しません。この答えは構造<ul data-slide="item"><li></li></ul> に役立ちます。簡潔さのためにその人気が高い理由を理解していますが、技術的には正しくありません。jsfiddle.net/py5p2abL/1
akousmata 14

4
配列として扱うことを忘れないでください。[0]見つかった最初の要素にアクセスするために使用します。
Aminah Nuraini 2016年

奇妙な副作用...このメソッドは、要素がデータ属性と一致するときに機能.find("[data-attrib='value']")しませんでした。値がjQueryによって追加されたデータ属性であるかどうかはわかりません...
エラーのある

1
2つの答えは2つの異なることをするので、それは奇妙ではありません。$.find具体的にその要素の子孫検索しますが、セレクター文字列でフィルター構文を使用すると、結果がフィルターされます。
Phil

227

[データ-X = ...]で検索する場合、気をつけ、それがjQuery.data(..)セッターとの仕事をしません

$('<b data-x="1">'  ).is('[data-x=1]') // this works
> true

$('<b>').data('x', 1).is('[data-x=1]') // this doesn't
> false

$('<b>').attr('data-x', 1).is('[data-x=1]') // this is the workaround
> true

代わりにこれを使用できます:

$.fn.filterByData = function(prop, val) {
    return this.filter(
        function() { return $(this).data(prop)==val; }
    );
}

$('<b>').data('x', 1).filterByData('x', 1).length
> 1

1
$.fn.filterByData素晴らしいです。ただし、これはコピーペーストの警告です...でタグ$('<b>').filterByData('x', 1)を検索するだけです。部分をコピーして貼り付けると、フィルタリングする前に「1」に設定します。<b>data-x="1".data(x, 1)data-x
WEBjuju

39

psycho brmのfilterByData拡張機能を改善しました jQuery。

以前の拡張機能がキーと値のペアを検索した場合、この拡張機能を使用すると、値に関係なく、データ属性の存在をさらに検索できます。

(function ($) {

    $.fn.filterByData = function (prop, val) {
        var $self = this;
        if (typeof val === 'undefined') {
            return $self.filter(
                function () { return typeof $(this).data(prop) !== 'undefined'; }
            );
        }
        return $self.filter(
            function () { return $(this).data(prop) == val; }
        );
    };

})(window.jQuery);

使用法:

$('<b>').data('x', 1).filterByData('x', 1).length    // output: 1
$('<b>').data('x', 1).filterByData('x').length       // output: 1

またはフィドル:http : //jsfiddle.net/PTqmE/46/


34

JQueryなし、ES6

document.querySelectorAll(`[data-slide='${current}']`);

私は質問がJQueryについてであることを知っていますが、読者は純粋なJSメソッドを望んでいるかもしれません。


33

jQueryとdata- *属性を使用して要素をフェッチするときに、同じ問題に直面しました。

参考までに、最短のコードはここにあります:

これは私のHTMLコードです:

<section data-js="carousel"></section>
<section></section>
<section></section>
<section data-js="carousel"></section>

これは私のjQueryセレクタです:

$('section[data-js="carousel"]');
// this will return array of the section elements which has data-js="carousel" attribute.


15

このセレクター$("ul [data-slide='" + current +"']");は、次の構造で機能します。

<ul><li data-slide="item"></li></ul>  

これ$("ul[data-slide='" + current +"']");は動作しますが:

<ul data-slide="item"><li></li></ul>


12

元の要素タイプを事前に知らなくてもこれを機能させる方法についての彼の元の質問に戻って、以下はこれを行います:

$(ContainerNode).find(el.nodeName + "[data-slide='" + current + "']");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.