jQuery: ค้นหาองค์ประกอบด้วยข้อความ


308

ใครสามารถบอกฉันว่ามันเป็นไปได้ที่จะหาองค์ประกอบตามเนื้อหามากกว่าidหรือชั้น ?

ฉันพยายามค้นหาองค์ประกอบที่ไม่มีคลาสหรือรหัสที่แตกต่างกัน (จากนั้นฉันต้องค้นหาผู้ปกครองขององค์ประกอบนั้น)



คำตอบ:


432

คุณสามารถใช้:containsตัวเลือกเพื่อรับองค์ประกอบตามเนื้อหาของพวกเขา

ตัวอย่างที่นี่

$('div:contains("test")').css('background-color', 'red');
<div>This is a test</div>
<div>Another Div</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>


2
ยอดเยี่ยม แต่มันเป็นเรื่องเล็ก มีอยู่แล้วเราสามารถทำการค้นหากรณีเล็ก ๆ น้อย ๆ ?
Dipu Raj

123
@DipuRaj: คุณต้องใช้.filterแทน $('div').filter(function(){ return $(this).text().toLowerCase() === 'test';})
Rocket Hazmat

5
ใช่โปรดใช้การประเมินค่า@RocketHazmatบอกว่าคุณมี 5 องค์ประกอบทั้งหมดที่นำหน้าด้วย 'สัญญาการลงทะเบียน'และแต่ละรายการมีคำต่อท้ายที่เป็นตัวเลข คุณจะจบลงเลือกพวกเขาทุกเมื่อในความเป็นจริงคุณต้องการเพียงองค์ประกอบที่มีข้อความ: 'ลงทะเบียนสัญญา 26'
Feng Huo

1
แม้ว่า: contain เป็นตัวพิมพ์เล็กและใหญ่มันใช้งานได้สำหรับฉันเพราะฉันผ่านสตริงข้อความที่ต้องการค้นหา
Francisco Quintero

1
ในกรณีที่ช่วยคนอื่นที่ชอบใช้ช่องว่างในการ parens ของพวกเขาต่อไปนี้ไม่ทำงาน:$('div:contains( "test" )').css('background-color', 'red');
M Katz

92

ในเอกสารประกอบ jQuery มีข้อความระบุว่า:

ข้อความที่ตรงกันสามารถปรากฏโดยตรงภายในองค์ประกอบที่เลือกในลูกหลานขององค์ประกอบนั้นหรือชุดค่าผสม

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

function findElementByText(text) {
    var jSpot = $("b:contains(" + text + ")")
                .filter(function() { return $(this).children().length === 0;})
                .parent();  // because you asked the parent of that element

    return jSpot;
}

3
เพิ่งพบปัญหาตรงนี้ ควรจะสูงกว่านี้
DickieBoy

2
<li>Hello <a href='#'>World</a>, How Are You. การแก้ปัญหานี้อาจล้มเหลวในสถานการณ์ต่อไปนี้: ที่นี่หากHowมีการค้นหาเงื่อนไขจะล้มเหลวฉันคิดว่า
me_digvijay

23

Fellas ฉันรู้ว่านี่เก่า แต่เดี๋ยวก่อนฉันมีวิธีแก้ปัญหานี้ซึ่งฉันคิดว่าทำงานได้ดีกว่าทั้งหมด ก่อนอื่นจะเอาชนะ Case Sensitivity ที่ jquery: contain () มาพร้อมกับ:

var text = "text";

var search = $( "ul li label" ).filter( function ()
{
    return $( this ).text().toLowerCase().indexOf( text.toLowerCase() ) >= 0;
}).first(); // Returns the first element that matches the text. You can return the last one with .last()

หวังว่าบางคนในอนาคตอันใกล้จะพบว่ามีประโยชน์


18

คำตอบของ Rocket ไม่ทำงาน

<div>hhhhhh
<div>This is a test</div>
<div>Another Div</div>
</div>

ฉันเพิ่งปรับเปลี่ยนDEMOของเขาที่นี่และคุณสามารถดู DOM ที่เลือกไว้

$('div:contains("test"):last').css('background-color', 'red');

เพิ่มตัวเลือก" : สุดท้าย " ในรหัสเพื่อแก้ไขปัญหานี้


วิธีนี้จะทำงานได้ดีที่สุดเมื่อตัวเลือกส่งคืนผลลัพธ์หลายรายการและคุณต้อง จำกัด ให้แคบลงไปยังองค์ประกอบเฉพาะที่คุณไม่มีแอตทริบิวต์ "Id" เพื่ออ้างอิง
Tahir Khalid

14

วิธีที่ดีที่สุดในความคิดของฉัน

$.fn.findByContentText = function (text) {
    return $(this).contents().filter(function () {
        return $(this).text().trim() == text.trim();
    });
};

8

ใช่ใช้containsตัวเลือกjQuery


10
เอ้อไม่มีไม่ได้: 'มี' ไม่ได้ทำตรงนี้เท่านั้นไม่ว่าจะเป็นเข็มที่มีอยู่ (เพราะฉะนั้นชื่อ) ในกองหญ้า ... กับคนอื่น ๆ ได้กล่าวว่านี่
ไมค์หนู

3
นี่ไม่ใช่คำตอบ
lharby

4

jQuery ต่อไปนี้เลือกโหนด div ที่มีข้อความ แต่ไม่มีลูกซึ่งเป็นโหนดลีฟของทรี DOM

$('div:contains("test"):not(:has(*))').css('background-color', 'red');
<div>div1
<div>This is a test, nested in div1</div>
<div>Nested in div1<div>
</div>
<div>div2 test
<div>This is another test, nested in div2</div>
<div>Nested in div2</div>
</div>
<div>
div3
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>


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