Chọn liên kết bằng văn bản (đối sánh chính xác)


89

Sử dụng jQuery, tôi muốn chọn một liên kết chứa chính xác một số loại văn bản. Ví dụ:

<p><a>This One</a></p>
<p><a>"This One?"</a></p>
<p><a>Unlikely</a></p>

Tôi đã thử điều này:

$('a:contains("This One")')

Nhưng nó chọn liên kết đầu tiên VÀ liên kết thứ hai. Tôi chỉ muốn liên kết đầu tiên, chứa chính xác "This One". Làm thế nào tôi có thể làm điều đó?


Câu trả lời:


138

Bạn có thể làm được việc này:

$('a').filter(function(index) { return $(this).text() === "This One"; });

Tham khảo: http://api.jquery.com/filter/


5
Một trong hai sẽ hoạt động trong trường hợp này, nhưng tôi có xu hướng sử dụng === vì nó khớp về giá trị và loại, tức là nó sẽ không ép buộc các loại. stackoverflow.com/questions/359494/…
FishBasketGordo

1
Bạn đã trượt return. Tôi phải thay đổi nó thànhfunction(index) { return (this.text === 'This One') }
Endy Tjahjono

Ngoài ra, bạn có thể kiểm tra độ dài văn bản.
bestinamir

39

Một đồng nghiệp của tôi đã mở rộng jQuery với một chức năng để làm điều này:

$.expr[':'].textEquals = function(a, i, m) {
    return $(a).text().match("^" + m[3] + "$");
};

Kết quả là bạn có thể chọn một cái gì đó bằng văn bản chính xác theo cách này:

$("label:textEquals('Exact Text to Match')");

Điều này làm cho nó dễ dàng, vì bạn không phải nhớ cú pháp chính xác mỗi lần. Toàn bộ bài đăng của anh ấy ở đây: jQuery Custom Selector để chọn các phần tử theo văn bản chính xác: textEquals


28

Để mở rộng câu trả lời của FishBasketGordo. Nếu bạn đang cố gắng thực hiện lựa chọn trên một lượng lớn phần tử, :contains()trước tiên hãy sử dụng để thu hẹp và sau đó áp dụng bộ lọc.

Điều này sẽ cải thiện tốc độ tổng thể:

$('a:contains("This One")').filter(function(index)
{
    return $(this).text() === "This One";
});

Đã bình chọn cho tốc độ / hiệu quả. Ngoài ra, tránh cần các khoảng trắng $ .trim () trong .filter (..).
JoePC,

8

đã phải sửa đổi giải pháp của Nariman thành:

$.expr[':'].textEquals = function(a, i, m) {
    var match = $(a).text().match("^" + m[3] + "$")
    return match && match.length > 0;                                                                                                                                                                                                                                            
}

Nếu không, không hoạt động trên chrome (Linux)


6

Tôi đã sử dụng tiện ích mở rộng

$.expr[':'].textEquals

Nhưng tôi nhận thấy rằng việc triển khai không còn hoạt động với jQuery 1.7 (dường như là một thay đổi trong Sizzla.filter). Sau một thời gian đấu tranh để làm cho nó hoạt động, tôi đã viết một plugin jQuery để hoàn thành điều tương tự.

$.fn.textEquals = function (text) {
    var match = false;
    $(this).each(function () {
        if ($(this).text().match("^" + escapeRegex(text) + "$")) {
            match = true;
            return false;
        }
    });
    return match;
};

Sử dụng:

$(".ui-autocomplete li").textEquals('Exact Text to Match');

