jQuery: tìm phần tử bằng văn bản


308

Bất cứ ai cũng có thể cho tôi biết nếu có thể tìm thấy một yếu tố dựa trên nội dung của nó chứ không phải bởi một id hoặc lớp ?

Tôi đang cố gắng tìm các phần tử không có các lớp hoặc id riêng biệt. (Sau đó tôi cần tìm cha mẹ của phần tử đó.)



Câu trả lời:


432

Bạn có thể sử dụng :containsbộ chọn để lấy các phần tử dựa trên nội dung của chúng.

Demo tại đây

$('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
Tuyệt vời, nhưng nó là trường hợp nhạy cảm. Có dù sao chúng ta có thể làm một trường hợp tìm kiếm không nhạy cảm?
Dipu Raj

123
@DipuRaj: Bạn sẽ phải sử dụng .filterthay thế. $('div').filter(function(){ return $(this).text().toLowerCase() === 'test';})
Rocket Hazmat

5
Có, vui lòng sử dụng thẩm định @RocketHazmat sử dụng, giả sử bạn có 5 yếu tố được bắt đầu bằng 'Đăng ký hợp đồng' và mỗi yếu tố có một hậu tố số. Cuối cùng, bạn sẽ chọn tất cả , khi thực tế bạn chỉ muốn phần tử có văn bản: 'Đăng ký hợp đồng 26' .
Feng Huo

1
Mặc dù: chứa trường hợp nhạy cảm, nó hoạt động với tôi vì tôi đã chuyển chuỗi văn bản chính xác cần tìm.
Francisco Quintero

1
Trong trường hợp nó giúp người khác thích sử dụng khoảng trắng trong parens của họ, những điều sau đây không hoạt động:$('div:contains( "test" )').css('background-color', 'red');
M Katz

92

Trong tài liệu jQuery có ghi:

Văn bản phù hợp có thể xuất hiện trực tiếp trong phần tử được chọn, trong bất kỳ hậu duệ của phần tử đó hoặc kết hợp

Do đó, việc bạn sử dụng :contains() bộ chọn là chưa đủ , bạn cũng cần kiểm tra xem văn bản bạn tìm kiếm có phải là nội dung trực tiếp của yếu tố bạn đang nhắm mục tiêu hay không, đại loại như thế:

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
Chỉ cần chạy vào vấn đề chính xác này. Điều này nên cao hơn.
DickieBoy 24/2/2015

2
Giải pháp này có thể thất bại trong kịch bản sau : <li>Hello <a href='#'>World</a>, How Are You. . Ở đây nếu Howđang được tìm kiếm thì điều kiện sẽ thất bại tôi nghĩ.
me_digvijay

23

Fellas, tôi biết cái này đã cũ nhưng hey tôi có giải pháp này mà tôi nghĩ là hiệu quả hơn tất cả. Đầu tiên và quan trọng nhất khắc phục Độ nhạy của Case mà jquery: chứa () được gửi cùng với:

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()

Hy vọng ai đó trong tương lai gần tìm thấy nó hữu ích.


18

Câu trả lời của Rocket không hoạt động.

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

Tôi chỉ cần sửa đổi DEMO của anh ấy ở đây và bạn có thể thấy DOM gốc được chọn.

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

thêm bộ chọn " : last " trong mã để sửa lỗi này.


Điều này hoạt động tốt nhất khi bộ chọn trả về nhiều kết quả và bạn cần thu hẹp nó xuống thành một phần tử cụ thể mà bạn không có thuộc tính "Id" để tham chiếu.
Tahir Khalid

14

Cách tốt nhất theo ý kiến ​​của tôi.

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

8

Có, sử dụng containsbộ chọn jQuery .


10
er, no not: 'chứa:' không thực hiện khớp chính xác, chỉ cho dù kim được chứa (tên do đó) trong đống cỏ khô ... như những người khác đã nói ở đây
loài gặm nhấm

3
Đây không phải là một câu trả lời.
lharby

4

JQuery sau đây chọn các nút div có chứa văn bản nhưng không có con, đó là các nút lá của cây 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>


Đây là câu trả lời tốt nhất!
Calciol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.