jQuery จะหาองค์ประกอบตามค่า data-attribute ได้อย่างไร?


994

ฉันมีสถานการณ์ต่อไปนี้:

var el = 'li';

และมี 5 <li>'s บนหน้าแต่ละคนมีdata-slide=numberแอตทริบิวต์(หมายเลขเป็น 1,2,3,4,5 ตามลำดับ)

ตอนนี้ฉันต้องการค้นหาหมายเลขสไลด์ที่ใช้งานอยู่ในปัจจุบันซึ่งแมปไปvar current = $('ul').data(current);แล้วและได้รับการอัปเดตในการเปลี่ยนสไลด์แต่ละครั้ง

จนถึงตอนนี้ความพยายามของฉันยังไม่สำเร็จพยายามสร้างตัวเลือกที่จะตรงกับสไลด์ปัจจุบัน:

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

ไม่ตรงกับ / คืนอะไร ...

เหตุผลที่ฉันไม่สามารถ hardcode เป็นส่วนหนึ่งที่ว่านี้เป็นผู้ใช้สามารถเข้าถึงตัวแปรที่สามารถเปลี่ยนไปเป็นองค์ประกอบที่แตกต่างกันถ้าจำเป็นดังนั้นจึงอาจไม่เคยเป็นlili

ความคิดใด ๆ เกี่ยวกับสิ่งที่ฉันหายไป?


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
@Jannis $("ul").find(el + "[data-slide='" + current +"']");คุณสามารถทำ
Frédéric Hamidi

7
@ c00lryguy, jQuery UIกำหนดหนึ่งและมีการใช้งานแบบสแตนด์อโลนรอบ ๆ ดูเหมือนว่าความพยายามที่จะได้มันเข้ามา jQuery หลักถูกปฏิเสธ สองครั้ง
Frédéric Hamidi

6
คำตอบนี้ในโพสต์ที่คล้ายกันมีตัวอย่างของฟังก์ชั่นตัวกรอง
drzaus

77
ฉันกังวลว่าสิ่งนี้จะไม่ทำงานหากมีการเพิ่มข้อมูลผ่านฟังก์ชั่น jQuery .data (... ) เนื่องจากสิ่งนี้ไม่ได้แสดงผลคุณลักษณะเสมอไปและ soemtimes ใช้กลไกการจัดเก็บเฉพาะของเบราว์เซอร์ อีกเหตุผลที่ฉันต้องการ jQuery core มีตัวเลือกข้อมูลเฉพาะ
AaronLS

77
โปรดสังเกตว่ามันใช้ไม่ได้กับองค์ประกอบที่คุณตั้งค่าข้อมูลด้วย $ ('# element') data ('some-att-name', value); แต่สำหรับผู้ที่มีแอตทริบิวต์ฮาร์ดโค้ด ฉันมีปัญหานี้และเพื่อให้การทำงานเป็นชุดข้อมูลโดยการเขียนแอตทริบิวต์โดยตรง $ ('# element') attr ('data-some-att-name', value);
Pawel

463

ในกรณีที่คุณไม่ต้องการพิมพ์ทั้งหมดนี่เป็นวิธีที่สั้นกว่าในการสืบค้นโดย data attribute:

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

FYI: 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

4
อย่าลืมที่จะถือเป็นอาเรย์ ใช้[0]เพื่อเข้าถึงองค์ประกอบแรกที่พบ
Aminah Nuraini

ผลข้างเคียงที่แปลกประหลาด ... วิธีนี้ใช้การจับคู่องค์ประกอบกับแอตทริบิวต์ข้อมูลเมื่อ.find("[data-attrib='value']")ไม่ทำงาน ฉันไม่ทราบว่าค่าเป็นแอตทริบิวต์ข้อมูลถูกเพิ่มโดย jQuery หรือไม่ ...
ข้อผิดพลาด

1
มันไม่ใช่เรื่องแปลกเพราะคำตอบทั้งสองทำ 2 สิ่งที่ต่างกัน $.findโดยเฉพาะพบว่าลูกหลานขององค์ประกอบนั้น แต่ใช้ไวยากรณ์กรองในสตริงตัวเลือกก็จะกรองผลลัพธ์
ฟิล

227

เมื่อค้นหาด้วย [data-x = ... ] ระวังไม่ทำงานกับ setter 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ยอดเยี่ยม; แต่นี้เป็นคำเตือนสำหรับการคัดลอก pasters ออกมี ... คุณต้องการเพียง$('<b>').filterByData('x', 1)เพื่อหาแท็กที่มี<b> data-x="1"หากคุณคัดลอกวาง.data(x, 1)ส่วน ... คุณจะตั้งค่าdata-xเป็น "1" ก่อนทำการกรอง
WEBjuju

39

ฉันปรับปรุงตามส่วนขยายของ FilterByData ของ Psycho brm เป็น 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.