ฉันสงสัยว่ามีวิธีที่จะมีตรรกะ "หรือ" ในตัวเลือก jQuery ตัวอย่างเช่นฉันรู้ว่าองค์ประกอบที่เป็นทั้งลูกหลานขององค์ประกอบกับการเรียนหรือ ClassA ClassB elem.parents('.classA or .classB')
และผมต้องการที่จะทำสิ่งที่ชอบ jQuery มีฟังก์ชั่นดังกล่าวหรือไม่?
ฉันสงสัยว่ามีวิธีที่จะมีตรรกะ "หรือ" ในตัวเลือก jQuery ตัวอย่างเช่นฉันรู้ว่าองค์ประกอบที่เป็นทั้งลูกหลานขององค์ประกอบกับการเรียนหรือ ClassA ClassB elem.parents('.classA or .classB')
และผมต้องการที่จะทำสิ่งที่ชอบ jQuery มีฟังก์ชั่นดังกล่าวหรือไม่?
คำตอบ:
ใช้เครื่องหมายจุลภาค
'.classA, .classB'
คุณอาจเลือกที่จะเว้นพื้นที่
AND
.classA.classB
จะเป็น
การใช้เครื่องหมายจุลภาคอาจไม่เพียงพอหากคุณมีวัตถุ jQuery หลายรายการที่ต้องเข้าร่วม
กระบวนการ. add ()วิธีการเพิ่มองค์ประกอบที่เลือกในชุดผลลัพธ์:
// classA OR classB
jQuery('.classA').add('.classB');
มันมีความละเอียดมากกว่า'.classA, .classB'
แต่ให้คุณสร้างตัวเลือกที่ซับซ้อนมากขึ้นดังต่อไปนี้:
// (classA which has <p> descendant) OR (<div> ancestors of classB)
jQuery('.classA').has('p').add(jQuery('.classB').parents('div'));
ฉันได้เขียนปลั๊กอิน (5 บรรทัดของโค้ด) ที่เรียบง่ายอย่างเหลือเชื่อสำหรับฟังก์ชันนี้:
http://byrichardpowell.github.com/jquery-or/
จะช่วยให้คุณพูดอย่างมีประสิทธิภาพ "รับองค์ประกอบนี้หรือถ้าองค์ประกอบนั้นไม่มีอยู่ใช้องค์ประกอบนี้" ตัวอย่างเช่น:
$( '#doesntExist' ).or( '#exists' );
ในขณะที่คำตอบที่ได้รับการยอมรับนั้นมีฟังก์ชั่นที่คล้ายกันนี้หากมีตัวเลือกทั้งสอง (ก่อน & หลังเครื่องหมายจุลภาค) อยู่ตัวเลือกทั้งสองจะถูกส่งกลับ
ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคนที่อาจลงจอดบนหน้านี้ผ่านทาง Google
"a" || "b"
vs. null || "b"
ใน vanilla JS ถ้าเราใช้พฤติกรรมเดียวกันที่นี่$(a).or(b)
ควรจะกลับถ้ามันมีอยู่แล้วมิฉะนั้นก็ควรจะกลับ$(a)
$(b)
ฉันไม่คิดว่ามีอะไรผิดปกติกับระบบการตั้งชื่อนี้เนื่องจาก "หรือ" ตรงกับพฤติกรรมของ JS "||" (หรือ) ผู้ประกอบการ
or
ฉันยังเห็นว่ามันเป็น สิ่งอื่น ๆ ที่มีการพูดคุยเกี่ยวกับการเป็นเหมือนconcat
หรือmerge
การกระทำ
หากคุณต้องการใช้โครงสร้างมาตรฐานของ element = element1 || element2 ที่ JavaScript จะคืนค่าแรกที่เป็นความจริงคุณสามารถทำได้อย่างแน่นอน:
element = $('#someParentElement .somethingToBeFound') || $('#someParentElement .somethingElseToBeFound');
ซึ่งจะส่งคืนองค์ประกอบแรกที่พบจริง แต่วิธีที่ดีกว่าน่าจะเป็นการใช้เครื่องหมายจุลภาคของตัวเลือก jQuery (ซึ่งจะคืนค่าอาร์เรย์ขององค์ประกอบที่พบ) ในแบบนี้:
element = $('#someParentElement').find('.somethingToBeFound, .somethingElseToBeFound')[0];
ซึ่งจะส่งคืนองค์ประกอบที่พบครั้งแรก
ฉันใช้สิ่งนั้นเป็นครั้งคราวเพื่อค้นหาองค์ประกอบที่ใช้งานอยู่ในรายการหรือองค์ประกอบเริ่มต้นบางอย่างหากไม่มีองค์ประกอบที่ใช้งานอยู่ ตัวอย่างเช่น:
element = $('ul#someList').find('li.active, li:first')[0]
ซึ่งจะส่งคืน li ใด ๆ ที่มีคลาสของ active หรือหากไม่มีจะส่งคืน li ล่าสุด
ทั้งสองจะทำงาน มีบทลงโทษด้านประสิทธิภาพที่อาจเป็นไปได้ในฐานะ || จะหยุดการประมวลผลทันทีที่พบสิ่งที่เป็นจริงในขณะที่วิธีการเรียงลำดับจะพยายามค้นหาองค์ประกอบทั้งหมดแม้ว่าจะพบสิ่งหนึ่งแล้ว จากนั้นอีกครั้งโดยใช้ || การสร้างอาจมีปัญหาด้านประสิทธิภาพหากต้องผ่านตัวเลือกหลายตัวก่อนที่จะหาตัวที่จะส่งคืนเนื่องจากต้องเรียกวัตถุหลัก jQuery สำหรับแต่ละอัน (ฉันไม่รู้จริงๆว่านี่เป็นประสิทธิภาพหรือไม่ มันดูสมเหตุสมผลที่จะเป็น) โดยทั่วไปแล้วฉันใช้วิธีการเรียงลำดับเมื่อตัวเลือกเป็นสตริงที่ค่อนข้างยาว
ในที่สุดฉันก็ได้พบวิธีแฮ็ค:
div:not(:not(.classA,.classB)) > span
(เลือก div กับคลาสclassA
หรือclassB
กับช่วงลูกโดยตรง)
Daniel A. White Solution ใช้งานได้ดีสำหรับชั้นเรียน
ฉันมีสถานการณ์ที่ฉันต้องค้นหาช่องป้อนข้อมูลเช่นDonee_1_cardโดยที่ 1 เป็นดัชนี
ทางออกของฉันได้รับ
$("input[name^='donee']" && "input[name*='card']")
แม้ว่าฉันจะไม่แน่ใจว่ามันเป็นวิธีที่ดีที่สุด