Öğeyi .data () anahtarına / değerine göre filtrele


116

Diyelim .navlinkki, tıklandığında, .data()çağrılan bir anahtarı şu 'selected'değere ayarlamak için kullanılan sınıflı 4 div öğem var true:

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

Her .navlinkyenisine tıklandığında, navlinkdaha sonra işlemek için önceden seçilmiş olanı saklamak istiyorum . Neyi kullanarak depolandığına göre bir öğeyi seçmenin hızlı ve kolay bir yolu var mı .data()?

Görünüşe göre faturaya uyan jQuery : filtreleri yok ve aşağıdakileri denedim (aynı tıklama olayında), ancak bazı nedenlerden dolayı çalışmıyor:

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

Bunu başarmanın başka yolları da olduğunu biliyorum, ama şu anda çoğunlukla sadece bu yolla yapılıp yapılamayacağını merak ediyorum .data().

Yanıtlar:


192

filtreniz çalışır, ancak onları yakalaması için filtreye geçirilen işlevdeki eşleşen nesneler üzerinde true döndürmeniz gerekir.

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

6
Lütfen bunun artık bunu yapmanın tek yolu olmadığını unutmayın, StefanoP alternatifler sundu
Nathan Koop

3
@NathanKoop, pek değil. Cevabı hakkındaki yorumuma bakın.
Bryan Downing

Belgedeki herhangi bir konumda, başka türlü çözülemeyen bir öğeyi (herhangi bir nedenle erişebilmeniz gereken, id daha az div'ler vb.) Bulmak için bir veri niteliği kullananlar için:$("*").filter(function() { return $(this).data("DATA IDENTIFIER HERE") == DATA VALUE HERE; });
Tschallacka

bu "dağınık" değildir - bu, arama teriminin seçicinin geri kalanıyla birleştirilmesinin yasadışı bir seçici oluşturmamasını sağlamak için bu değerlerden "kaçmanızı" gerektirmeden keyfi terimleri filtrelemenin tek güvenli yoludur.
Alnitak

145

Sadece kayıt için, sen yapabilirsiniz (o sıra bu çözümü yazmak için doğru olması için, bu soru oldukça eskidir ve jQuery o zamandan beri gelişti) jquery ile verilere filtre:

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

veya daha iyisi (performans için):

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

veya tüm öğeleri data-selectedset ile almak istiyorsanız :

$('[data-selected]')

Bu yöntemin yalnızca html-öznitelikleri aracılığıyla ayarlanmış verilerle çalışacağını unutmayın . .data()Çağrı ile veri ayarlar veya değiştirirseniz , bu yöntem artık çalışmayacaktır.


9
bu cevap için düşük oy sayısı sizi korkutuyorsa - neredeyse aynı soru için 100'den fazla oyla kabul edilen cevaptır stackoverflow.com/questions/4146502
Simon_Weaver

48
-1 Bu, veriler .data()bir data-öznitelik yerine yöntemle ayarlandığında çalışmaz . Şu kemana bakın: jsfiddle.net/bryandowning/tySWC - Ayrıca, .find()yöntem önceki seçicinin alt öğelerini arar. Verilen örnekte, data-selectedöğesinin .navlinkdeğil öğesinin bir özniteliğidir .navlink. Ayrıca $('div p')ve $('div').find('p')esasen eşdeğerdir. Kullanımı .find()(Bu konuda olumlu değilim rağmen) nedeniyle ekstra fonksiyon çağrısına yavaş olabilir gibi görünüyor. Bu konuda yanılıyorsam lütfen beni düzeltin (bu yöntemin işe yaramasını çok isterdim).
Bryan Downing

3
birkaç şey: 1) .data()jQuery DOM üzerinden arama yaptığı için, bu soruya başka nedenlerle gelenler (benim gibi) için gönderdim; 2) doğru, .find()çocukları araştırır, bu nedenle bu örnekte yanlıştır; 3) yanılıyorsunuz, eşdeğer değiller, çünkü jQuery sağdan sola arama yapıyor, bakınız jonraasch.com/blog/…
StefanoP

2
$('[data-selected]')Bunun için oylama bana şöyle bir şey için yardımcı oldu$('ul.categories a[data-categories_id]').click(......);
Luke Cousins

Ayrıca, .attr kullanarak veri özniteliğini güncellerseniz, .data kullanarak geri alırsanız, değer güncellenmeyecektir - bu nedenle ikisini karıştırırken dikkatli olun
Fabio Lolli

13

Bir eklentiyi oldukça kolay bir şekilde yapabiliriz:

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

Kullanım (bir radyo düğmesini kontrol ederek):

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

Eklenti yöntemini kastediyorsunuz , aksi takdirde bu kabul edilen cevapla aynıdır ...
jave.web

@ jave.web Gerçekten. Ancak herkes onu bir eklentiye nasıl dönüştüreceğini bilmiyor. Güncellenmiş sözler.
mpen

beni yanlış anlamayın, cevabınız harika, ancak buradaki kelimeler çok önemli, güncelleme için teşekkürler :)
jave.web

8

Fark ettiğim iki şey (yazdığın zamanki hatalar olabilirler).

  1. İlk örnekte bir noktayı kaçırdınız ( $('.navlink').click )
  2. Filtrenin çalışması için bir değer ( return $(this).data("selected")==true) döndürmeniz gerekir

-1

Değerinden daha fazla iş gibi görünüyor.

1) Neden şu anda seçili öğe \ jQuery nesnesine bir başvuru depolayan tek bir JavaScript değişkenine sahip değilsiniz?

2) Seçili öğeye neden bir sınıf eklemiyorsunuz? Ardından DOM'u ".active" sınıfı veya başka bir şey için sorgulayabilirsiniz.


Evet, ama dediğim gibi, bunu başarmanın başka yolları olduğunu biliyordum. Sadece data () ile filtrelenip filtrelenemeyeceği ve filter () neden benim için çalışmadığına bağlı kaldım. Yine de teşekkürler.
user113716

Afedersiniz. Sorunuzun o kısmını kaçırdım.
Bryan Migliorisi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.