Jquery เลือกองค์ประกอบทั้งหมดที่มี $ jquery.data ()


101

เลือกองค์ประกอบที่ฉันได้ตั้งค่าไว้ก่อนหน้านี้ jquery.data();

เช่นเลือกองค์ประกอบทั้งหมดที่มี.data('myAttr')การตั้งค่าไว้แล้ว

วิธีการแก้

jsfiddle เพื่อ demostrate คือ Fiddle

คำตอบ:


100

คุณสามารถทำได้

$('[data-myAttr!=""]'); 

สิ่งนี้จะเลือกองค์ประกอบทั้งหมดที่มีแอตทริบิวต์data-myAttrซึ่งไม่เท่ากับ '' (ดังนั้นจึงต้องถูกตั้งค่า);

คุณยังสามารถใช้ตัวกรอง ()

$('*').filter(function() {
    return $(this).data('myAttr') !== undefined;
});

70
หรือแค่:$('[data-myAttr]')
andlrc

4
คิดในสิ่งเดียวกัน มันไม่ได้ผลตามที่คาดไว้ ดูการสาธิตนี้
gdoron สนับสนุน Monica

คำปิด 'ขาดหายไปในโค้ดชิ้นแรก (ไม่สามารถแก้ไขคำตอบได้โดยตรง)
Florent2

1
$ ('[data-myAttr! = ""]'); จะส่งคืนองค์ประกอบที่ไม่ได้กำหนดไว้ ความคิดเห็นของ @NULL จะได้รับเฉพาะองค์ประกอบที่ตั้งค่าไว้เท่านั้น
arleslie

6
ไม่ถูกต้อง! วิธีแก้ไขที่ถูกต้อง: $ ('[data-myAttr]') - ดูคำตอบด้านล่างสำหรับคำอธิบาย
BassMHL

78

วิธีที่ง่ายและดีที่สุดในการเลือกคือ:

$('[data-myAttr]')

ข้อมูลมากกว่านี้:

ฉันทดสอบหลายสิ่งหลายอย่าง

การใช้$('[data-myAttr!=""]')ไม่ได้ผลกับทุกกรณี เนื่องจากองค์ประกอบที่ไม่มีdata-myAttrชุดจะมีdata-myAttrค่าเท่ากับundefinedและ$('[data-myAttr!=""]')จะเลือกองค์ประกอบเหล่านั้นด้วยซึ่งไม่ถูกต้อง


4
ใช้ได้กับแอตทริบิวต์ข้อมูลที่กำหนดไว้ในมาร์กอัปเท่านั้น ใช้ไม่ได้กับแอตทริบิวต์ข้อมูลที่กำหนดผ่าน jQuery ดูที่jsfiddle.net/2p7h0Lj8/1
Sophivorus

21

คุณสามารถใช้ตัวกรอง () :

var elements = $("*").filter(function() {
    return $(this).data("myAttr") !== undefined;
});

1
กำลังจะโพสต์สิ่งนี้นี่คือซอที่จะแสดงให้เห็น: jsfiddle.net/gbHFZ/1
Rory McCrossan

1
เหตุใดตัวเลือกแอตทริบิวต์จึงไม่ทำงาน $('[data-myAttr]')เหรอ?
gdoron รองรับ Monica

6
@gdoron นั่นเป็นเพราะdata()ฟอร์ม getter อ่านdata-แอตทริบิวต์HTML5 ได้อย่างแท้จริงแต่รูปแบบ setter ไม่สร้างหรืออัปเดต
Frédéric Hamidi

อืมมันบันทึกข้อมูลไว้ที่ไหน คุณช่วยอ้างอิงให้ฉันได้ไหม ฉันอ่านสิ่งนี้"(จากนั้นค่าข้อมูลทั้งหมดจะถูกเก็บไว้ภายใน jQuery)" แต่ที่ไหน ???
gdoron สนับสนุน Monica

3
@gdoron ข้อมูลจะยังคงอยู่ในแคชส่วนกลางโดยคีย์โดย id ซึ่งเชื่อมโยงกับองค์ประกอบผ่านคุณสมบัติ expando
Frédéric Hamidi

17

คุณสามารถใช้ส่วนขยาย jQuery Selector: การสืบค้นข้อมูลองค์ประกอบ

$(':data');       // All elements with data  
$(':not(:data)'); // All elements without data

jQuery UI มีสิ่งนี้อยู่แล้วดังนั้นบางคนอาจไม่จำเป็นต้องเรียกใช้ฟังก์ชันนิรนาม api.jqueryui.com/data-selector
arleslie

8

คุณสามารถใช้ JQuery UI ด้วยตัวเลือก: data ()

เลือกองค์ประกอบที่มีข้อมูลเก็บไว้ภายใต้คีย์ที่ระบุ

ตรวจสอบjsfiddle นี้เป็นตัวอย่าง

