jQuery ตรวจสอบว่าคลาสที่ตรงกันมี id ที่กำหนดหรือไม่


97

jQuery คืออะไรมี id เทียบเท่ากับคำสั่งต่อไปนี้

$('#mydiv').hasClass('foo')

เพื่อให้คุณสามารถตั้งชื่อคลาสและตรวจสอบว่ามี id ที่ให้มาหรือไม่

สิ่งที่ต้องการ:

$('.mydiv').hasId('foo')

ฉันต้องการใช้สไตล์กับ div บางอย่าง ตัวอย่างเช่นในเวลาโหลดทั้งหมดที่มีคลาสของ foo จะปรากฏขึ้น แต่ฉันอาจต้องการสลับหนึ่งอินสแตนซ์ของคลาส foo ที่มี id ของบาร์
Nicholas Murray

1
จากนั้นคุณก็$('#bar.foo').toggle();จะมีเพียง id เดียวเท่านั้นเนื่องจากจำเป็นต้องไม่ซ้ำกับเอกสาร หากคุณต้องการสลับเฉพาะ id นั้นหากเป็นของคลาสให้fooเพิ่มคลาสในตัวเลือก id หากตัวเลือกพบว่าชุดว่างเปล่าจะไม่มีอะไรเกิดขึ้นหากพบชุดที่มีผลลัพธ์ (ซึ่งจะมีเพียงชุดเดียว) ระบบจะสลับองค์ประกอบ ฉันคิดว่าคุณคิดมากเรื่องนี้
prodigitalson

3
แค่บอกว่ามันน่าหงุดหงิดที่คนพูดว่า "ทำไมคุณถึงอยากทำแบบนั้น? เมื่อฉันพยายามทำสิ่งนี้ในตอนนี้ ปัญหาเกี่ยวกับ hasClass คือส่งคืน True หากองค์ประกอบใด ๆ ที่ตรงกับตัวเลือกมีคลาสที่กำหนด ดังนั้นฉันมีหลาย p ที่มีคลาส "เค้ก" และชื่อคลาสเพิ่มเติมสำหรับแต่ละคลาส ("หนึ่ง", "สอง" ฯลฯ ) ฉันกำลังมีปัญหา ฉันต้องการเลือกชุดทั่วไปของ p.cake จากนั้นมีเงื่อนไข (ถ้า class = "one" - $ var = 23 - ฯลฯ ) ประเด็นคือฉันพยายามส่ง $ var ที่แตกต่างกันขึ้นอยู่กับชื่อคลาสเพิ่มเติม ฉันพยายามที่จะไม่ต้องทำซ้ำทั้งบิต o
Stella

คำตอบ:


174

คุณสามารถอบตรรกะที่เป็นตัวเลือกโดยการรวมตัวเลือกหลาย ตัวอย่างเช่นเราสามารถกำหนดเป้าหมายองค์ประกอบทั้งหมดด้วย id ที่กำหนดซึ่งมีคลาสเฉพาะ:

$("#foo.bar"); // Matches <div id="foo" class="bar">

สิ่งนี้ควรมีลักษณะคล้ายกับสิ่งที่คุณเขียนใน CSS โปรดทราบว่าจะใช้ไม่ได้กับ#fooองค์ประกอบทั้งหมด(แม้ว่าควรมีเพียงหนึ่งรายการ) และจะไม่ใช้กับ.barองค์ประกอบทั้งหมด(แม้ว่าอาจมีหลายองค์ประกอบ) จะอ้างอิงเฉพาะองค์ประกอบที่มีคุณสมบัติตามคุณสมบัติทั้งสอง

jQuery ยังมี.isวิธีการที่ยอดเยี่ยมที่ช่วยให้คุณตัดสินใจได้ว่าองค์ประกอบนั้นมีคุณสมบัติบางอย่างหรือไม่ คุณสามารถทดสอบคอลเล็กชัน jQuery กับตัวเลือกสตริงองค์ประกอบ HTML หรือวัตถุ jQuery อื่นได้ ในกรณีนี้เราจะตรวจสอบกับตัวเลือกสตริง:

$(".bar:first").is("#foo"); // TRUE if first '.bar' in document is also '#foo'

32
+1 สำหรับis(). ควรมี.hasId()ตัวเลือกเพียงเพราะดูเหมือนว่าเป็นพันธมิตรที่ชัดเจน.hasClass()จริงๆ ...
Matt Fletcher

43

ฉันอาจจะใช้$('.mydiv').is('#foo');That said ถ้าคุณรู้รหัสทำไมคุณไม่ใช้มันกับตัวเลือกตั้งแต่แรก?


17
บางทีรหัสอาจเข้าสู่ฟังก์ชันเรียกกลับที่ต้องจัดการบางกรณีแตกต่างกัน ดังนั้นฟังก์ชันจะถูกส่งผ่านวัตถุ jQuery โดยอัตโนมัติด้วยคุณสมบัติที่ไม่รู้จัก ในกรณีนี้ $ ('คำตอบของคุณ') คือ ('เป็นประโยชน์');
Peter G

1
ฉันคิดได้หลายเหตุผล จะเกิดอะไรขึ้นหากคุณต้องการใช้การตั้งค่าเฉพาะสำหรับมือถือเช่นหากองค์ประกอบมี id = "mobile" ทำไมไม่สำคัญ
วางจำหน่าย

