Làm cách nào để đặt jQuery Chứa không phân biệt chữ hoa chữ thường, bao gồm cả jQuery 1.8+?


91

Tôi đang cố gắng sử dụng chữ hoa chữ thường "chứa". Tôi đã thử sử dụng giải pháp ở câu hỏi stackoverflow sau đây, nhưng nó không hoạt động:

Có bộ chọn jQuery: chứa không phân biệt chữ hoa chữ thường không?

Để thuận tiện, giải pháp được sao chép ở đây:

jQuery.extend(
        jQuery.expr[':'], { 
                Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0" 
});

Đây là lỗi:

Error: q is not a function
Source File: /js/jquery-1.4.js?ver=1.4
Line: 81

Đây là nơi tôi đang sử dụng nó:

  $('input.preset').keyup(function() {
    $(this).next().find("li").removeClass("bold");
    var theMatch = $(this).val();
    if (theMatch.length > 1){
      theMatch = "li:Contains('" + theMatch + "')";
      $(this).next().find(theMatch).addClass("bold");
    }
  });

Việc tôi sử dụng phân biệt chữ hoa chữ thường ban đầu "chứa" trong cùng một kịch bản hoạt động mà không có bất kỳ lỗi nào. Có ai có ý tưởng nào? Tôi đánh giá cao nó.


Trong trường hợp có ai quan tâm, tôi đã cập nhật của tôi bài đăng blog trên ba thêm chứa selectors :containsExact, :containsExactCase:containsRegexselectors đến nay làm việc trong tất cả các phiên bản của jQuery.
Mottie


Tôi nghĩ .filter () là một cách hay khác. Tham khảo
劉鎮 瑲

Câu trả lời:


127

Đây là những gì tôi đang sử dụng trong một dự án hiện tại, không có bất kỳ vấn đề nào. Xem liệu bạn có gặp may mắn hơn với định dạng này không:

jQuery.expr[':'].Contains = function(a, i, m) { 
  return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; 
};

Trong jQuery 1.8, API cho điều này đã thay đổi, phiên bản jQuery 1.8+ của điều này sẽ là:

jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) {
    return function( elem ) {
        return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
    };
});

Bạn có thể kiểm tra nó ở đây . Để biết thêm chi tiết về 1.8+ bộ chọn tùy chỉnh, hãy xem wiki Sizzle tại đây .


Bạn là một người tiết kiệm cuộc sống. Cảm ơn.
Matrym

3
Bất kỳ cơ hội nào bạn có thể nói về chính xác điều này đang làm?
Abe Miessler

4
@ClovisSix - cảm ơn bạn đã lưu ý, tôi đã cung cấp hơn 1,8 phương pháp thực hiện tương tự, hãy cho tôi biết nếu bạn gặp bất kỳ sự cố nào.
Nick Craver

1
Lưu ý rằng điều này không thay thế: chứa chỉ thêm một bộ chọn khác: Chứa.
albanx

3
bộ chọn sẽ được gọi icontains, hoặc cái gì đó tương tự.
Sebastian

43

Cần lưu ý rằng câu trả lời đúng nhưng chỉ bao hàm :Containschứ không phải bí danh :containscó thể dẫn đến hành vi không mong muốn (hoặc có thể được thiết kế sử dụng cho các ứng dụng nâng cao yêu cầu cả tìm kiếm nhạy cảm và không nhạy cảm).

Điều này có thể được giải quyết bằng cách sao chép phần mở rộng cho bí danh:

jQuery.expr[':'].Contains = function(a, i, m) { 
  return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; 
};
jQuery.expr[':'].contains = function(a, i, m) { 
  return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; 
};

Tôi đã mất một thời gian để tìm ra lý do tại sao nó không hoạt động với tôi.


Tôi đã nhận xét điều này ở trên, nhưng dường như tôi không thể.
Dấu chấm lửng

5
Tôi không chắc bạn đang nhận được gì ở đây. Điều này ghi đè hành vi được ghi lại, dự kiến ​​của :contains. Tôi nghĩ rằng rõ ràng hơn là để nguyên bản gốc :containsvà gọi bộ chọn mới của bạn :icontains.
Justin Force

5
Đó là bên cạnh điểm của bài viết của tôi. Tạo một bộ chọn thay thế chắc chắn là một tùy chọn hợp lệ, tuy nhiên tôi đã chỉ ra rằng việc mở rộng: chứa, nhưng bỏ qua việc mở rộng: Các vùng chứa có thể dẫn đến sự nhầm lẫn của người dùng, khi chúng mang lại các kết quả khác nhau.
Dấu chấm lửng

1
Sau đó, cảm ơn bạn đã chia sẻ "gotcha" này. :) Tuy nhiên, tôi nghĩ rằng tốt hơn hết là không nên ghi đè hành vi tích hợp khi việc xây dựng một hành vi song song không phá hoại sẽ ít hơn.
Justin Force

Tôi đã thử một số giải pháp khác nhau được đăng cho điều này và giải pháp này cuối cùng đã hoạt động. cảm ơn.
taylor michels


6

Có thể đến muộn .... nhưng,

Tôi muốn đi theo cách này ..

$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});

Bằng cách này, bạn KHÔNG can thiệp vào '.contains' NATIVE của jQuery ... Bạn có thể cần cài đặt mặc định sau này ... nếu bị giả mạo, bạn có thể quay lại stackOverFlow ...


0

tôi sẽ cho phép mình thêm bạn bè của mình:

$.expr[":"].containsNoCase = function (el, i, m) { 
    var search = m[3]; 
    if (!search) return false; 
    return eval("/" + search + "/i").test($(el).text()); 
}; 

0

Tôi chỉ có thể bỏ qua hoàn toàn độ phân biệt chữ hoa chữ thường của jQuery để đạt được những gì tôi muốn bằng cách sử dụng mã bên dưới:

            $.expr[":"].contains = $.expr.createPseudo(function(arg) {
            return function( elem ) {
                return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
            };
        });

Bạn có thể sử dụng liên kết này để tìm mã dựa trên các phiên bản jQuery của mình để bỏ qua phân biệt chữ hoa chữ thường, https://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/

Ngoài ra, nếu bạn muốn sử dụng: chứa và thực hiện một số tìm kiếm, bạn có thể muốn xem phần này: http://technarco.com/jquery/using-jquery-search-html-text-and-show-or-hide- phù hợp

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.