2012-05-07 34 views
5

Tôi đang cố gắng thực hiện tìm kiếm và thay thế bằng tất cả các phiên bản của cùng một từ, không phân biệt chữ hoa chữ thường bằng cách sử dụng .contains() nhưng có vẻ như nó không hoạt động. nhạy cảm. Đây là mã của những gì tôi có bây giờ:Jquery Tìm kiếm và Thay thế w/.contains

<p>some text</p> 
<p>Some Text</p> 
<p>Some TEXT</p> 


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; 
     }; 


     $('p').filter(":contains('some text')").each(function(){ 
      $(this).text($(this).text().replace("some text", "replace with new text")); 
     }); 

này chỉ thay đổi văn bản đầu tiên, bởi vì trong những trường hợp tương tự bạn có thể nhìn vào ví dụ về fiddle js đây http://jsfiddle.net/ka82V/

Trả lời

1

Vấn đề là không phải với khớp gốc, nhưng với cách bạn đã được thay thế. Ngay cả khi nó đã thực hiện đối sánh, thay thế không làm gì vì đối số "một số văn bản" không khớp với các biến thể của trường hợp khác.

Tuy nhiên, tôi không nghĩ rằng bạn nên ghi đè công cụ chọn :contains của jQuery như thế này. Sử dụng một bộ lọc dựa trên chức năng là ít mã hơn và khiến jQuery không thay đổi gì cả.

Xem ví dụ làm việc tại địa chỉ: http://jsfiddle.net/Y6bhS/1/

$('p').filter(function() { 
    return /some text/i.test($(this).text()); 
}).each(function(){ 
    $(this).text($(this).text().replace(/some text/i, "replace with new text")); 
}); 
+0

Tôi thích cái này và đồng ý với bạn, rằng chúng ta không nên ghi đè jQuery, đó sẽ là một ý tưởng tồi. Nhưng có một câu hỏi, i.test là gì? – Kevin

+0

'.test' là một phương thức trên đối tượng' RegExp' trong JavaScript, chạy biểu thức chính quy đối với đối số (trong trường hợp này là '$ (this) .text()') và trả về true hoặc false dựa trên đối số . Đối tượng 'RegExp' trong trường hợp này thực sự là một chữ (giống như" một số chuỗi "là một đối tượng' String' theo nghĩa đen): '/ some text/i'. Phần 'i' bảo nó không phân biệt chữ hoa chữ thường. –

+0

@ChrissPratt Tôi thấy cảm ơn, tôi chưa học RegExp, tôi đoán đó là lý do tại sao tôi gặp rắc rối với việc tìm kiếm và thay thế, nhưng nó hoạt động, cảm ơn bạn rất nhiều – Kevin

2

Nó thực sự 'thay thế 'đó là trường hợp nhạy cảm. Sử dụng một regex thay vì:

text().replace(/some text/i, "replace with new text"));

DEMOhttp://jsfiddle.net/ka82V/1/

+0

+1 để chỉ ra nguyên nhân gốc rễ của vấn đề. –

+0

@KyleMacey +1 cảm ơn bạn rất nhiều Kyle! Tôi không thể tìm ra điều đó ra – Kevin

2

Bạn có vẻ tốt đẹp. Hãy thử như dưới đây là mục đích của việc sử dụng .filter là chuỗi

DEMO

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

$('p').filter(":containsCI('some text')").text(function() { 
    return $(this).text().replace(/some text/i, "replace with new text"); 
}); 
+0

Điều gì sẽ xảy ra nếu OP không muốn thay thế TẤT CẢ nội dung trong phần tử? –

+0

@KyleMacey Anh ấy có thể viết cùng một mã thay thế bên trong sự trở lại. Cập nhật như vậy là như thế nào trong bài viết gốc của mình. –

1
jQuery.expr[':'].Contains = function(a, i, m) { 
    return new RegExp(m[3], 'ig').test(jQuery(a).text()); // case insensitive replace 
}; 
jQuery.expr[':'].contains = function(a, i, m) { 
    return new RegExp(m[3], 'ig').test(jQuery(a).text()); // case insensitive replace 
}; 

$('p').filter(":contains('some text')").each(function() { 
    $(this).text($(this).text().replace(new RegExp($(this).text(), 'i'),"replace with new text")); 
}); 
Các vấn đề liên quan