jQuery เลือกตามแอตทริบิวต์โดยใช้ตัวดำเนินการ AND และ OR


105

ฉันกำลังคิดว่าถ้าเป็นไปได้ใน jQuery ให้เลือกองค์ประกอบตามแอตทริบิวต์ที่ตั้งชื่อโดยใช้ AND และ OR

ตัวอย่าง:

<div myid="1" myc="blue">1</div>
<div myid="2" myc="blue">2</div>
<div myid="3" myc="blue">3</div>
<div myid="4">4</div>

ฉันต้องการเลือกองค์ประกอบทั้งหมดโดยที่myc="blue"แต่เฉพาะองค์ประกอบที่myidตั้งค่าเป็น 1 หรือ 3

ฉันจึงลอง:

a=$('[myc="blue"] [myid="1"]  [myid="3"]');

แต่ไม่ได้ผลเหมือนกันที่นี่:

a=$('[myc="blue"] && [myid="1"] || [myid="3"]');

เป็นไปได้หรือไม่โดยไม่ต้องเขียนฟังก์ชันตัวกรองพิเศษ


7
หมายเหตุ: คุณไม่ควรจะทำให้ค่าแอตทริบิวต์ของคุณเองเช่นและmyc myidหากคุณใช้ HTML5 นำหน้าด้วยdata-: data-mycและdata-myid.
RoToRa

@RoToRa มีเอกสารใน HTML5 ที่บอกว่าคุณควรทำเช่นนั้นหรือไม่? เว็บไซต์ส่วนใหญ่ที่ฉันเห็นใช้อะไรก็ตามที่สมองของผู้พัฒนาคิดในเวลานั้น ...
Alexis Wilke

1
เพียงเพราะคนทำมันไม่ได้หมายความว่ามันถูกต้อง ดูHTML5 ส่วน 3.2.1 : "ผู้เขียนต้องไม่ใช้องค์ประกอบแอตทริบิวต์หรือค่าแอตทริบิวต์ที่ข้อกำหนดนี้หรือข้อกำหนดอื่น ๆ ที่เกี่ยวข้องไม่อนุญาตเนื่องจากการทำเช่นนี้จะทำให้การขยายภาษาในอนาคตทำได้ยากขึ้นอย่างมาก"
RoToRa

1
เป็นตัวอย่างที่ดีของคำถามที่ดี แล้วองค์ประกอบประเภทต่างๆเช่นอินพุตล่ะ?
jesus g_force Harris

คำตอบ:


193

และการทำงาน

a=$('[myc="blue"][myid="1"][myid="3"]');

หรือการดำเนินการให้ใช้เครื่องหมายจุลภาค

a=$('[myc="blue"],[myid="1"],[myid="3"]');

ตามที่ @Vega แสดงความคิดเห็น:

a=$('[myc="blue"][myid="1"],[myc="blue"][myid="3"]');

1
ฉันคิดว่าเขาต้องการmyc == blue && (id == 1 || id == 3)
Selvakumar Arumugam

2
ถ้าฉันใช้a=$('[myc="blue"] [myid="1"],[myid="3"]');มันหมายความว่า([myc="blue"] AND [myid="1"]) OR [myid="3"]หรือ([myc="blue"]) AND ([myid="1"] OR [myid="3"]) ฉันกำลังมองหาอันที่ 2 // แก้ไข: ขอบคุณสำหรับการอัปเดตนั้น! :-)
Bndr

18

ใช้งานง่าย.filter() [docs] (AND) โดยใช้ตัวเลือกหลายตัว [เอกสาร] (หรือ):

$('[myc="blue"]').filter('[myid="1"],[myid="2"]');

โดยทั่วไปการเชื่อมโยงตัวเลือกเช่น a.foo.bar[attr=value]ตัวเลือก AND บางประเภท

jQuery มีเอกสารมากมายเกี่ยวกับตัวเลือกที่รองรับซึ่งควรค่าแก่การอ่าน


คุณรู้ไหมว่านี่เร็วกว่าคำตอบจาก gabe หรือไม่?
The Bndr

ฉันไม่รู้บางทีอาจจะไม่
Felix Kling

10

วิธีการเขียนตัวกรองด้านล่าง

$('[myc="blue"]').filter(function () {
   return (this.id == '1' || this.id == '3');
});

Edit: @Jack Thanks .. พลาดโดยสิ้นเชิง ..

$('[myc="blue"]').filter(function() {
   var myId = $(this).attr('myid');   
   return (myId == '1' || myId == '3');
});

การสาธิต


5

และโอเปอเรเตอร์ในตัวเลือกเป็นเพียงสตริงว่างและตัวดำเนินการหรือคือเครื่องหมายจุลภาค

อย่างไรก็ตามไม่มีการจัดกลุ่มหรือลำดับความสำคัญดังนั้นคุณต้องทำซ้ำหนึ่งในเงื่อนไข:

a=$('[myc=blue][myid="1"],[myc=blue][myid="3"]');

คุณต้องการคำพูดเหล่านั้นหรือไม่? ฉันหมายถึงแค่ความเสมอต้นเสมอปลาย .. อาจเป็นแค่ฉัน >. <
Selvakumar Arumugam

1
@ เวก้า: คุณไม่จำเป็นต้องมีเครื่องหมายคำพูดสำหรับสตริงง่ายๆเช่นblueแต่ฉันไม่แน่ใจเกี่ยวกับค่าตัวเลขดังนั้นฉันจึงเก็บมันไว้
Guffa

5

ขั้นแรกให้ค้นหาเงื่อนไขที่เกิดขึ้นในทุกสถานการณ์จากนั้นกรองเงื่อนไขพิเศษ:

$('[myc="blue"]')
    .filter('[myid="1"],[myid="3"]');


0

JQuery ใช้ตัวเลือก CSS เพื่อเลือกองค์ประกอบดังนั้นคุณต้องใช้กฎมากกว่าหนึ่งกฎโดยคั่นด้วยเครื่องหมายจุลภาคดังนี้:

a=$('[myc="blue"], [myid="1"], [myid="3"]');

แก้ไข:

ขออภัยคุณต้องการสีน้ำเงินและ 1 หรือ 3 แล้ว:

a=$('[myc="blue"][myid="1"],  [myid="3"]');

การใส่ตัวเลือกแอตทริบิวต์สองตัวเข้าด้วยกันจะทำให้คุณได้ AND การใช้ลูกน้ำจะทำให้คุณได้หรือ


1
ฉันคิดว่าเขาต้องการmyc == blue && (id == 1 || id == 3)
Selvakumar Arumugam

คุณต้องทำซ้ำ[myc="blue"]ตัวเลือกในตัวอย่างที่สอง
RoToRa

-1

ในการเลือกองค์ประกอบอย่างถูกต้องโดยใช้การดำเนินการเชิงตรรกะที่คุณระบุไว้คุณเพียงแค่ต้องการjQuery.filter()สำหรับการANDดำเนินการไม่ใช่ "ฟังก์ชันตัวกรองพิเศษ" คุณยังต้องการjQuery.add()การORดำเนินการ

var elements = $('[myc="blue"]').filter('[myid="1"').add('[myid="3"');

หรืออีกวิธีหนึ่งคือสามารถทำได้โดยใช้ชวเลขในตัวเลือกเดียวโดยที่ตัวเลือกที่ติดขัดจะทำหน้าที่เป็นANDและคั่นด้วยเครื่องหมายจุลภาคทำหน้าที่เป็นOR:

var elements = $('[myc="blue"][myid="1"], [myid="3"]');
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.