องค์ประกอบกรองตาม. data () คีย์ / ค่า


116

สมมติว่าฉันมีองค์ประกอบ div 4 รายการพร้อมคลาส.navlinkซึ่งเมื่อคลิกใช้.data()เพื่อตั้งค่าคีย์ที่เรียกว่า'selected'เป็นค่าtrue:

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

ทุกครั้งที่มีการ.navlinkคลิกใหม่ฉันต้องการจัดเก็บสิ่งที่เลือกไว้ก่อนหน้านี้navlinkเพื่อการปรับแต่งในภายหลัง มีวิธีที่ง่ายและรวดเร็วในการเลือกองค์ประกอบตามสิ่งที่จัดเก็บโดยใช้.data()หรือไม่?

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

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

ฉันรู้ว่ามีวิธีอื่นในการทำให้สำเร็จ แต่ตอนนี้ส่วนใหญ่ฉันแค่อยากรู้ว่ามันทำได้.data()ไหม

คำตอบ:


192

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

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

6
โปรดทราบว่านี่ไม่ใช่วิธีเดียวที่จะทำได้อีกต่อไป StefanoP ได้ให้ทางเลือกอื่น
Nathan Koop

3
@NathanKoop ก็ไม่เชิง ดูความคิดเห็นของฉันเกี่ยวกับคำตอบของเขา
Bryan Downing

สำหรับผู้ที่ใช้แอตทริบิวต์ข้อมูลเพื่อค้นหาองค์ประกอบที่ไม่สามารถคาดเดาได้ (id less divs ฯลฯ ... ซึ่งคุณต้องสามารถเข้าถึงได้ไม่ว่าด้วยเหตุผลใดก็ตาม) ณ ตำแหน่งใดก็ได้ในเอกสาร:$("*").filter(function() { return $(this).data("DATA IDENTIFIER HERE") == DATA VALUE HERE; });
Tschallacka

นี่ไม่ใช่ "ยุ่ง" - นี่เป็นวิธีเดียวที่ปลอดภัยในการกรองคำที่กำหนดเองโดยไม่ต้องให้คุณ "หลีกเลี่ยง" ค่าเหล่านั้นเพื่อให้แน่ใจว่าการเชื่อมต่อของข้อความค้นหากับส่วนที่เหลือของตัวเลือกจะไม่สร้างตัวเลือกที่ผิดกฎหมาย
Alnitak

145

สำหรับบันทึกคุณสามารถกรองข้อมูลด้วย jquery (คำถามนี้ค่อนข้างเก่าและ jQuery พัฒนาตั้งแต่นั้นมาจึงถูกต้องที่จะเขียนวิธีแก้ปัญหานี้ด้วย):

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

หรือดีกว่า (เพื่อประสิทธิภาพ):

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

หรือหากคุณต้องการรับองค์ประกอบทั้งหมดด้วยdata-selectedชุด:

$('[data-selected]')

โปรดทราบว่าวิธีนี้จะใช้ได้เฉพาะกับข้อมูลที่ตั้งค่าผ่าน html-attributes หากคุณตั้งค่าหรือเปลี่ยนแปลงข้อมูลด้วยการ.data()โทรวิธีนี้จะใช้ไม่ได้อีกต่อไป


9
หากจำนวนคะแนนต่ำสำหรับคำตอบนี้ทำให้คุณกลัว - เป็นคำตอบที่ได้รับการยอมรับโดยมีคะแนนโหวตมากกว่า 100 คะแนนสำหรับคำถามที่เหมือนกันstackoverflow.com/questions/4146502
Simon_Weaver