Chỉ muốn chia sẻ, trong trường hợp ai đó gặp phải vấn đề này (,


3

Vì vậy, câu trả lời của Narnian hoạt động khá tốt. Tuy nhiên, khi sử dụng nó trong tự nhiên, tôi đã gặp phải một số vấn đề, nơi mà những thứ mà tôi mong đợi sẽ không được tìm thấy. Điều này là do đôi khi có khoảng trắng ngẫu nhiên xung quanh văn bản của phần tử. Tôi tin rằng nếu bạn đang tìm kiếm "Hello World", bạn vẫn muốn nó khớp với "Hello World" hoặc thậm chí là "Hello World \ n". Do đó, tôi vừa thêm phương thức "trim ()" vào hàm, phương thức này sẽ loại bỏ các khoảng trắng xung quanh và nó bắt đầu hoạt động tốt hơn. Ngoài ra, tôi đã sửa đổi tên biến để tâm trí của tôi rõ ràng hơn một chút.

Đặc biệt...

$.expr[':'].textEquals = function(el, i, m) {
    var searchText = m[3];
    var match = $(el).text().trim().match("^" + searchText + "$")
    return match && match.length > 0;
}

Và lưu ý phụ ... trim chỉ xóa khoảng trắng trước và sau văn bản được tìm kiếm. Nó không loại bỏ khoảng trắng ở giữa các từ. Tôi tin rằng đây là hành vi mong muốn, nhưng bạn có thể thay đổi điều đó nếu bạn muốn.


3
$('a:contains("This One")')[0];

Tôi cảm thấy như mình đang thiếu thứ gì đó dựa trên câu trả lời của mọi người khác để lọc nhưng tại sao không chỉ chọn mục đầu tiên trong mảng các phần tử được trả về bởi 'chứa'?

Điều này hoạt động, chỉ khi bạn biết rằng liên kết đầu tiên có kết quả chính xác mà bạn đang tìm kiếm. Các câu trả lời khác hoạt động tốt hơn, nếu bạn không chắc chắn các liên kết sẽ theo thứ tự nào.


Bởi vì anh ta không phải lúc nào cũng biết một trong những ông muốn là người đầu tiên
Cameron

Câu hỏi đặc biệt yêu cầu "Tôi chỉ muốn liên kết đầu tiên".
Michael Khalili

Câu hỏi yêu cầu sự phù hợp chính xác, tác giả chỉ ra yếu tố đầu tiên để giải thích yếu tố nào muốn.
dlopezgonzalez

2

Cách lấy giá trị đã chọn từ drop-dwon:

$.fn.textEquals = function (text) {
    var match = false; 
    var values="";
    $(this).each(function () {
        if ($(this).text().match("^" + text + "$")) {
            values=$(this).val();
            match = true;
            return false;
        }
    });
    return values;
};

console.log($("option").textEquals("Option One")); - nó sẽ trả về giá trị của trình đơn thả xuống


2
var link = $('a').filter(function(index) { return $(this).text() === "Availability"; });
 $(link).hide();
        $(link).removeAttr('href');

1
Vui lòng thêm giải thích để bạn trả lời.
Michał Perłakowski

dòng đầu tiên để chọn bất kỳ liên kết với văn bản, dòng thứ hai và thứ ba những gì bạn có thể làm với các liên kết để ẩn chúng hoặc vô hiệu hóa giao diện liên kết ở bộ lọc trong tài liệu jquery api.jquery.com/filter
David Fawzy

@DavidFawzy - xin lỗi, ừm ... sao ?? Tôi không nghĩ dòng thứ 2 hoặc thứ 3 có liên quan gì đến câu hỏi của OP - nó chỉ thêm sự nhầm lẫn.
jbyrd

2

Xin lỗi, nếu điều này hoàn toàn khớp với câu trả lời của bất kỳ ai ở trên,

   $.fn.equalsText = function (text, isCaseSensitive) {
      return $(this).filter(function () {
         if (isCaseSensitive) {
            return $(this).text() === text
         } else {
            return $(this).text().toLowerCase() === text.toLowerCase()
         }
      })
   }

Đây là một số đầu ra trong bảng điều khiển trang kết quả tìm kiếm Linkedin.

$("li").equalsText("Next >", false)
[<li class=​"next">​…​</li>​] // Output

$("li").equalsText("next >", false)
[<li class=​"next">​…​</li>​] // Output

$("li").equalsText("Next >", true)
[<li class=​"next">​…​</li>​] // Output

$("li").equalsText("next >", true)
[] // Output

Nó cũng có hỗ trợ phân biệt chữ hoa chữ thường và không sử dụng :contains()

Chỉnh sửa (ngày 22 tháng 5 năm 2017): -

   $.fn.equalsText = function (textOrRegex, isCaseSensitive) {
      return $(this).filter(function () {
         var val = $(this).text() || this.nodeValue
         if (textOrRegex instanceof RegExp) {
            return textOrRegex.test(val)
         } else if (isCaseSensitive) {
            return val === textOrRegex
         } else {
            return val.toLowerCase() === textOrRegex.toLowerCase()
         }
      })
   }
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.