.data()キー/値に基づくフィルター要素


116

私がclassを持つ4つのdiv要素を持っている.navlinkとします。これは、クリック.data()されたときに、というキー'selected'をの値に設定するために使用しますtrue

$('.navlink')click(function() { $(this).data('selected', true); })

新しいもの.navlinkがクリックされるたびにnavlink、後で操作するために以前に選択したものを保存したいと思います。を使用して保存されたものに基づいて要素をすばやく簡単に選択する方法はあり.data()ますか?

法案に合うjQuery :filtersはないようで、(同じクリックイベント内で)次のことを試しましたが、何らかの理由で機能しません:

var $previous = $('.navlink').filter( 
    function() { $(this).data("selected") == true }
);

これを実現する方法は他にもあることは知っていますが、現時点でそれがを介して実行できるかどうかは、ほとんど気になります.data()

回答:


192

フィルターは機能しますが、フィルターに渡された関数内の一致するオブジェクトでtrueを返す必要があります。

var $previous = $('.navlink').filter(function() { 
  return $(this).data("selected") == true 
});

6
これはこれを行う唯一の方法ではなくなったことに注意してください。StefanoPは代替手段を提供しています
Nathan Koop

3
@NathanKoop、結構です。彼の答えについての私のコメントを見てください。
ブライアンダウニング

データ属性を使用して、ドキュメント内の任意の場所にある、他の方法では検索不可能な要素(div以外のIDなど、何らかの理由でアクセスできるようにする必要がある)を見つける場合:$("*").filter(function() { return $(this).data("DATA IDENTIFIER HERE") == DATA VALUE HERE; });
Tschallacka

これは「乱雑」ではありません。これは、値を「エスケープ」して残りのセレクタと検索語を連結しても不正なセレクタが作成されないようにすることなく、任意の語でフィルタリングする唯一の安全な方法です。
アルニタク2018

145

記録のためだけに、jqueryを使用してデータにフィルターをかけることができます(この質問はかなり古く、jQueryはそれ以来発展してきたため、このソリューションを作成することも適切です)。

$('.navlink[data-selected="true"]');

または、より良い(パフォーマンスについて):

$('.navlink').filter('[data-selected="true"]');

または、data-selectedsetを使用してすべての要素を取得する場合:

$('[data-selected]')

このメソッドは、html属性を介して設定されたデータでのみ機能することに注意しください.data()呼び出しでデータを設定または変更すると、このメソッドは機能しなくなります。


9
それは実質的に同一の質問のための100+の投票で受け入れ答えである-この答えの恐怖のための低投票数あなたの場合stackoverflow.com/questions/4146502
Simon_Weaver

48
-1データが属性.data()ではなくメソッドで設定されている場合、これは機能しませんdata-。次のフィドルを参照してください:jsfiddle.net/bryandowning/tySWC-また、この.find()メソッドは前のセレクターの子を検索します。与えられた例でdata-selectedは、はの子で.navlinkはなくの属性です.navlink。また、$('div p')そして$('div').find('p')本質的に同等です。.find()余分な関数呼び出しのため、使用が遅くなるようです(ただし、これについては前向きではありません)。これについて私が間違っている場合は修正してください(この方法がうまくいくことを本当に望みます)。
ブライアンダウニング

3
いくつかのこと:1).data()jQueryはDOMを検索するため、でデータを設定した場合、これは機能しませんが、他の理由でこの質問にアクセスした人(私のような)に投稿しました。2)正しい。.find()子を検索するので、この例では間違っている。3)間違いです。jQuery
blog /…を

2
それへの賛成投票$('[data-selected]')は私に何かを助けるのに役立ちました$('ul.categories a[data-categories_id]').click(......);
Luke Cousins

また、.attrを使用してデータ属性を更新した場合、.dataを使用して取得した場合、値は更新されないようです。2つを混合する場合は注意してください
Fabio Lolli

13

プラグインをかなり簡単に作成できます。

$.fn.filterData = function(key, value) {
    return this.filter(function() {
        return $(this).data(key) == value;
    });
};

使用法(ラジオボタンをチェックする):

$('input[name=location_id]').filterData('my-data','data-val').prop('checked',true);

あなたは意味の方法をプラグイン ...そう、これが受け入れ答えと同じです
jave.web

@ jave.web確かに。しかし、誰もがそれをプラグインに変える方法を知っているわけではありません。言い回しを更新しました。
mpen

間違って私を得ることはありません、あなたの答えは素晴らしいですが、しかし、ここでの言葉は非常に重要であり、:)更新をありがとう
jave.web

8

私が気付いたのは2つあります(ただし、書き留めたときからの間違いかもしれません)。

  1. 最初の例でドットを逃しました($('.navlink').click
  2. フィルターを機能させるには、値(return $(this).data("selected")==true)を返す必要があります

-1

その価値よりも多くの仕事のように聞こえます。

1)現在選択されているelement \ jQueryオブジェクトへの参照を格納する単一のJavaScript変数を持たないのはなぜですか。

2)現在選択されている要素にクラスを追加しないでください。次に、「。active」クラスなどのDOMをクエリできます。


ええ、でも私が言ったように、それを達成する他の方法があることを知っていました。data()でフィルター処理できるかどうか、そしてfilter()が機能しない理由に悩まされました。ありがとう。
user113716 2009年

ごめんなさい。あなたの質問のその部分を逃しました。
Bryan Migliorisi、2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.