48
-1 ใช้ไม่ได้เมื่อตั้งค่าข้อมูลด้วย.data()วิธีการแทนdata-แอตทริบิวต์ ดูซอนี้: jsfiddle.net/bryandowning/tySWC - นอกจากนี้.find()เมธอดจะค้นหาลูกของตัวเลือกก่อนหน้านี้ ในตัวอย่างที่กำหนดdata-selectedเป็นคุณลักษณะของไม่ได้เป็นลูกของ.navlink .navlinkนอกจากนี้$('div p')และ$('div').find('p')เทียบเท่าเป็นหลัก การใช้งาน.find()ดูเหมือนว่ามันอาจจะช้าลงเนื่องจากการเรียกใช้ฟังก์ชันพิเศษ (แม้ว่าฉันจะไม่มั่นใจในเรื่องนี้ก็ตาม) โปรดแก้ไขฉันหากฉันผิดเกี่ยวกับสิ่งนี้ (ฉันหวังว่าวิธีนี้จะได้ผลจริงๆ)
Bryan Downing

3
สองสิ่ง: 1) คุณคิดถูกที่สิ่งนี้ใช้ไม่ได้หากคุณตั้งค่าข้อมูลด้วย.data()เนื่องจาก jQuery ค้นหาผ่าน DOM ฉันจึงโพสต์ไว้สำหรับผู้ที่ (เช่นฉัน) ที่มีคำถามนี้ด้วยเหตุผลอื่น 2) แก้ไข.find()ค้นหาเด็ก ๆ จึงผิดในตัวอย่างนี้ 3) คุณคิดผิดมันไม่เทียบเท่าเพราะ jQuery ค้นหาจากขวาไปซ้ายดูjonraasch.com/blog/…
StefanoP

2
การโหวตขึ้นเพื่อ$('[data-selected]')ช่วยฉันในสิ่งที่ชอบ$('ul.categories a[data-categories_id]').click(......);
Luke Cousins

นอกจากนี้ดูเหมือนว่าหากคุณอัปเดตแอตทริบิวต์ข้อมูลโดยใช้. attr หากคุณดึงข้อมูลโดยใช้. data ค่าจะไม่ได้รับการอัปเดตดังนั้นโปรดใช้ความระมัดระวังในการผสมทั้งสอง
Fabio Lolli

13

เราสามารถสร้างปลั๊กอินได้อย่างง่ายดาย:

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

การใช้งาน (ตรวจสอบปุ่มตัวเลือก):

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

คุณหมายถึงวิธีการปลั๊กอินเป็นอย่างอื่นนี่เหมือนกับคำตอบที่ยอมรับ ...
jave.web

@ jave.web แน่นอน. แต่ไม่ใช่ทุกคนที่รู้วิธีเปลี่ยนเป็นปลั๊กอิน อัปเดตคำฟุ่มเฟือย
mpen

อย่าเข้าใจฉันผิดคำตอบของคุณดีมาก แต่คำที่นี่สำคัญมากขอบคุณสำหรับการอัปเดต :)
jave.web

8

สองสิ่งที่ฉันสังเกตเห็น (อาจเป็นข้อผิดพลาดจากตอนที่คุณจดไว้)

  1. คุณพลาดจุดในตัวอย่างแรก ( $('.navlink').click)
  2. เพื่อให้ตัวกรองทำงานคุณต้องส่งคืนค่า ( return $(this).data("selected")==true)

-1

ฟังดูเวิร์คเกินคุ้ม

1) ทำไมไม่เพียงแค่มีตัวแปร JavaScript เดียวที่เก็บข้อมูลอ้างอิงไปยังวัตถุ element \ jQuery ที่เลือกในปัจจุบัน

2) ทำไมไม่เพิ่มคลาสให้กับองค์ประกอบที่เลือกในปัจจุบัน จากนั้นคุณสามารถค้นหา DOM สำหรับคลาส ".active" หรืออะไรก็ได้


ใช่ แต่อย่างที่ฉันพูดฉันรู้ว่ามีวิธีอื่นในการทำให้สำเร็จ ฉันติดอยู่ว่าสามารถกรองผ่าน data () ได้หรือไม่และทำไม filter () ไม่ทำงานสำหรับฉัน ขอบคุณมาก
user113716

ขอโทษ ฉันพลาดส่วนนั้นของคำถามของคุณ
Bryan Migliorisi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.