การเลือกองค์ประกอบโดย data data


1019

มีวิธีที่ง่ายและตรงไปตรงมาในการเลือกองค์ประกอบตามdataคุณลักษณะของพวกเขา? ตัวอย่างเช่นเลือกแองเคอทั้งหมดที่มีแอตทริบิวต์ข้อมูลชื่อที่มีค่าของ customerID22

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



นั่นคือสิ่งที่ช่วยให้ฉันเลือกแอตทริบิวต์ข้อมูลทั้งหมด (ไม่ว่าจะมีค่าใด): $('*[data-customerID]')คุณสามารถใช้กับข้อมูลเช่น$('*[data-customerID]').each( function() { ... });
Kai Noack

คำตอบ:


1467
$('*[data-customerID="22"]');

คุณควรจะละเว้นได้*แต่ถ้าฉันจำได้อย่างถูกต้องขึ้นอยู่กับรุ่น jQuery ที่คุณใช้นี่อาจให้ผลที่ผิดพลาด

โปรดทราบว่าเพื่อความเข้ากันได้กับ Selectors API ( document.querySelector{,all}) เครื่องหมายคำพูดรอบค่าแอตทริบิวต์ ( 22) อาจไม่ปรากฏในกรณีนี้

นอกจากนี้ถ้าคุณทำงานกับข้อมูลคุณลักษณะมากในสคริปต์ jQuery ของคุณคุณอาจต้องการที่จะต้องพิจารณาโดยใช้ข้อมูล HTML5 แอตทริบิวต์ที่กำหนดเองปลั๊กอิน วิธีนี้ช่วยให้คุณสามารถเขียนโค้ดที่อ่านได้มากขึ้นโดยใช้.dataAttr('foo')และทำให้ไฟล์มีขนาดเล็กลงหลังจากการย่อขนาด (เทียบกับการใช้.attr('data-foo'))


69
เพียงทราบว่า. data ('foo') ทำงานเพื่อรับค่าของแอตทริบิวต์ 'data-foo' ตั้งแต่ jQuery 1.4.3 นอกจากนี้ตั้งแต่ jQuery 1.6: .data ('fooBar') ได้รับคุณลักษณะ 'data-foo-bar'
James McCormack

4
@ Zootius: ใช่ปลั๊กอิน readme มีหมายเหตุเกี่ยวกับมัน:“ ตั้งแต่ jQuery 1.4.3, .data()แม็พกับdata-*แอ็ตทริบิวต์ที่กำหนดเองโดยค่าเริ่มต้น, การแสดงผลปลั๊กอินนี้ซ้ำซ้อน มันยังคงสามารถใช้สำหรับ jQuery เวอร์ชันเก่าได้”
Mathias Bynens

ดังนั้นหนึ่งโพสต์ jQuery 1.4.3 จะเลือกวัตถุโดยค่าของวัตถุข้อมูลได้อย่างไร ให้ II ต้องการเลือกในตัวอย่างนี้วัตถุใด ๆ ที่มีข้อมูลสำหรับ customerID เท่ากับ 22 หรือไม่
เดินทาง

54
นอกจากนี้หากคุณสนใจเฉพาะเมื่อมีแอตทริบิวต์ข้อมูลเฉพาะคุณสามารถทำได้:$('[data-customerID]')
Darkside

7
สิ่งนี้ใช้ไม่ได้หากเขตข้อมูลถูกตั้งค่าโดย jquery (โดยใช้.data()) ใช่ไหม
Martin R.

329

สำหรับคน Googling และต้องการกฎทั่วไปเพิ่มเติมเกี่ยวกับการเลือกด้วยคุณลักษณะข้อมูล:

$("[data-test]")จะเลือกองค์ประกอบใด ๆ ที่มีเพียงแอตทริบิวต์ข้อมูล (ไม่ว่ามูลค่าของแอตทริบิวต์) รวมไปถึง:

<div data-test=value>attributes with values</div>
<div data-test>attributes without values</div>

$('[data-test~="foo"]')จะเลือกองค์ประกอบใด ๆ ที่แอตทริบิวต์ data มีอยู่ fooแต่ไม่จำเป็นต้องตรงเช่น:

<div data-test="foo">Exact Matches</div>
<div data-test="this has the word foo">Where the Attribute merely contains "foo"</div>

$('[data-test="the_exact_value"]')จะเลือกองค์ประกอบใด ๆ ที่มีค่าที่แน่นอนของ data data the_exact_valueตัวอย่างเช่น:

<div data-test="the_exact_value">Exact Matches</div>

แต่ไม่

<div data-test="the_exact_value foo">This won't match</div>

21
ดี. โปรดทราบว่า~=ตรงกับคำที่คั่นด้วยช่องว่างในขณะที่*=ตรงกับสตริงย่อยใด ๆ
แซม

สิ่งที่เกี่ยวกับ^ตัวละคร?
kuba44