เพื่อให้องค์ประกอบทั้งหมดตรงกัน.data('myAttr')คุณสามารถใช้ได้

var matches = $(':data(myAttr)');

สิ่งนี้ควรใช้ได้กับทั้งสององค์ประกอบที่มีdata-แอตทริบิวต์และองค์ประกอบที่มีข้อมูลจัดเก็บโดยใช้$.data()เพราะ

ตั้งแต่ jQuery 1.4.3 HTML 5 data- แอตทริบิวต์จะถูกดึงเข้าสู่ออบเจ็กต์ข้อมูลของ jQuery โดยอัตโนมัติ

แต่สิ่งนี้ไม่ได้ผลดีนัก ตรวจสอบjsfiddle นี้และคุณจะเห็นว่าครั้งที่สองที่เรียกตัวเลือกนั้นควรจับคู่ 2 องค์ประกอบและจับคู่เพียงหนึ่งรายการ สาเหตุนี้เกิดจาก "จุดบกพร่อง" ในไลบรารี jquery-ui

ซึ่งนำมาจากไฟล์ jquery-ui หลัก

 $.extend( $.expr[ ":" ], {
    data: $.expr.createPseudo ?
        $.expr.createPseudo(function( dataName ) {
            return function( elem ) {
                return !!$.data( elem, dataName );
            };
        }) :
        // support: jQuery <1.8
        function( elem, i, match ) {
            return !!$.data( elem, match[ 3 ] );
        }
});

ดังที่คุณเห็นพวกเขากำลังใช้$.data(elem, match)แทน$(elem).data(match)ซึ่งทำให้แคชไม่ได้รับการอัปเดตในกรณีที่คุณขอองค์ประกอบที่มีdata-แอตทริบิวต์ หากองค์ประกอบได้รับการทดสอบสำหรับการdata()จัดเก็บสิ่งนี้จะทำงานได้ดี แต่หากไม่เป็นเช่นนั้นจะไม่รวมอยู่ในผลลัพธ์ที่ตรงกัน

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

  1. อย่าใช้ jquery-ui และขยาย pseudo-selector ของคุณเอง $(:mydata(myAttr))

    $.extend($.expr[":"], {
       mydata: $.expr.createPseudo ?
       $.expr.createPseudo(function(dataName) {
          return function(elem) {
             return !!$(elem).data(dataName);
          };
       }) : function(elem, i, match) {
           return !!$(elem).data(match[3]);
       }
    });
    

  2. ใช้ jquery-ui กับ:datapseudoselector และเข้าร่วมผลลัพธ์ของการเลือก[data-myAttr]เพื่อรวมสิ่งที่อาจถูกข้าม

    var matches = $(':data(myAttr)', '[data-myAttr]')
    


นี่เป็นส่วนหนึ่งของการแก้ปัญหาของฉันในการเลือกองค์ประกอบที่มีแอตทริบิวต์ data- * โดยไม่ทราบชื่อจริงหรือชื่อแอตทริบิวต์ข้อมูล ฉันพบวิธีขยาย jQuery เพื่อทำสิ่งนี้ที่อื่น แต่ +1 ที่นี่เพื่อให้ข้อมูลโค้ดแสดงการใช้งานจริง คนอื่น ๆ ให้คำแนะนำเพียงพอ แต่บางครั้งคุณต้องแสดงวิธีใช้ข้อมูลที่ให้มา ขอบคุณ! :)
Brandon Elliott


2

เลือกองค์ประกอบที่ฉันได้ตั้งค่าไว้ก่อนหน้านี้ jquery.data();


คำถามคือการค้นหาองค์ประกอบทั้งหมดด้วยคีย์เฉพาะไม่ใช่ข้อมูลใด ๆ


ลองใช้ jQuery.data()

$(".myClass").each(function(i){
    if( i % 2 == 0 ){
        $(this).data("myAttr",i + 1);                
    }
});
    
var res = $(".myClass").map(function(i) {
    console.log($(this).data("myAttr"));
    return $.data(this, "myAttr") !== undefined ? this : null
});    

console.log(res);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div class="myClass">1</div>
<div class="myClass">2</div>
<div class="myClass">3</div>
<div class="myClass">4</div>
<div class="myClass">5</div>

jsfiddle http://jsfiddle.net/xynZA/142/


ขอบคุณสำหรับคำตอบคำถามนี้มีไว้สำหรับค้นหาองค์ประกอบทั้งหมดด้วยคีย์เฉพาะและไม่ใช่ข้อมูลใด ๆ
Argiropoulos Stavros

@ArgiropoulosStavros ต้องการส่งคืนองค์ประกอบที่มีhtml data-*ชุดแอตทริบิวต์เช่นเดียวกับjQuery.data()ชุดหรือไม่?
แขก 271314
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.