ควรมีเพียง 1 องค์ประกอบเท่านั้นidมิฉะนั้นควรเป็นแอตทริบิวต์อื่น ๆ ... ฉันคิดว่าถ้าตำแหน่งโครงสร้างขององค์ประกอบที่เป็นปัญหาเปลี่ยนไปตามหน้าหรือไคลเอนต์ / ผู้ใช้ตัวแทนก็โอเค แต่นอกเหนือจากนั้น .. .
prodigitalson

19

อัปเดต: ขออภัยเข้าใจผิดคำถามลบ.has()คำตอบ

อีกทางเลือกหนึ่งสร้าง.hasId()ปลั๊กอิน

// the plugin
$.fn.hasId = function(id) {
  return this.attr('id') == id;
};

// select first class
$('.mydiv').hasId('foo') ?
  console.log('yes') : console.log('no');

// select second class
// $('.mydiv').eq(1).hasId('foo')
// or
$('.mydiv:eq(1)').hasId('foo') ?
  console.log('yes') : console.log('no');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="mydiv" id="foo"></div>
<div class="mydiv"></div>


5
ขออภัยฉันคิดว่าคุณตีความคำถามผิด: has () APIรายงานสิ่งนี้: ลดชุดขององค์ประกอบที่ตรงกันเป็นองค์ประกอบที่มีลูกหลานที่ตรงกับตัวเลือกหรือองค์ประกอบ DOM OP กำลังถามวิธีการทดสอบว่าองค์ประกอบที่มีคลาส 'myDiv' มี Id foo ด้วยหรือไม่ในขณะที่ has () จะค้นหาลูกหลานของ 'myDiv' ที่มี Id 'foo'
เอียง

7

สมมติว่าคุณกำลังทำซ้ำผ่านวัตถุ DOM และคุณต้องการค้นหาและจับองค์ประกอบที่มี ID บางอย่าง

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
</div>

คุณสามารถเขียนสิ่งที่ต้องการค้นหา

$('#myDiv').find('#bar')

โปรดทราบว่าหากคุณใช้ตัวเลือกคลาสเมธอด find จะส่งคืนองค์ประกอบที่ตรงกันทั้งหมด

หรือคุณสามารถเขียนฟังก์ชันการทำซ้ำซึ่งจะทำงานขั้นสูงขึ้น

<div id="myDiv">
    <div id="fo"><div>
    <div id="bar"><div>
    <div id="fo1"><div>
    <div id="bar1"><div>
    <div id="fo2"><div>
    <div id="bar2"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).attr('id') == 'bar1')
       //do something with bar1
});

รหัสเดียวกันสามารถแก้ไขได้ง่ายสำหรับตัวเลือกคลาส

<div id="myDiv">
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
    <div class="fo"><div>
    <div class="bar"><div>
</div>

$('#myDiv div').each(function() {
   if($(this).hasClass('bar'))
       //do something with bar
});

ฉันดีใจที่คุณแก้ปัญหาด้วย index () สิ่งที่เคยได้ผลสำหรับคุณฉันหวังว่านี่จะช่วยคนอื่น ๆ ที่มีปัญหาเดียวกัน ไชโย :)


4
$('#' + theMysteryId + '.someClass').each(function() { /* do stuff */ });

#theMysteryIdแต่ละที่ไม่จำเป็นเพราะจะไม่มีมากกว่าหนึ่ง
prodigitalson

2
มันช่วยให้คุณประหยัดปัญหาในการกำหนดให้กับตัวแปรตรวจสอบเพื่อดูว่าความยาวไม่ว่างเปล่าจากนั้นดำเนินการต่อด้วยรหัส หากตัวเลือกไม่ตรงกับ jQuery ก็จะไม่เรียกฟังก์ชัน "each" ดังนั้นจึงเป็นสิ่งที่ดีและสะอาด ตอนนี้หากสิ่งที่คุณต้องการทำคือเรียกใช้ jQuery API แล้วแน่ใจ
Pointy

4

เพียงเพื่อบอกว่าในที่สุดฉันก็แก้ไขสิ่งนี้โดยใช้ดัชนี ()

ไม่มีอะไรดูเหมือนจะได้ผล

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

แก้ไข: สำหรับผู้ที่ไม่ทราบ (เช่นฉัน) index () ให้ค่าดัชนีสำหรับแต่ละองค์ประกอบที่ตรงกับตัวเลือกโดยนับจาก 0 ขึ้นอยู่กับลำดับของพวกเขาใน DOM ตราบใดที่คุณรู้ว่า class = "foo" มีองค์ประกอบกี่อย่างคุณไม่จำเป็นต้องมี id

เห็นได้ชัดว่าสิ่งนี้ไม่ได้ช่วยเสมอไป แต่อาจมีคนพบว่ามีประโยชน์



1

คุณยังตรวจสอบได้ด้วยว่ามีการใช้องค์ประกอบ id หรือไม่โดยทำดังนี้

if(typeof $(.div).attr('id') == undefined){
   //element has no id
} else {
   //element has id selector
}

ฉันใช้วิธีนี้สำหรับตารางข้อมูลส่วนกลางและตารางข้อมูลที่สั่งซื้อเฉพาะ


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