1
@ kuba44 แน่นอนคุณสามารถใช้ ^ ได้เช่น$('[data-test^=foo]')นี้ในกรณีนี้คุณเลือกสิ่งที่เริ่มต้นด้วย foo เช่น<div data-test="foo_exact_value">หรือ<div data-test="food">ไม่<div data-test="seafoo">
23490 JDuarteDJ

รายการที่ครอบคลุมของตัวเลือกคุณลักษณะ: drafts.csswg.org/selectors-3/#attribute-selectors
1460043

142

การใช้$('[data-whatever="myvalue"]')จะเลือกอะไรกับ HTML แอตทริบิวต์ แต่ใน jQueries ใหม่ดูเหมือนว่าถ้าคุณใช้$(...).data(...)การแนบข้อมูลก็ใช้บางส่วน thingy เบราว์เซอร์มายากลและไม่ส่งผลกระทบต่อ HTML จึงไม่ได้ถูกค้นพบโดย.findตามที่ระบุไว้ในคำตอบก่อนหน้า

ตรวจสอบ (ทดสอบกับ 1.7.2+) (ดูเพิ่มเติมที่ซอ ): (อัปเดตให้สมบูรณ์ยิ่งขึ้น)

var $container = $('<div><div id="item1"/><div id="item2"/></div>');

// add html attribute
var $item1 = $('#item1').attr('data-generated', true);

// add as data
var $item2 = $('#item2').data('generated', true);

// create item, add data attribute via jquery
var $item3 = $('<div />', {id: 'item3', data: { generated: 'true' }, text: 'Item 3' });
$container.append($item3);

// create item, "manually" add data attribute
var $item4 = $('<div id="item4" data-generated="true">Item 4</div>');
$container.append($item4);

// only returns $item1 and $item4
var $result = $container.find('[data-generated="true"]');

1
AHA - ผลัดกันออกมาจากจุดที่คนอื่นออกมานี้ที่stackoverflow.com/questions/4191386/...
drzaus

4
และเสนอทางออกให้กับ.filter ที่นี่
drzaus

22
มันใช้เบราว์เซอร์เวทย์มนตร์บางอย่างและไม่ส่งผลต่อ html : ไม่มีสิ่งนั้นเป็นเวทย์มนตร์;) learningjquery.com/2011/09/using-jquerys-data-apis
Tom Sarduy


1
หากคุณกำลังเพิ่มแอตทริบิวต์ข้อมูลที่คุณต้องการค้นหาในภายหลังให้ใช้$item.attr('data-id', 10);
Pedro Moreira

77

ฉันไม่เห็นคำตอบ JavaScript หากไม่มี jQuery หวังว่ามันจะช่วยให้ใครบางคน

var elements = document.querySelectorAll('[data-customerID="22"]');

elements[0].innerHTML = 'it worked!';
<a data-customerID='22'>test</a>

ข้อมูล:


1
ขอบคุณสำหรับสิ่งนี้. ยินดีที่ได้เห็นโซลูชันที่ไม่ใช่ jquery
เชย

68

ในการเลือกแองเคอร์ทั้งหมดที่มีแอททริบิวต์ข้อมูลdata-customerID==22คุณควรรวมถึงaเพื่อ จำกัด ขอบเขตของการค้นหาสำหรับประเภทองค์ประกอบนั้นเท่านั้น การทำแอ็ตทริบิวต์ data ค้นหาในลูปขนาดใหญ่หรือที่ความถี่สูงเมื่อมีองค์ประกอบจำนวนมากบนหน้าสามารถทำให้เกิดปัญหาประสิทธิภาพการทำงาน

$('a[data-customerID="22"]');

27

ตัวอย่าง JS พื้นเมือง

รับ NodeList ขององค์ประกอบ

var elem = document.querySelectorAll('[data-id="container"]')

HTML: <div data-id="container"></div>

รับองค์ประกอบแรก

var firstElem = document.querySelector('[id="container"]')

HTML: <div id="container"></div>

กำหนดเป้าหมายชุดของโหนดซึ่งส่งคืน nodelist

document.getElementById('footer').querySelectorAll('[data-id]')

HTML:

<div class="footer">
    <div data-id="12"></div>
    <div data-id="22"></div>
</div>

รับองค์ประกอบตามค่าข้อมูล (OR) หลายรายการ

document.querySelectorAll('[data-section="12"],[data-selection="20"]')

HTML:

<div data-selection="20"></div>
<div data-section="12"></div>

รับองค์ประกอบตามค่าข้อมูลรวม (และ)

document.querySelectorAll('[data-prop1="12"][data-prop2="20"]')

HTML:

<div data-prop1="12" data-prop2="20"></div>

รับรายการที่ค่าเริ่มต้น

document.querySelectorAll('[href^="https://"]')

ตัวเลือกสำหรับ "รับองค์ประกอบแรก" นั้นถูกต้อง แต่ไม่สอดคล้องกับตัวอย่างอื่น - ฉันเชื่อว่าไม่มี "ข้อมูล -"
GuyPaddock

15

ผ่านวิธีตัวกรอง Jquery ():

http://jsfiddle.net/9n4e1agn/1/

HTML:

