jQuery nasıl bir veri özniteliği değerine dayalı bir öğe bulmak için?


994

Aşağıdaki senaryo var:

var el = 'li';

ve <li>sayfada her biri bir data-slide=numberniteliğe sahip 5 sayı vardır (sayı sırasıyla 1,2,3,4,5'tir) .

Şimdi var current = $('ul').data(current);her bir slayt değişikliğiyle eşleştirilen ve güncellenen şu anda etkin olan slayt numarasını bulmam gerekiyor .

Şimdiye kadar denemelerim başarısız oldu, mevcut slayda uyan seçiciyi oluşturmaya çalışıyor:

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

hiçbir şey eşleşmiyor / geri dönmüyor…

Parçayı kodlamamamın nedeni li, bu, gerektiğinde farklı bir öğeye değiştirilebilen kullanıcı tarafından erişilebilir bir değişken olmasıdır, bu nedenle her zaman bir olmayabilir li.

Neyi kaçırdığım hakkında bir fikrin var mı?


6
içinde yazdığınız .find(el+[data-slide=+current+]);kod olduğundan emin misiniz? Görünüşe göre bazı alıntıları kaçırdınız"[data-slide]"
xandy

Tüm veri özelliklerini seçmeme yardımcı olan buydu (değer ne olursa olsun): $('*[data-slide]')Örneğin kullanabilirsiniz$('*[data-slide]').each( function() { ... });
Kai Noack

Yanıtlar:


1481

Sen değerini enjekte etmek zorunda currentbir içine Özellik Eşittir seçici:

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

Daha eski JavaScript ortamları için ( ES5 ve öncesi):

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

8
@ Jannis, yapabilirsin $("ul").find(el + "[data-slide='" + current +"']");.
Frédéric Hamidi

7
@ c00lryguy, jQuery UI bir tanesini tanımlar ve etrafında bağımsız uygulamalar vardır . Görünüşe göre jQuery Core'a ekleme girişimleri reddedildi . İki kez .
Frédéric Hamidi

6
Bu cevap benzer bir yazı üzerine filtre fonksiyonu bir örnek vardır
drzaus

77
Veriler jQuery .data (...) işlevi ile eklenmişse bunun işe yaramayacağından endişe ediyorum, çünkü bu her zaman bir öznitelik oluşturmaz ve soemtimes tarayıcıya özel depolama mekanizması kullanır. Keşke jQuery çekirdek veriye özgü bir seçici vardı.
AaronLS

77
$ ('# Element') veri ('some-att-name', value) ile veri ayarladığınız öğeler için çalışmadığına dikkat edin. ancak yalnızca kodlanmış özniteliği olanlar için. Bu sorunu var ve doğrudan $ ('# element') özniteliğini yazarak veri kümesi çalışması çalışması yapmak. Attr ('data-some-att-name', value);
Pawel

463

tüm bunları yazmak istemiyorsanız, veri özelliğine göre sorgulamanın daha kısa bir yolu:

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

Bilginize: http://james.padolsey.com/javascript/a-better-data-selector-for-jquery/


31
İlgilenenler için, yapı göz önüne alındığında, <ul><li data-slide="item"></li></ul>bu cevaplayıcı seçici tanımsız olarak geri döner, böylece kullanıcının senaryosu göz önüne alındığında çalışmaz. Bu cevap yapı için ÇALIŞACAK <ul data-slide="item"><li></li></ul> Neden kısalık nedeniyle popülaritesini anlıyorum, teknik olarak yanlış bir cevap. jsfiddle.net/py5p2abL/1
akousmata

4
Bir dizi olarak ele almayı unutmayın. [0]Bulunan ilk öğeye erişmek için kullanın .
Aminah Nuraini

Tuhaf bir yan etki ... bu yöntem, işe yaramadığında öğeyi veri özniteliğiyle eşleştirerek çalıştı .find("[data-attrib='value']"). Değerler veri öznitelikleri jQuery tarafından eklenmiş olup olmadığını bilmiyorum ...
erroric

1
Bu garip değil çünkü iki cevap 2 farklı şey yapıyor. $.findözellikle o öğenin alt öğelerini bulur , ancak seçici dizede filtre sözdizimini kullanmak yalnızca sonuçları filtreler.
Phil

227

[Data-x = ...] ile arama yaparken dikkat edin, jQuery.data (..) setter ile çalışmaz :

$('<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

Bunun yerine şunları kullanabilirsiniz:

$.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.filterByDataparlak; ancak, bu kopya yapıştırıcılar için bir uyarıdır ... sadece etiketleri $('<b>').filterByData('x', 1)bulmanız gerekir . bölümü kopyalayıp yapıştırırsanız ... filtrelemeden önce "1" ayarını yaparsınız . <b>data-x="1".data(x, 1)data-x
Mart'ta WEBjuju 17:50

39

Ben jQuery için psiko brm's filterByData uzantısı üzerine geliştirdi .

Eski uzantı, bir anahtar / değer çiftinde arama yaptığında, bu uzantıyla, değerinden bağımsız olarak bir veri özelliğinin varlığını da arayabilirsiniz.

(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);

Kullanımı:

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

Veya keman: http://jsfiddle.net/PTqmE/46/


34

JQuery, ES6 olmadan

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

Sorunun JQuery ile ilgili olduğunu biliyorum, ancak okuyucular saf bir JS yöntemi isteyebilir.


33

JQuery ve data- * özniteliğini kullanarak öğeleri getirirken aynı sorunla karşı karşıya.

referans için en kısa kod burada:

Bu benim HTML Kodum:

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

Bu benim jQuery seçicim:

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

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

Umarım bu daha iyi çalışır

Teşekkürler


15

Bu seçici $("ul [data-slide='" + current +"']");aşağıdaki yapı için çalışacaktır:

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

Bu $("ul[data-slide='" + current +"']");işe yarar olsa da :

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


12

Öğesinin türünü önceden bilmeden bu çalışmayı nasıl yapacağına dair orijinal sorusuna geri dönersek, aşağıdakileri yapar:

$(ContainerNode).find(el.nodeName + "[data-slide='" + current + "']");
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.