<button   data-id='1'>One</button>
<button   data-id='2'>Two</button>

JavaScript:

$(function() {    
    $('button').filter(function(){
        return $(this).data("id")   == 2}).css({background:'red'});  
     });

คุณลองเล่นซอหรือยัง? วิธี FIlter เป็นอีกวิธีหนึ่งในการบรรลุสิ่งเดียวกัน มันจะมีประโยชน์เมื่อคุณมีชุดของวัตถุ Jquery อยู่แล้วและคุณจำเป็นต้องกรองตามคุณลักษณะของข้อมูลหรืออย่างอื่น
Razan Paul

ฉันขอโทษ @ Blizzard ฉันแสดงความคิดเห็นในคำตอบที่ผิด วางไปทางขวาแล้ว #AlwaysALongDayAtWork
ปีเตอร์บิชอป

15

การก่อสร้างเช่นนี้$('[data-XXX=111]')ไม่ได้ทำงานในSafari 8.0

หากคุณตั้งค่า data data ด้วยวิธีนี้: $('div').data('XXX', 111)จะใช้งานได้เฉพาะเมื่อคุณตั้งค่า data data ใน DOM เช่นนี้$('div').attr('data-XXX', 111)เท่านั้น

ฉันคิดว่าเป็นเพราะทีมงาน jQuery ได้เพิ่มประสิทธิภาพตัวรวบรวมขยะเพื่อป้องกันการรั่วไหลของหน่วยความจำและการดำเนินการอย่างหนักใน DOM ที่สร้างใหม่ในแต่ละแอตทริบิวต์ข้อมูลการเปลี่ยนแปลง


สิ่งนี้ช่วยฉันได้มาก - ถ้าฉันใช้ข้อมูลหรือวิธีการ prop จากนั้นการเลือกโดย $ ('... [data-x = "y"]') ไม่ทำงาน - ฉันใช้ attr แทน (มันเป็นการเปลี่ยนคุณลักษณะให้เป็น DOM) ขอบคุณ
Jarda

13

เพื่อการทำงานใน Chrome ค่าจะต้องไม่มีเครื่องหมายคำพูดคู่อื่น

ตัวอย่างเช่นใช้งานได้เช่นนี้:

$('a[data-customerID=22]');

4
ดูเหมือนว่าจะไม่ถูกต้อง อย่างน้อยมันก็ไม่ถูกต้องในตอนนี้ ฉันเพิ่งใช้ $ ('[data-action = "setStatus"]') removeClass ('ปิดการใช้งาน'); ใน Chrome และทำงานได้อย่างสมบูรณ์
ปีเตอร์บิชอป

ฉันเดาว่าไม่มีการใช้ "" ในตัวเลือกมันสามารถใช้เป็น$('[data-action=setStatus]').removeClass('disabled')
Animesh Singh

6

บางครั้งเป็นที่พึงประสงค์ในการกรององค์ประกอบโดยพิจารณาว่ามีการแนบรายการข้อมูลไว้กับโปรแกรมหรือไม่ (ไม่ใช่ผ่านแอตทริบิวต์ dom):

$el.filter(function(i, x) { return $(x).data('foo-bar'); }).doSomething();

ใช้งานได้ แต่ไม่สามารถอ่านได้มาก วิธีที่ดีกว่าคือการใช้ตัวเลือกหลอกสำหรับทดสอบสิ่งต่าง ๆ :

$.expr[":"].hasData = $.expr.createPseudo(function (arg) {
    return function (domEl) {
        var $el = $(domEl);
        return $el.is("[" + ((arg.startsWith("data-") ? "" : "data-") + arg) + "]") || typeof ($el.data(arg)) !== "undefined";
    };
});

ตอนนี้เราสามารถ refactor คำแถลงเดิมให้มีความคล่องแคล่วและอ่านง่ายขึ้น:

$el.filter(":hasData('foo-bar')").doSomething();

1
คำตอบแรกที่พลาดคำสั่ง return ต้องเป็น: $ el.filter (ฟังก์ชั่น (i, x) {return $ (x) .data ('foo-bar');}). doSomething ();
Salma Gomaa

3

เพียงตอบคำถามทั้งหมดด้วยคุณสมบัติบางอย่างของ 'มาตรฐานการดำรงชีวิต' - ตอนนี้ (ในยุค html5) เป็นไปได้ที่จะทำได้โดยไม่ต้องมี libs ของบุคคลที่สาม:

  • JS บริสุทธิ์ / ธรรมดากับ querySelector (ใช้ CSS-selectors):
    • เลือกรายการแรกใน DOM: document.querySelector('[data-answer="42"],[type="submit"]')
    • เลือกทั้งหมดใน DOM: document.querySelectorAll('[data-answer="42"],[type="submit"]')
  • CSS บริสุทธิ์ / ธรรมดา
    • บางแท็กเฉพาะ: [data-answer="42"],[type="submit"]
    • แท็กทั้งหมดที่มีแอตทริบิวต์เฉพาะ: [data-answer]หรือinput[type]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.